[eccodes] 75/106: merge

Alastair McKinstry mckinstry at moszumanska.debian.org
Fri Jul 28 09:05:23 UTC 2017


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

mckinstry pushed a commit to branch debian/master
in repository eccodes.

commit 2d4b9450a8eaa60d6cea23bb2a641cbc6e553961
Author: Alastair McKinstry <mckinstry at debian.org>
Date:   Wed Feb 15 16:22:26 2017 +0000

    merge
---
 CMakeLists.txt                                     |   15 +-
 INSTALL                                            |    2 +-
 NOTICE                                             |    2 +-
 README                                             |    4 +-
 VERSION.cmake                                      |    2 +-
 cmake/FindADSM.cmake                               |    2 +-
 cmake/FindAEC.cmake                                |    2 +-
 cmake/FindAIO.cmake                                |    2 +-
 cmake/FindArmadillo.cmake                          |    2 +-
 cmake/FindCMath.cmake                              |    2 +-
 cmake/FindDl.cmake                                 |    2 +-
 cmake/FindEMOS.cmake                               |    2 +-
 cmake/FindFDB.cmake                                |    2 +-
 cmake/FindFFTW.cmake                               |    2 +-
 cmake/FindGeoTIFF.cmake                            |    2 +-
 cmake/FindHPSS.cmake                               |    2 +-
 cmake/FindLEX.cmake                                |    2 +-
 cmake/FindLibGFortran.cmake                        |    2 +-
 cmake/FindLibIFort.cmake                           |    2 +-
 cmake/FindLustreAPI.cmake                          |   43 +
 cmake/FindMKL.cmake                                |    2 +-
 cmake/FindNDBM.cmake                               |    2 +-
 cmake/FindNetCDF.cmake                             |    2 +-
 cmake/FindNetCDF3.cmake                            |    2 +-
 cmake/FindODB.cmake                                |    2 +-
 cmake/FindOpenCL.cmake                             |    2 +-
 cmake/FindOpenJPEG.cmake                           |    2 +-
 cmake/FindPGIFortran.cmake                         |    2 +-
 cmake/FindPango.cmake                              |    2 +-
 cmake/FindPangoCairo.cmake                         |    2 +-
 cmake/FindREADLINE.cmake                           |    2 +-
 cmake/FindRPCGEN.cmake                             |    2 +-
 cmake/FindRealtime.cmake                           |    2 +-
 cmake/FindSZip.cmake                               |    2 +-
 cmake/FindTrilinos.cmake                           |    2 +-
 cmake/FindViennaCL.cmake                           |    2 +-
 cmake/FindXLFortranLibs.cmake                      |    2 +-
 cmake/FindYACC.cmake                               |    2 +-
 cmake/Findgrib_api.cmake                           |    2 +-
 cmake/Findodb_api.cmake                            |    2 +-
 cmake/Findspot.cmake                               |    2 +-
 cmake/VERSION.cmake                                |    4 +-
 cmake/compiler_flags/Clang_C.cmake                 |    2 +-
 cmake/compiler_flags/Clang_CXX.cmake               |    2 +-
 cmake/compiler_flags/Cray_C.cmake                  |    2 +-
 cmake/compiler_flags/Cray_CXX.cmake                |    2 +-
 cmake/compiler_flags/Cray_Fortran.cmake            |    2 +-
 cmake/compiler_flags/GNU_C.cmake                   |    2 +-
 cmake/compiler_flags/GNU_CXX.cmake                 |    2 +-
 cmake/compiler_flags/GNU_Fortran.cmake             |    2 +-
 cmake/compiler_flags/Intel_C.cmake                 |    2 +-
 cmake/compiler_flags/Intel_CXX.cmake               |    2 +-
 cmake/compiler_flags/Intel_Fortran.cmake           |    2 +-
 cmake/compiler_flags/PGI_C.cmake                   |    2 +-
 cmake/compiler_flags/PGI_CXX.cmake                 |    2 +-
 cmake/compiler_flags/PGI_Fortran.cmake             |    2 +-
 cmake/ecbuild-config-version.cmake                 |    2 +-
 cmake/ecbuild-config.cmake                         |    6 +-
 cmake/ecbuild_add_c_flags.cmake                    |    2 +-
 cmake/ecbuild_add_cxx11_flags.cmake                |    2 +-
 cmake/ecbuild_add_cxx_flags.cmake                  |    2 +-
 cmake/ecbuild_add_executable.cmake                 |   70 +-
 cmake/ecbuild_add_extra_search_paths.cmake         |    2 +-
 cmake/ecbuild_add_fortran_flags.cmake              |    2 +-
 cmake/ecbuild_add_library.cmake                    |   80 +-
 cmake/ecbuild_add_option.cmake                     |   71 +-
 cmake/ecbuild_add_persistent.cmake                 |    2 +-
 cmake/ecbuild_add_resources.cmake                  |    2 +-
 cmake/ecbuild_add_test.cmake                       |    2 +-
 cmake/ecbuild_append_to_rpath.cmake                |    2 +-
 cmake/ecbuild_bundle.cmake                         |   21 +-
 cmake/ecbuild_cache.cmake                          |    2 +-
 cmake/ecbuild_check_c_source_return.cmake          |    2 +-
 cmake/ecbuild_check_compiler.cmake                 |    2 +-
 cmake/ecbuild_check_cxx11.cmake                    |    2 +-
 cmake/ecbuild_check_cxx_source_return.cmake        |    2 +-
 cmake/ecbuild_check_fortran.cmake                  |    2 +-
 cmake/ecbuild_check_fortran_source_return.cmake    |    2 +-
 cmake/ecbuild_check_functions.cmake                |    2 +-
 cmake/ecbuild_check_os.cmake                       |  335 ++-
 cmake/ecbuild_compiler_flags.cmake                 |    8 +-
 cmake/ecbuild_config.h.in                          |    2 +-
 cmake/ecbuild_declare_project.cmake                |    2 +-
 cmake/ecbuild_define_build_types.cmake             |    2 +-
 cmake/ecbuild_define_libs_and_execs_target.cmake   |    2 +-
 cmake/ecbuild_define_links_target.cmake            |    2 +-
 cmake/ecbuild_define_options.cmake                 |    2 +-
 cmake/ecbuild_define_paths.cmake                   |    2 +-
 cmake/ecbuild_dont_pack.cmake                      |    2 +-
 cmake/ecbuild_download_resource.cmake              |   34 +-
 cmake/ecbuild_echo_targets.cmake                   |    2 +-
 cmake/ecbuild_enable_fortran.cmake                 |   10 +-
 cmake/ecbuild_features.cmake                       |   43 +-
 cmake/ecbuild_find_fortranlibs.cmake               |    2 +-
 cmake/ecbuild_find_lexyacc.cmake                   |    2 +-
 cmake/ecbuild_find_mpi.cmake                       |    2 +-
 cmake/ecbuild_find_omp.cmake                       |    2 +-
 cmake/ecbuild_find_package.cmake                   |   81 +-
 cmake/ecbuild_find_perl.cmake                      |    2 +-
 cmake/ecbuild_find_python.cmake                    |   55 +-
 cmake/ecbuild_generate_config_headers.cmake        |    2 +-
 cmake/ecbuild_generate_fortran_interfaces.cmake    |    2 +-
 cmake/ecbuild_generate_rpc.cmake                   |    2 +-
 cmake/ecbuild_generate_yy.cmake                    |    2 +-
 cmake/ecbuild_get_cxx11_flags.cmake                |    2 +-
 cmake/ecbuild_get_date.cmake                       |    2 +-
 cmake/ecbuild_get_resources.cmake                  |    2 +-
 cmake/ecbuild_get_test_data.cmake                  |   21 +-
 cmake/ecbuild_git.cmake                            |    2 +-
 cmake/ecbuild_install_project.cmake                |   37 +-
 cmake/ecbuild_list_add_pattern.cmake               |    2 +-
 cmake/ecbuild_list_exclude_pattern.cmake           |    2 +-
 cmake/ecbuild_list_extra_search_paths.cmake        |    2 +-
 cmake/ecbuild_list_macros.cmake                    |    2 +-
 cmake/ecbuild_log.cmake                            |   46 +-
 cmake/ecbuild_pkgconfig.cmake                      |    2 +-
 cmake/ecbuild_policies.cmake                       |    2 +-
 cmake/ecbuild_print_summary.cmake                  |   18 +-
 cmake/ecbuild_project_files.cmake                  |    2 +-
 cmake/ecbuild_remove_fortran_flags.cmake           |    2 +-
 cmake/ecbuild_requires_macro_version.cmake         |    2 +-
 cmake/ecbuild_separate_sources.cmake               |   26 +-
 cmake/ecbuild_source_flags.cmake                   |    2 +-
 cmake/ecbuild_system.cmake                         |   14 +-
 cmake/ecbuild_target_flags.cmake                   |    2 +-
 cmake/ecbuild_use_package.cmake                    |   57 +-
 cmake/ecbuild_version.h.in                         |    2 +-
 cmake/ecbuild_warn_unused_files.cmake              |    2 +-
 cmake/gen_source_flags.py                          |    2 +-
 cmake/include/ecbuild/boost_test_framework.h       |    2 +-
 cmake/sg.pl                                        |    2 +-
 data/CMakeLists.txt                                |    3 -
 data/bufr/CMakeLists.txt                           |    3 -
 data/bufr/bufr_data_files.txt                      |    1 +
 data/grib_data_files.txt                           |    2 +
 data/gts/CMakeLists.txt                            |    4 -
 data/metar/CMakeLists.txt                          |    4 -
 data/tigge/CMakeLists.txt                          |    4 -
 definitions/Makefile.am                            |  606 +++++
 definitions/boot.def                               |    2 +-
 definitions/budg/boot.def                          |    2 +-
 definitions/budg/mars_labeling.def                 |    2 +-
 definitions/budg/section.1.def                     |    2 +-
 definitions/budg/section.4.def                     |    2 +-
 definitions/bufr/boot.def                          |    2 +-
 definitions/bufr/boot_edition_0.def                |    2 +-
 definitions/bufr/boot_edition_1.def                |    2 +-
 definitions/bufr/boot_edition_2.def                |    2 +-
 definitions/bufr/boot_edition_3.def                |    2 +-
 definitions/bufr/boot_edition_4.def                |    2 +-
 definitions/bufr/old_section.1.def                 |    2 +-
 definitions/bufr/section.0.def                     |    2 +-
 definitions/bufr/section.1.1.def                   |    2 +-
 definitions/bufr/section.1.2.def                   |    2 +-
 definitions/bufr/section.1.3.def                   |    2 +-
 definitions/bufr/section.1.4.def                   |    2 +-
 definitions/bufr/section.2.def                     |    2 +-
 definitions/bufr/section.3.def                     |    2 +-
 definitions/bufr/section.4.def                     |   12 +-
 definitions/bufr/section.5.def                     |    2 +-
 .../bufr/tables/0/wmo/27/codetables/1003.table     |    8 +
 .../bufr/tables/0/wmo/27/codetables/10063.table    |   10 +
 .../bufr/tables/0/wmo/27/codetables/10064.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/1007.table     |  200 ++
 .../bufr/tables/0/wmo/27/codetables/1024.table     |    9 +
 .../bufr/tables/0/wmo/27/codetables/1028.table     |    7 +
 .../bufr/tables/0/wmo/27/codetables/1029.table     |    8 +
 .../bufr/tables/0/wmo/27/codetables/1033.table     |  234 ++
 .../bufr/tables/0/wmo/27/codetables/1034.table     |  100 +
 .../bufr/tables/0/wmo/27/codetables/1036.table     |   38 +
 .../bufr/tables/0/wmo/27/codetables/1038.table     |    7 +
 .../bufr/tables/0/wmo/27/codetables/1052.table     |    4 +
 .../bufr/tables/0/wmo/27/codetables/1090.table     |    5 +
 .../bufr/tables/0/wmo/27/codetables/1092.table     |    5 +
 .../bufr/tables/0/wmo/27/codetables/1101.table     |  202 ++
 .../bufr/tables/0/wmo/27/codetables/11030.table    |   25 +
 .../bufr/tables/0/wmo/27/codetables/11031.table    |   16 +
 .../bufr/tables/0/wmo/27/codetables/11037.table    |   30 +
 .../bufr/tables/0/wmo/27/codetables/11038.table    |   17 +
 .../bufr/tables/0/wmo/27/codetables/11039.table    |   17 +
 .../bufr/tables/0/wmo/27/codetables/1150.table     |    6 +
 .../bufr/tables/0/wmo/27/codetables/1151.table     |    3 +
 .../bufr/tables/0/wmo/27/codetables/13038.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/13039.table    |    3 +
 .../bufr/tables/0/wmo/27/codetables/13040.table    |    8 +
 .../bufr/tables/0/wmo/27/codetables/13041.table    |   10 +
 .../bufr/tables/0/wmo/27/codetables/13051.table    |    8 +
 .../bufr/tables/0/wmo/27/codetables/13056.table    |   11 +
 .../bufr/tables/0/wmo/27/codetables/13057.table    |   11 +
 .../bufr/tables/0/wmo/27/codetables/15025.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/19001.table    |    7 +
 .../bufr/tables/0/wmo/27/codetables/19008.table    |    5 +
 .../bufr/tables/0/wmo/27/codetables/19010.table    |    3 +
 .../bufr/tables/0/wmo/27/codetables/19100.table    |    9 +
 .../bufr/tables/0/wmo/27/codetables/19101.table    |   10 +
 .../bufr/tables/0/wmo/27/codetables/19102.table    |    8 +
 .../bufr/tables/0/wmo/27/codetables/19103.table    |   12 +
 .../bufr/tables/0/wmo/27/codetables/19104.table    |   12 +
 .../bufr/tables/0/wmo/27/codetables/19105.table    |   10 +
 .../bufr/tables/0/wmo/27/codetables/19107.table    |   11 +
 .../bufr/tables/0/wmo/27/codetables/19108.table    |    8 +
 .../bufr/tables/0/wmo/27/codetables/19109.table    |   12 +
 .../bufr/tables/0/wmo/27/codetables/19110.table    |    8 +
 .../bufr/tables/0/wmo/27/codetables/19113.table    |    8 +
 .../bufr/tables/0/wmo/27/codetables/19117.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/19119.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/20003.table    |  266 ++
 .../bufr/tables/0/wmo/27/codetables/20004.table    |   21 +
 .../bufr/tables/0/wmo/27/codetables/20005.table    |   21 +
 .../bufr/tables/0/wmo/27/codetables/20006.table    |    5 +
 .../bufr/tables/0/wmo/27/codetables/20008.table    |   19 +
 .../bufr/tables/0/wmo/27/codetables/20009.table    |    6 +
 .../bufr/tables/0/wmo/27/codetables/2001.table     |    4 +
 .../bufr/tables/0/wmo/27/codetables/20011.table    |   16 +
 .../bufr/tables/0/wmo/27/codetables/20012.table    |   48 +
 .../bufr/tables/0/wmo/27/codetables/20017.table    |   11 +
 .../bufr/tables/0/wmo/27/codetables/20018.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/2002.table     |    3 +
 .../bufr/tables/0/wmo/27/codetables/20021.table    |   23 +
 .../bufr/tables/0/wmo/27/codetables/20022.table    |    7 +
 .../bufr/tables/0/wmo/27/codetables/20023.table    |   14 +
 .../bufr/tables/0/wmo/27/codetables/20024.table    |    8 +
 .../bufr/tables/0/wmo/27/codetables/20025.table    |   13 +
 .../bufr/tables/0/wmo/27/codetables/20026.table    |   16 +
 .../bufr/tables/0/wmo/27/codetables/20027.table    |    8 +
 .../bufr/tables/0/wmo/27/codetables/20028.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/20029.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/2003.table     |   12 +
 .../bufr/tables/0/wmo/27/codetables/20032.table    |    6 +
 .../bufr/tables/0/wmo/27/codetables/20033.table    |    3 +
 .../bufr/tables/0/wmo/27/codetables/20034.table    |   12 +
 .../bufr/tables/0/wmo/27/codetables/20035.table    |   12 +
 .../bufr/tables/0/wmo/27/codetables/20036.table    |   12 +
 .../bufr/tables/0/wmo/27/codetables/20037.table    |   12 +
 .../bufr/tables/0/wmo/27/codetables/2004.table     |   11 +
 .../bufr/tables/0/wmo/27/codetables/20040.table    |    9 +
 .../bufr/tables/0/wmo/27/codetables/20041.table    |   14 +
 .../bufr/tables/0/wmo/27/codetables/20042.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/20045.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/20048.table    |    5 +
 .../bufr/tables/0/wmo/27/codetables/20050.table    |   10 +
 .../bufr/tables/0/wmo/27/codetables/20055.table    |   12 +
 .../bufr/tables/0/wmo/27/codetables/20056.table    |    6 +
 .../bufr/tables/0/wmo/27/codetables/20062.table    |   21 +
 .../bufr/tables/0/wmo/27/codetables/20063.table    |   71 +
 .../bufr/tables/0/wmo/27/codetables/2007.table     |   11 +
 .../bufr/tables/0/wmo/27/codetables/20071.table    |   11 +
 .../bufr/tables/0/wmo/27/codetables/20085.table    |    3 +
 .../bufr/tables/0/wmo/27/codetables/20086.table    |   11 +
 .../bufr/tables/0/wmo/27/codetables/20087.table    |    6 +
 .../bufr/tables/0/wmo/27/codetables/20089.table    |   11 +
 .../bufr/tables/0/wmo/27/codetables/20090.table    |    7 +
 .../bufr/tables/0/wmo/27/codetables/20101.table    |   11 +
 .../bufr/tables/0/wmo/27/codetables/20102.table    |   11 +
 .../bufr/tables/0/wmo/27/codetables/20103.table    |   11 +
 .../bufr/tables/0/wmo/27/codetables/20104.table    |   11 +
 .../bufr/tables/0/wmo/27/codetables/20105.table    |   12 +
 .../bufr/tables/0/wmo/27/codetables/20106.table    |    7 +
 .../bufr/tables/0/wmo/27/codetables/20107.table    |   11 +
 .../bufr/tables/0/wmo/27/codetables/20108.table    |    9 +
 .../bufr/tables/0/wmo/27/codetables/2011.table     |  100 +
 .../bufr/tables/0/wmo/27/codetables/20119.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/20124.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/2013.table     |   11 +
 .../bufr/tables/0/wmo/27/codetables/20136.table    |   44 +
 .../bufr/tables/0/wmo/27/codetables/20137.table    |   11 +
 .../bufr/tables/0/wmo/27/codetables/20138.table    |    9 +
 .../bufr/tables/0/wmo/27/codetables/2014.table     |   51 +
 .../bufr/tables/0/wmo/27/codetables/2015.table     |    7 +
 .../bufr/tables/0/wmo/27/codetables/2016.table     |    4 +
 .../bufr/tables/0/wmo/27/codetables/2017.table     |    6 +
 .../bufr/tables/0/wmo/27/codetables/2019.table     |  331 +++
 .../bufr/tables/0/wmo/27/codetables/2020.table     |   31 +
 .../bufr/tables/0/wmo/27/codetables/2021.table     |    8 +
 .../bufr/tables/0/wmo/27/codetables/2022.table     |    5 +
 .../bufr/tables/0/wmo/27/codetables/2023.table     |   11 +
 .../bufr/tables/0/wmo/27/codetables/2024.table     |    4 +
 .../bufr/tables/0/wmo/27/codetables/2025.table     |   16 +
 .../bufr/tables/0/wmo/27/codetables/2030.table     |    8 +
 .../bufr/tables/0/wmo/27/codetables/2031.table     |   21 +
 .../bufr/tables/0/wmo/27/codetables/2032.table     |    4 +
 .../bufr/tables/0/wmo/27/codetables/2033.table     |    5 +
 .../bufr/tables/0/wmo/27/codetables/2034.table     |    7 +
 .../bufr/tables/0/wmo/27/codetables/2036.table     |    4 +
 .../bufr/tables/0/wmo/27/codetables/2037.table     |    8 +
 .../bufr/tables/0/wmo/27/codetables/2038.table     |   16 +
 .../bufr/tables/0/wmo/27/codetables/2039.table     |    5 +
 .../bufr/tables/0/wmo/27/codetables/2040.table     |    8 +
 .../bufr/tables/0/wmo/27/codetables/2041.table     |    6 +
 .../bufr/tables/0/wmo/27/codetables/2042.table     |    4 +
 .../bufr/tables/0/wmo/27/codetables/2044.table     |    6 +
 .../bufr/tables/0/wmo/27/codetables/2045.table     |    5 +
 .../bufr/tables/0/wmo/27/codetables/2046.table     |    4 +
 .../bufr/tables/0/wmo/27/codetables/2047.table     |    9 +
 .../bufr/tables/0/wmo/27/codetables/2048.table     |   14 +
 .../bufr/tables/0/wmo/27/codetables/2049.table     |    4 +
 .../bufr/tables/0/wmo/27/codetables/2050.table     |   19 +
 .../bufr/tables/0/wmo/27/codetables/2051.table     |    5 +
 .../bufr/tables/0/wmo/27/codetables/2052.table     |    5 +
 .../bufr/tables/0/wmo/27/codetables/2053.table     |    5 +
 .../bufr/tables/0/wmo/27/codetables/2054.table     |    6 +
 .../bufr/tables/0/wmo/27/codetables/2055.table     |   10 +
 .../bufr/tables/0/wmo/27/codetables/2056.table     |    6 +
 .../bufr/tables/0/wmo/27/codetables/2057.table     |    7 +
 .../bufr/tables/0/wmo/27/codetables/2058.table     |    5 +
 .../bufr/tables/0/wmo/27/codetables/2059.table     |    5 +
 .../bufr/tables/0/wmo/27/codetables/2060.table     |    7 +
 .../bufr/tables/0/wmo/27/codetables/2061.table     |    3 +
 .../bufr/tables/0/wmo/27/codetables/2062.table     |    7 +
 .../bufr/tables/0/wmo/27/codetables/2064.table     |    4 +
 .../bufr/tables/0/wmo/27/codetables/2066.table     |    9 +
 .../bufr/tables/0/wmo/27/codetables/2070.table     |   13 +
 .../bufr/tables/0/wmo/27/codetables/2080.table     |    7 +
 .../bufr/tables/0/wmo/27/codetables/2081.table     |   11 +
 .../bufr/tables/0/wmo/27/codetables/2083.table     |    7 +
 .../bufr/tables/0/wmo/27/codetables/2084.table     |    5 +
 .../bufr/tables/0/wmo/27/codetables/2095.table     |    7 +
 .../bufr/tables/0/wmo/27/codetables/2096.table     |    9 +
 .../bufr/tables/0/wmo/27/codetables/2097.table     |   26 +
 .../bufr/tables/0/wmo/27/codetables/2099.table     |    5 +
 .../bufr/tables/0/wmo/27/codetables/2101.table     |   10 +
 .../bufr/tables/0/wmo/27/codetables/2103.table     |    1 +
 .../bufr/tables/0/wmo/27/codetables/2104.table     |    9 +
 .../bufr/tables/0/wmo/27/codetables/21066.table    |   11 +
 .../bufr/tables/0/wmo/27/codetables/21067.table    |   12 +
 .../bufr/tables/0/wmo/27/codetables/21068.table    |    7 +
 .../bufr/tables/0/wmo/27/codetables/21069.table    |    9 +
 .../bufr/tables/0/wmo/27/codetables/21070.table    |   22 +
 .../bufr/tables/0/wmo/27/codetables/21072.table    |    3 +
 .../bufr/tables/0/wmo/27/codetables/21073.table    |    8 +
 .../bufr/tables/0/wmo/27/codetables/21076.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/21109.table    |    7 +
 .../bufr/tables/0/wmo/27/codetables/21115.table    |   10 +
 .../bufr/tables/0/wmo/27/codetables/21116.table    |   16 +
 .../bufr/tables/0/wmo/27/codetables/21119.table    |   14 +
 .../bufr/tables/0/wmo/27/codetables/21144.table    |    1 +
 .../bufr/tables/0/wmo/27/codetables/21148.table    |    2 +
 .../bufr/tables/0/wmo/27/codetables/2115.table     |    7 +
 .../bufr/tables/0/wmo/27/codetables/21150.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/21155.table    |   16 +
 .../bufr/tables/0/wmo/27/codetables/21158.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/21159.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/21169.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/2119.table     |    8 +
 .../bufr/tables/0/wmo/27/codetables/2131.table     |    1 +
 .../bufr/tables/0/wmo/27/codetables/2137.table     |    4 +
 .../bufr/tables/0/wmo/27/codetables/2138.table     |    3 +
 .../bufr/tables/0/wmo/27/codetables/2139.table     |    3 +
 .../bufr/tables/0/wmo/27/codetables/2143.table     |   21 +
 .../bufr/tables/0/wmo/27/codetables/2144.table     |    8 +
 .../bufr/tables/0/wmo/27/codetables/2145.table     |    9 +
 .../bufr/tables/0/wmo/27/codetables/2146.table     |   11 +
 .../bufr/tables/0/wmo/27/codetables/2147.table     |   11 +
 .../bufr/tables/0/wmo/27/codetables/2148.table     |   12 +
 .../bufr/tables/0/wmo/27/codetables/2149.table     |   38 +
 .../bufr/tables/0/wmo/27/codetables/2150.table     |   55 +
 .../bufr/tables/0/wmo/27/codetables/2151.table     |   11 +
 .../bufr/tables/0/wmo/27/codetables/2152.table     |   13 +
 .../bufr/tables/0/wmo/27/codetables/2158.table     |    8 +
 .../bufr/tables/0/wmo/27/codetables/2159.table     |    7 +
 .../bufr/tables/0/wmo/27/codetables/2160.table     |   11 +
 .../bufr/tables/0/wmo/27/codetables/2163.table     |   16 +
 .../bufr/tables/0/wmo/27/codetables/2164.table     |    4 +
 .../bufr/tables/0/wmo/27/codetables/2165.table     |    7 +
 .../bufr/tables/0/wmo/27/codetables/2166.table     |    6 +
 .../bufr/tables/0/wmo/27/codetables/2167.table     |    4 +
 .../bufr/tables/0/wmo/27/codetables/2169.table     |    5 +
 .../bufr/tables/0/wmo/27/codetables/2170.table     |    5 +
 .../bufr/tables/0/wmo/27/codetables/2172.table     |    4 +
 .../bufr/tables/0/wmo/27/codetables/2175.table     |    9 +
 .../bufr/tables/0/wmo/27/codetables/2176.table     |    6 +
 .../bufr/tables/0/wmo/27/codetables/2177.table     |    6 +
 .../bufr/tables/0/wmo/27/codetables/2178.table     |    5 +
 .../bufr/tables/0/wmo/27/codetables/2179.table     |    6 +
 .../bufr/tables/0/wmo/27/codetables/2180.table     |    8 +
 .../bufr/tables/0/wmo/27/codetables/2181.table     |    5 +
 .../bufr/tables/0/wmo/27/codetables/2182.table     |    7 +
 .../bufr/tables/0/wmo/27/codetables/2183.table     |    9 +
 .../bufr/tables/0/wmo/27/codetables/2184.table     |    9 +
 .../bufr/tables/0/wmo/27/codetables/2185.table     |    7 +
 .../bufr/tables/0/wmo/27/codetables/2186.table     |   23 +
 .../bufr/tables/0/wmo/27/codetables/2187.table     |   11 +
 .../bufr/tables/0/wmo/27/codetables/2188.table     |   10 +
 .../bufr/tables/0/wmo/27/codetables/2189.table     |    4 +
 .../bufr/tables/0/wmo/27/codetables/2191.table     |    4 +
 .../bufr/tables/0/wmo/27/codetables/22056.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/22060.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/22061.table    |   11 +
 .../bufr/tables/0/wmo/27/codetables/22067.table    |  101 +
 .../bufr/tables/0/wmo/27/codetables/22068.table    |   43 +
 .../bufr/tables/0/wmo/27/codetables/22120.table    |   13 +
 .../bufr/tables/0/wmo/27/codetables/22121.table    |    9 +
 .../bufr/tables/0/wmo/27/codetables/22122.table    |    8 +
 .../bufr/tables/0/wmo/27/codetables/22123.table    |    9 +
 .../bufr/tables/0/wmo/27/codetables/22178.table    |   12 +
 .../bufr/tables/0/wmo/27/codetables/23001.table    |    5 +
 .../bufr/tables/0/wmo/27/codetables/23002.table    |   16 +
 .../bufr/tables/0/wmo/27/codetables/23003.table    |    8 +
 .../bufr/tables/0/wmo/27/codetables/23004.table    |    6 +
 .../bufr/tables/0/wmo/27/codetables/23005.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/23006.table    |    8 +
 .../bufr/tables/0/wmo/27/codetables/23007.table    |    5 +
 .../bufr/tables/0/wmo/27/codetables/23008.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/23009.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/23016.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/23018.table    |    6 +
 .../bufr/tables/0/wmo/27/codetables/23031.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/23032.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/24003.table    |    5 +
 .../bufr/tables/0/wmo/27/codetables/25004.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/25005.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/25006.table    |    5 +
 .../bufr/tables/0/wmo/27/codetables/25009.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/25010.table    |    8 +
 .../bufr/tables/0/wmo/27/codetables/25011.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/25012.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/25013.table    |    1 +
 .../bufr/tables/0/wmo/27/codetables/25015.table    |    1 +
 .../bufr/tables/0/wmo/27/codetables/25017.table    |    1 +
 .../bufr/tables/0/wmo/27/codetables/25020.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/25021.table    |    5 +
 .../bufr/tables/0/wmo/27/codetables/25022.table    |    8 +
 .../bufr/tables/0/wmo/27/codetables/25023.table    |    8 +
 .../bufr/tables/0/wmo/27/codetables/25024.table    |   13 +
 .../bufr/tables/0/wmo/27/codetables/25029.table    |    5 +
 .../bufr/tables/0/wmo/27/codetables/25030.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/25031.table    |    6 +
 .../bufr/tables/0/wmo/27/codetables/25032.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/25033.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/25034.table    |    3 +
 .../bufr/tables/0/wmo/27/codetables/25035.table    |    8 +
 .../bufr/tables/0/wmo/27/codetables/25036.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/25040.table    |   10 +
 .../bufr/tables/0/wmo/27/codetables/25041.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/25042.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/25053.table    |    6 +
 .../bufr/tables/0/wmo/27/codetables/25063.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/25069.table    |    7 +
 .../bufr/tables/0/wmo/27/codetables/25086.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/25090.table    |   11 +
 .../bufr/tables/0/wmo/27/codetables/25093.table    |    3 +
 .../bufr/tables/0/wmo/27/codetables/25095.table    |    1 +
 .../bufr/tables/0/wmo/27/codetables/25096.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/25097.table    |   11 +
 .../bufr/tables/0/wmo/27/codetables/25098.table    |    8 +
 .../bufr/tables/0/wmo/27/codetables/25099.table    |    6 +
 .../bufr/tables/0/wmo/27/codetables/25110.table    |    6 +
 .../bufr/tables/0/wmo/27/codetables/25112.table    |    5 +
 .../bufr/tables/0/wmo/27/codetables/25113.table    |    3 +
 .../bufr/tables/0/wmo/27/codetables/25120.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/25122.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/25123.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/25124.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/25150.table    |    3 +
 .../bufr/tables/0/wmo/27/codetables/25174.table    |   13 +
 .../bufr/tables/0/wmo/27/codetables/25181.table    |    3 +
 .../bufr/tables/0/wmo/27/codetables/25182.table    |    3 +
 .../bufr/tables/0/wmo/27/codetables/25184.table    |    3 +
 .../bufr/tables/0/wmo/27/codetables/25185.table    |    2 +
 .../bufr/tables/0/wmo/27/codetables/25187.table    |    3 +
 .../bufr/tables/0/wmo/27/codetables/25188.table    |    6 +
 .../bufr/tables/0/wmo/27/codetables/26010.table    |   25 +
 .../bufr/tables/0/wmo/27/codetables/29001.table    |    8 +
 .../bufr/tables/0/wmo/27/codetables/29002.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/3001.table     |   11 +
 .../bufr/tables/0/wmo/27/codetables/3003.table     |    8 +
 .../bufr/tables/0/wmo/27/codetables/30031.table    |   13 +
 .../bufr/tables/0/wmo/27/codetables/30032.table    |    9 +
 .../bufr/tables/0/wmo/27/codetables/3004.table     |   11 +
 .../bufr/tables/0/wmo/27/codetables/3008.table     |    4 +
 .../bufr/tables/0/wmo/27/codetables/3010.table     |   12 +
 .../bufr/tables/0/wmo/27/codetables/3011.table     |    4 +
 .../bufr/tables/0/wmo/27/codetables/3012.table     |    3 +
 .../bufr/tables/0/wmo/27/codetables/3016.table     |    9 +
 .../bufr/tables/0/wmo/27/codetables/3017.table     |    5 +
 .../bufr/tables/0/wmo/27/codetables/3018.table     |   22 +
 .../bufr/tables/0/wmo/27/codetables/3019.table     |    8 +
 .../bufr/tables/0/wmo/27/codetables/3020.table     |    5 +
 .../bufr/tables/0/wmo/27/codetables/3021.table     |    4 +
 .../bufr/tables/0/wmo/27/codetables/3022.table     |    4 +
 .../bufr/tables/0/wmo/27/codetables/3023.table     |    8 +
 .../bufr/tables/0/wmo/27/codetables/31021.table    |    8 +
 .../bufr/tables/0/wmo/27/codetables/31031.table    |    1 +
 .../bufr/tables/0/wmo/27/codetables/33002.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/33003.table    |    5 +
 .../bufr/tables/0/wmo/27/codetables/33005.table    |   23 +
 .../bufr/tables/0/wmo/27/codetables/33006.table    |    5 +
 .../bufr/tables/0/wmo/27/codetables/33015.table    |   16 +
 .../bufr/tables/0/wmo/27/codetables/33020.table    |    8 +
 .../bufr/tables/0/wmo/27/codetables/33021.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/33022.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/33023.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/33024.table    |   10 +
 .../bufr/tables/0/wmo/27/codetables/33025.table    |    5 +
 .../bufr/tables/0/wmo/27/codetables/33026.table    |   17 +
 .../bufr/tables/0/wmo/27/codetables/33027.table    |    6 +
 .../bufr/tables/0/wmo/27/codetables/33028.table    |    5 +
 .../bufr/tables/0/wmo/27/codetables/33030.table    |    7 +
 .../bufr/tables/0/wmo/27/codetables/33031.table    |   21 +
 .../bufr/tables/0/wmo/27/codetables/33032.table    |    7 +
 .../bufr/tables/0/wmo/27/codetables/33033.table    |    3 +
 .../bufr/tables/0/wmo/27/codetables/33035.table    |   10 +
 .../bufr/tables/0/wmo/27/codetables/33037.table    |   19 +
 .../bufr/tables/0/wmo/27/codetables/33038.table    |    9 +
 .../bufr/tables/0/wmo/27/codetables/33039.table    |    9 +
 .../bufr/tables/0/wmo/27/codetables/33041.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/33042.table    |    5 +
 .../bufr/tables/0/wmo/27/codetables/33043.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/33044.table    |   14 +
 .../bufr/tables/0/wmo/27/codetables/33047.table    |   27 +
 .../bufr/tables/0/wmo/27/codetables/33048.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/33049.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/33050.table    |    9 +
 .../bufr/tables/0/wmo/27/codetables/33060.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/33070.table    |   14 +
 .../bufr/tables/0/wmo/27/codetables/33071.table    |   10 +
 .../bufr/tables/0/wmo/27/codetables/33072.table    |   18 +
 .../bufr/tables/0/wmo/27/codetables/33075.table    |    5 +
 .../bufr/tables/0/wmo/27/codetables/33076.table    |    2 +
 .../bufr/tables/0/wmo/27/codetables/33077.table    |   12 +
 .../bufr/tables/0/wmo/27/codetables/33078.table    |    5 +
 .../bufr/tables/0/wmo/27/codetables/33079.table    |   10 +
 .../bufr/tables/0/wmo/27/codetables/33080.table    |   13 +
 .../bufr/tables/0/wmo/27/codetables/33081.table    |    9 +
 .../bufr/tables/0/wmo/27/codetables/33082.table    |   10 +
 .../bufr/tables/0/wmo/27/codetables/33083.table    |   10 +
 .../bufr/tables/0/wmo/27/codetables/33084.table    |   10 +
 .../bufr/tables/0/wmo/27/codetables/33085.table    |   14 +
 .../bufr/tables/0/wmo/27/codetables/33086.table    |    5 +
 .../bufr/tables/0/wmo/27/codetables/33087.table    |   10 +
 .../bufr/tables/0/wmo/27/codetables/33088.table    |   12 +
 .../bufr/tables/0/wmo/27/codetables/35000.table    |    1 +
 .../bufr/tables/0/wmo/27/codetables/35001.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/35030.table    |   10 +
 .../bufr/tables/0/wmo/27/codetables/35031.table    |   20 +
 .../bufr/tables/0/wmo/27/codetables/35032.table    |   10 +
 .../bufr/tables/0/wmo/27/codetables/35033.table    |   12 +
 .../bufr/tables/0/wmo/27/codetables/35034.table    |    7 +
 .../bufr/tables/0/wmo/27/codetables/35035.table    |   20 +
 .../bufr/tables/0/wmo/27/codetables/40005.table    |    5 +
 .../bufr/tables/0/wmo/27/codetables/40006.table    |    8 +
 .../bufr/tables/0/wmo/27/codetables/40011.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/40012.table    |    3 +
 .../bufr/tables/0/wmo/27/codetables/40013.table    |    5 +
 .../bufr/tables/0/wmo/27/codetables/40020.table    |   16 +
 .../bufr/tables/0/wmo/27/codetables/40023.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/40024.table    |    5 +
 .../bufr/tables/0/wmo/27/codetables/40025.table    |    4 +
 .../bufr/tables/0/wmo/27/codetables/40028.table    |   16 +
 .../bufr/tables/0/wmo/27/codetables/40036.table    |    3 +
 .../bufr/tables/0/wmo/27/codetables/4059.table     |    5 +
 .../bufr/tables/0/wmo/27/codetables/4080.table     |    6 +
 .../bufr/tables/0/wmo/27/codetables/42004.table    |    3 +
 .../bufr/tables/0/wmo/27/codetables/5069.table     |    4 +
 .../bufr/tables/0/wmo/27/codetables/8001.table     |    6 +
 .../bufr/tables/0/wmo/27/codetables/8002.table     |   19 +
 .../bufr/tables/0/wmo/27/codetables/8003.table     |   12 +
 .../bufr/tables/0/wmo/27/codetables/8004.table     |    6 +
 .../bufr/tables/0/wmo/27/codetables/8005.table     |    7 +
 .../bufr/tables/0/wmo/27/codetables/8006.table     |    8 +
 .../bufr/tables/0/wmo/27/codetables/8007.table     |    5 +
 .../bufr/tables/0/wmo/27/codetables/8008.table     |    8 +
 .../bufr/tables/0/wmo/27/codetables/8009.table     |   16 +
 .../bufr/tables/0/wmo/27/codetables/8010.table     |   14 +
 .../bufr/tables/0/wmo/27/codetables/8011.table     |   27 +
 .../bufr/tables/0/wmo/27/codetables/8012.table     |    4 +
 .../bufr/tables/0/wmo/27/codetables/8013.table     |    4 +
 .../bufr/tables/0/wmo/27/codetables/8014.table     |   10 +
 .../bufr/tables/0/wmo/27/codetables/8015.table     |    4 +
 .../bufr/tables/0/wmo/27/codetables/8016.table     |    5 +
 .../bufr/tables/0/wmo/27/codetables/8017.table     |    4 +
 .../bufr/tables/0/wmo/27/codetables/8018.table     |    4 +
 .../bufr/tables/0/wmo/27/codetables/8019.table     |    8 +
 .../bufr/tables/0/wmo/27/codetables/8021.table     |   32 +
 .../bufr/tables/0/wmo/27/codetables/8023.table     |   14 +
 .../bufr/tables/0/wmo/27/codetables/8024.table     |   12 +
 .../bufr/tables/0/wmo/27/codetables/8025.table     |    5 +
 .../bufr/tables/0/wmo/27/codetables/8026.table     |    5 +
 .../bufr/tables/0/wmo/27/codetables/8029.table     |   16 +
 .../bufr/tables/0/wmo/27/codetables/8032.table     |    7 +
 .../bufr/tables/0/wmo/27/codetables/8033.table     |    6 +
 .../bufr/tables/0/wmo/27/codetables/8034.table     |   10 +
 .../bufr/tables/0/wmo/27/codetables/8035.table     |    8 +
 .../bufr/tables/0/wmo/27/codetables/8036.table     |    8 +
 .../bufr/tables/0/wmo/27/codetables/8039.table     |    8 +
 .../bufr/tables/0/wmo/27/codetables/8040.table     |   49 +
 .../bufr/tables/0/wmo/27/codetables/8041.table     |   15 +
 .../bufr/tables/0/wmo/27/codetables/8042.table     |   17 +
 .../bufr/tables/0/wmo/27/codetables/8043.table     |   17 +
 .../bufr/tables/0/wmo/27/codetables/8050.table     |   11 +
 .../bufr/tables/0/wmo/27/codetables/8051.table     |    7 +
 .../bufr/tables/0/wmo/27/codetables/8052.table     |   26 +
 .../bufr/tables/0/wmo/27/codetables/8053.table     |    4 +
 .../bufr/tables/0/wmo/27/codetables/8054.table     |    3 +
 .../bufr/tables/0/wmo/27/codetables/8060.table     |    8 +
 .../bufr/tables/0/wmo/27/codetables/8065.table     |    4 +
 .../bufr/tables/0/wmo/27/codetables/8066.table     |    4 +
 .../bufr/tables/0/wmo/27/codetables/8070.table     |    6 +
 .../bufr/tables/0/wmo/27/codetables/8072.table     |    6 +
 .../bufr/tables/0/wmo/27/codetables/8074.table     |    4 +
 .../bufr/tables/0/wmo/27/codetables/8075.table     |    4 +
 .../bufr/tables/0/wmo/27/codetables/8076.table     |    9 +
 .../bufr/tables/0/wmo/27/codetables/8077.table     |    7 +
 .../bufr/tables/0/wmo/27/codetables/8079.table     |    9 +
 .../bufr/tables/0/wmo/27/codetables/8080.table     |   14 +
 .../bufr/tables/0/wmo/27/codetables/8081.table     |    5 +
 .../bufr/tables/0/wmo/27/codetables/8082.table     |    3 +
 .../bufr/tables/0/wmo/27/codetables/8083.table     |    9 +
 .../bufr/tables/0/wmo/27/codetables/8085.table     |    4 +
 .../bufr/tables/0/wmo/27/codetables/8086.table     |    9 +
 .../bufr/tables/0/wmo/27/codetables/8087.table     |    5 +
 .../bufr/tables/0/wmo/27/codetables/8088.table     |    4 +
 .../bufr/tables/0/wmo/27/codetables/8091.table     |   11 +
 definitions/bufr/tables/0/wmo/27/element.table     | 1616 +++++++++++
 definitions/bufr/tables/0/wmo/27/sequence.def      |  963 +++++++
 definitions/check_grib_defs.pl                     |   16 +-
 definitions/common/statistics_grid.def             |    2 +-
 definitions/common/statistics_spectral.def         |    2 +-
 definitions/grib1/2.98.174.table                   |    2 +-
 definitions/grib1/2.98.228.table                   |    4 +-
 definitions/grib1/boot.def                         |    2 +-
 definitions/grib1/data.grid_ieee.def               |    2 +-
 definitions/grib1/data.grid_second_order.def       |    5 +-
 .../data.grid_second_order_constant_width.def      |    5 +-
 .../grib1/data.grid_second_order_general_grib1.def |    5 +-
 .../grib1/data.grid_second_order_row_by_row.def    |    4 +-
 definitions/grib1/data.grid_simple.def             |    4 +-
 definitions/grib1/data.grid_simple_matrix.def      |    5 +-
 definitions/grib1/data.spectral_complex.def        |    5 +-
 definitions/grib1/data.spectral_ieee.def           |    5 +-
 definitions/grib1/data.spectral_simple.def         |    3 +-
 definitions/grib1/gds_not_present_bitmap.def       |    2 +-
 definitions/grib1/grid_21.def                      |    2 +-
 definitions/grib1/grid_22.def                      |    2 +-
 definitions/grib1/grid_23.def                      |    2 +-
 definitions/grib1/grid_24.def                      |    2 +-
 definitions/grib1/grid_25.def                      |    2 +-
 definitions/grib1/grid_26.def                      |    2 +-
 definitions/grib1/grid_61.def                      |    2 +-
 definitions/grib1/grid_62.def                      |    2 +-
 definitions/grib1/grid_63.def                      |    2 +-
 definitions/grib1/grid_64.def                      |    2 +-
 definitions/grib1/grid_definition_0.def            |    2 +-
 definitions/grib1/grid_definition_1.def            |    2 +-
 definitions/grib1/grid_definition_10.def           |    2 +-
 definitions/grib1/grid_definition_13.def           |    2 +-
 definitions/grib1/grid_definition_14.def           |    2 +-
 definitions/grib1/grid_definition_192.78.def       |    2 +-
 definitions/grib1/grid_definition_192.98.def       |    2 +-
 definitions/grib1/grid_definition_193.98.def       |    2 +-
 definitions/grib1/grid_definition_20.def           |    2 +-
 definitions/grib1/grid_definition_24.def           |    2 +-
 definitions/grib1/grid_definition_3.def            |    2 +-
 definitions/grib1/grid_definition_30.def           |    2 +-
 definitions/grib1/grid_definition_34.def           |    2 +-
 definitions/grib1/grid_definition_4.def            |    2 +-
 definitions/grib1/grid_definition_5.def            |    2 +-
 definitions/grib1/grid_definition_50.def           |    2 +-
 definitions/grib1/grid_definition_60.def           |    2 +-
 definitions/grib1/grid_definition_70.def           |    2 +-
 definitions/grib1/grid_definition_8.def            |    2 +-
 definitions/grib1/grid_definition_80.def           |    2 +-
 definitions/grib1/grid_definition_90.def           |    4 +-
 definitions/grib1/grid_definition_gaussian.def     |    2 +-
 definitions/grib1/grid_definition_lambert.def      |    2 +-
 definitions/grib1/grid_definition_latlon.def       |    2 +-
 .../grib1/grid_definition_spherical_harmonics.def  |    2 +-
 definitions/grib1/grid_first_last_resandcomp.def   |    2 +-
 definitions/grib1/grid_rotation.def                |    2 +-
 definitions/grib1/grid_stretching.def              |    2 +-
 definitions/grib1/local.1.def                      |    2 +-
 definitions/grib1/local.214.1.def                  |    2 +-
 definitions/grib1/local.214.244.def                |    2 +-
 definitions/grib1/local.214.245.def                |    2 +-
 definitions/grib1/local.253.def                    |    2 +-
 definitions/grib1/local.254.def                    |    2 +-
 definitions/grib1/local.46.def                     |    2 +-
 definitions/grib1/local.54.def                     |    2 +-
 definitions/grib1/local.7.1.def                    |    2 +-
 definitions/grib1/local.80.def                     |    2 +-
 definitions/grib1/local.98.1.def                   |    2 +-
 definitions/grib1/local.98.10.def                  |    2 +-
 definitions/grib1/local.98.11.def                  |    2 +-
 definitions/grib1/local.98.13.def                  |    2 +-
 definitions/grib1/local.98.14.def                  |    2 +-
 definitions/grib1/local.98.15.def                  |    2 +-
 definitions/grib1/local.98.16.def                  |    2 +-
 definitions/grib1/local.98.17.def                  |    2 +-
 definitions/grib1/local.98.18.def                  |    2 +-
 definitions/grib1/local.98.19.def                  |    2 +-
 definitions/grib1/local.98.190.def                 |    2 +-
 definitions/grib1/local.98.191.def                 |    2 +-
 definitions/grib1/local.98.192.def                 |    2 +-
 definitions/grib1/local.98.2.def                   |    2 +-
 definitions/grib1/local.98.20.def                  |    2 +-
 definitions/grib1/local.98.21.def                  |    2 +-
 definitions/grib1/local.98.218.def                 |    2 +-
 definitions/grib1/local.98.23.def                  |    2 +-
 definitions/grib1/local.98.24.def                  |    2 +-
 definitions/grib1/local.98.25.def                  |    2 +-
 definitions/grib1/local.98.26.def                  |    2 +-
 definitions/grib1/local.98.27.def                  |    2 +-
 definitions/grib1/local.98.28.def                  |    2 +-
 definitions/grib1/local.98.29.def                  |    2 +-
 definitions/grib1/local.98.3.def                   |    2 +-
 definitions/grib1/local.98.30.def                  |    2 +-
 definitions/grib1/local.98.31.def                  |    2 +-
 definitions/grib1/local.98.32.def                  |    2 +-
 definitions/grib1/local.98.33.def                  |    2 +-
 definitions/grib1/local.98.35.def                  |    2 +-
 definitions/grib1/local.98.36.def                  |    2 +-
 definitions/grib1/local.98.37.def                  |    2 +-
 definitions/grib1/local.98.38.def                  |    2 +-
 definitions/grib1/local.98.39.def                  |    2 +-
 definitions/grib1/local.98.4.def                   |    2 +-
 definitions/grib1/local.98.40.def                  |    2 +-
 definitions/grib1/local.98.5.def                   |    2 +-
 definitions/grib1/local.98.50.def                  |    2 +-
 definitions/grib1/local.98.6.def                   |    2 +-
 definitions/grib1/local.98.7.def                   |    2 +-
 definitions/grib1/local.98.8.def                   |    2 +-
 definitions/grib1/local.98.9.def                   |    2 +-
 definitions/grib1/local.98.def                     |    2 +-
 definitions/grib1/localConcepts/ecmf/cfVarName.def |   12 +-
 definitions/grib1/localConcepts/ecmf/name.def      |   20 +-
 definitions/grib1/localConcepts/ecmf/paramId.def   |   10 +-
 definitions/grib1/localConcepts/ecmf/shortName.def |   12 +-
 definitions/grib1/localConcepts/ecmf/units.def     |   10 +-
 definitions/grib1/localConcepts/rjtd/cfVarName.def |  111 +-
 definitions/grib1/localConcepts/rjtd/name.def      |  105 +-
 definitions/grib1/localConcepts/rjtd/paramId.def   |  105 +-
 definitions/grib1/localConcepts/rjtd/shortName.def |  105 +-
 definitions/grib1/localConcepts/rjtd/units.def     |  103 +-
 definitions/grib1/local_no_mars.98.1.def           |    2 +-
 definitions/grib1/local_no_mars.98.24.def          |    2 +-
 definitions/grib1/mars_labeling.23.def             |    2 +-
 definitions/grib1/mars_labeling.4.def              |    2 +-
 definitions/grib1/mars_labeling.def                |    2 +-
 definitions/grib1/predefined_grid.def              |    2 +-
 definitions/grib1/resolution_flags.def             |    2 +-
 definitions/grib1/scanning_mode.def                |    2 +-
 definitions/grib1/section.0.def                    |    2 +-
 definitions/grib1/section.1.def                    |    5 +-
 definitions/grib1/section.2.def                    |    2 +-
 definitions/grib1/section.3.def                    |    2 +-
 definitions/grib1/section.4.def                    |    3 +-
 definitions/grib1/section.5.def                    |    2 +-
 definitions/grib2/boot.def                         |    2 +-
 definitions/grib2/boot_multifield.def              |    2 +-
 definitions/grib2/cfVarName.def                    |   20 +-
 definitions/grib2/local.98.11.def                  |    2 +-
 definitions/grib2/local.98.14.def                  |    2 +-
 definitions/grib2/local.98.15.def                  |    2 +-
 definitions/grib2/local.98.16.def                  |    2 +-
 definitions/grib2/local.98.18.def                  |    2 +-
 definitions/grib2/local.98.192.def                 |    2 +-
 definitions/grib2/local.98.20.def                  |    2 +-
 definitions/grib2/local.98.21.def                  |    2 +-
 definitions/grib2/local.98.24.def                  |    2 +-
 definitions/grib2/local.98.25.def                  |    2 +-
 definitions/grib2/local.98.26.def                  |    2 +-
 definitions/grib2/local.98.28.def                  |    2 +-
 definitions/grib2/local.98.30.def                  |    2 +-
 definitions/grib2/local.98.300.def                 |    2 +-
 definitions/grib2/local.98.36.def                  |    2 +-
 definitions/grib2/local.98.38.def                  |    2 +-
 definitions/grib2/local.98.39.def                  |    2 +-
 definitions/grib2/local.98.7.def                   |    2 +-
 definitions/grib2/local.98.9.def                   |    2 +-
 definitions/grib2/local/edzw/2.0.3.table           |  130 -
 definitions/grib2/local/edzw/3.table               |   51 -
 definitions/grib2/local/edzw/5.table               |   24 -
 .../local/edzw/generatingProcessIdentifier.table   |   86 -
 definitions/grib2/localConcepts/ecmf/cfVarName.def |    8 +-
 definitions/grib2/localConcepts/ecmf/name.def      |   16 +-
 definitions/grib2/localConcepts/ecmf/paramId.def   |    8 +-
 definitions/grib2/localConcepts/ecmf/shortName.def |    8 +-
 definitions/grib2/localConcepts/ecmf/units.def     |    8 +-
 definitions/grib2/mars_labeling.def                |    2 +-
 definitions/grib2/meta.def                         |    2 +-
 definitions/grib2/name.def                         |   22 +-
 definitions/grib2/paramId.def                      |   20 +-
 definitions/grib2/parameters.def                   |    2 +-
 definitions/grib2/products_0.def                   |    2 +-
 definitions/grib2/products_1.def                   |    2 +-
 definitions/grib2/products_2.def                   |    2 +-
 definitions/grib2/products_3.def                   |    2 +-
 definitions/grib2/products_4.def                   |    2 +-
 definitions/grib2/products_5.def                   |    2 +-
 definitions/grib2/products_6.def                   |    2 +-
 definitions/grib2/products_7.def                   |    2 +-
 definitions/grib2/products_8.def                   |    2 +-
 definitions/grib2/products_9.def                   |    2 +-
 definitions/grib2/products_s2s.def                 |    2 +-
 definitions/grib2/products_tigge.def               |    2 +-
 definitions/grib2/products_uerra.def               |    2 +-
 definitions/grib2/rules.def                        |    2 +-
 definitions/grib2/section.0.def                    |    2 +-
 definitions/grib2/section.1.def                    |    2 +-
 definitions/grib2/section.2.def                    |    2 +-
 definitions/grib2/section.3.def                    |    2 +-
 definitions/grib2/section.4.def                    |    2 +-
 definitions/grib2/section.5.def                    |    2 +-
 definitions/grib2/section.6.def                    |    2 +-
 definitions/grib2/section.7.def                    |    2 +-
 definitions/grib2/section.8.def                    |    2 +-
 definitions/grib2/sections.def                     |    2 +-
 definitions/grib2/shortName.def                    |   20 +-
 definitions/grib2/template.1.0.def                 |    2 +-
 definitions/grib2/template.1.1.def                 |    2 +-
 definitions/grib2/template.1.2.def                 |    2 +-
 definitions/grib2/template.1.calendar.def          |    2 +-
 definitions/grib2/template.1.offset.def            |    2 +-
 definitions/grib2/template.3.0.def                 |    2 +-
 definitions/grib2/template.3.1.def                 |    2 +-
 definitions/grib2/template.3.10.def                |    2 +-
 definitions/grib2/template.3.100.def               |    2 +-
 definitions/grib2/template.3.1000.def              |    2 +-
 definitions/grib2/template.3.101.def               |    2 +-
 definitions/grib2/template.3.110.def               |    2 +-
 definitions/grib2/template.3.1100.def              |    2 +-
 definitions/grib2/template.3.12.def                |    2 +-
 definitions/grib2/template.3.120.def               |    2 +-
 definitions/grib2/template.3.1200.def              |    2 +-
 definitions/grib2/template.3.130.def               |    2 +-
 definitions/grib2/template.3.140.def               |    2 +-
 definitions/grib2/template.3.2.def                 |    2 +-
 definitions/grib2/template.3.20.def                |    2 +-
 definitions/grib2/template.3.3.def                 |    2 +-
 definitions/grib2/template.3.30.def                |    2 +-
 definitions/grib2/template.3.31.def                |    2 +-
 definitions/grib2/template.3.4.def                 |    2 +-
 definitions/grib2/template.3.40.def                |    2 +-
 definitions/grib2/template.3.41.def                |    2 +-
 definitions/grib2/template.3.42.def                |    2 +-
 definitions/grib2/template.3.43.def                |    2 +-
 definitions/grib2/template.3.5.def                 |    2 +-
 definitions/grib2/template.3.50.def                |    2 +-
 definitions/grib2/template.3.51.def                |    2 +-
 definitions/grib2/template.3.52.def                |    2 +-
 definitions/grib2/template.3.53.def                |    2 +-
 definitions/grib2/template.3.90.def                |   26 +-
 definitions/grib2/template.3.gaussian.def          |    2 +-
 definitions/grib2/template.3.grid.def              |    2 +-
 definitions/grib2/template.3.latlon.def            |    2 +-
 definitions/grib2/template.3.latlon_vares.def      |    2 +-
 definitions/grib2/template.3.resolution_flags.def  |    2 +-
 definitions/grib2/template.3.rotation.def          |    2 +-
 definitions/grib2/template.3.scanning_mode.def     |    2 +-
 .../grib2/template.3.shape_of_the_earth.def        |   20 +-
 .../grib2/template.3.spherical_harmonics.def       |    2 +-
 definitions/grib2/template.3.stretching.def        |    2 +-
 definitions/grib2/template.4.0.def                 |    2 +-
 definitions/grib2/template.4.1.def                 |    2 +-
 definitions/grib2/template.4.10.def                |    2 +-
 definitions/grib2/template.4.1000.def              |    2 +-
 definitions/grib2/template.4.1001.def              |    2 +-
 definitions/grib2/template.4.1002.def              |    2 +-
 definitions/grib2/template.4.11.def                |    2 +-
 definitions/grib2/template.4.1100.def              |    2 +-
 definitions/grib2/template.4.1101.def              |    2 +-
 definitions/grib2/template.4.12.def                |    2 +-
 definitions/grib2/template.4.13.def                |    2 +-
 definitions/grib2/template.4.14.def                |    2 +-
 definitions/grib2/template.4.15.def                |    2 +-
 definitions/grib2/template.4.2.def                 |    2 +-
 definitions/grib2/template.4.20.def                |    2 +-
 definitions/grib2/template.4.2000.def              |    2 +-
 definitions/grib2/template.4.254.def               |    2 +-
 definitions/grib2/template.4.3.def                 |    2 +-
 definitions/grib2/template.4.30.def                |    2 +-
 definitions/grib2/template.4.31.def                |    2 +-
 definitions/grib2/template.4.311.def               |    2 +-
 definitions/grib2/template.4.32.def                |    2 +-
 definitions/grib2/template.4.33.def                |    2 +-
 definitions/grib2/template.4.34.def                |    2 +-
 definitions/grib2/template.4.4.def                 |    2 +-
 definitions/grib2/template.4.40.def                |    2 +-
 definitions/grib2/template.4.40033.def             |    2 +-
 definitions/grib2/template.4.40034.def             |    2 +-
 definitions/grib2/template.4.41.def                |    2 +-
 definitions/grib2/template.4.42.def                |    2 +-
 definitions/grib2/template.4.43.def                |    2 +-
 definitions/grib2/template.4.44.def                |    2 +-
 definitions/grib2/template.4.45.def                |    2 +-
 definitions/grib2/template.4.46.def                |    2 +-
 definitions/grib2/template.4.47.def                |    2 +-
 definitions/grib2/template.4.48.def                |    2 +-
 definitions/grib2/template.4.49.def                |    2 +-
 definitions/grib2/template.4.5.def                 |    2 +-
 definitions/grib2/template.4.51.def                |    2 +-
 definitions/grib2/template.4.53.def                |    2 +-
 definitions/grib2/template.4.54.def                |    2 +-
 definitions/grib2/template.4.55.def                |    2 +-
 definitions/grib2/template.4.56.def                |    2 +-
 definitions/grib2/template.4.57.def                |    2 +-
 definitions/grib2/template.4.58.def                |   14 +
 definitions/grib2/template.4.59.def                |    2 +-
 definitions/grib2/template.4.6.def                 |    2 +-
 definitions/grib2/template.4.60.def                |    2 +-
 definitions/grib2/template.4.61.def                |    2 +-
 definitions/grib2/template.4.7.def                 |    2 +-
 definitions/grib2/template.4.70.def                |    2 +-
 definitions/grib2/template.4.71.def                |    2 +-
 definitions/grib2/template.4.72.def                |    2 +-
 definitions/grib2/template.4.73.def                |    2 +-
 definitions/grib2/template.4.8.def                 |    2 +-
 definitions/grib2/template.4.9.def                 |    2 +-
 definitions/grib2/template.4.91.def                |    2 +-
 definitions/grib2/template.4.categorical.def       |    2 +-
 definitions/grib2/template.4.circular_cluster.def  |    2 +-
 definitions/grib2/template.4.derived.def           |    2 +-
 definitions/grib2/template.4.eps.def               |    2 +-
 definitions/grib2/template.4.horizontal.def        |    2 +-
 definitions/grib2/template.4.parameter.def         |    2 +-
 definitions/grib2/template.4.parameter_aerosol.def |    2 +-
 .../grib2/template.4.parameter_aerosol_44.def      |    2 +-
 .../grib2/template.4.parameter_aerosol_optical.def |    2 +-
 .../grib2/template.4.parameter_chemical.def        |    2 +-
 .../template.4.parameter_chemical_distribution.def |    2 +-
 .../grib2/template.4.parameter_partition.def       |    2 +-
 .../grib2/template.4.parameter_postproc.def        |    2 +-
 definitions/grib2/template.4.parameter_tile.def    |    2 +-
 definitions/grib2/template.4.percentile.def        |    2 +-
 definitions/grib2/template.4.point_in_time.def     |    2 +-
 definitions/grib2/template.4.probability.def       |    2 +-
 .../grib2/template.4.rectangular_cluster.def       |    2 +-
 definitions/grib2/template.4.statistical.def       |    2 +-
 definitions/grib2/template.5.0.def                 |    2 +-
 definitions/grib2/template.5.1.def                 |    2 +-
 definitions/grib2/template.5.2.def                 |    2 +-
 definitions/grib2/template.5.3.def                 |    2 +-
 definitions/grib2/template.5.4.def                 |    2 +-
 definitions/grib2/template.5.40.def                |    2 +-
 definitions/grib2/template.5.40000.def             |    2 +-
 definitions/grib2/template.5.40010.def             |    2 +-
 definitions/grib2/template.5.41.def                |    2 +-
 definitions/grib2/template.5.42.def                |    2 +-
 definitions/grib2/template.5.50.def                |    2 +-
 definitions/grib2/template.5.50000.def             |    2 +-
 definitions/grib2/template.5.50001.def             |    5 +-
 definitions/grib2/template.5.50002.def             |    5 +-
 definitions/grib2/template.5.51.def                |    2 +-
 definitions/grib2/template.5.6.def                 |    2 +-
 definitions/grib2/template.5.61.def                |    2 +-
 definitions/grib2/template.5.original_values.def   |    2 +-
 definitions/grib2/template.5.packing.def           |    5 +-
 definitions/grib2/template.5.second_order.def      |    2 +-
 definitions/grib2/template.7.0.def                 |    5 +-
 definitions/grib2/template.7.1.def                 |    6 +-
 definitions/grib2/template.7.2.def                 |    2 +-
 definitions/grib2/template.7.3.def                 |    2 +-
 definitions/grib2/template.7.4.def                 |    2 +-
 definitions/grib2/template.7.40.def                |   26 +-
 definitions/grib2/template.7.40000.def             |    2 +-
 definitions/grib2/template.7.40010.def             |    2 +-
 definitions/grib2/template.7.41.def                |    2 +-
 definitions/grib2/template.7.42.def                |    2 +-
 definitions/grib2/template.7.50.def                |    5 +-
 definitions/grib2/template.7.50000.def             |    5 +-
 definitions/grib2/template.7.50001.def             |    4 +-
 definitions/grib2/template.7.50002.def             |    5 +-
 definitions/grib2/template.7.51.def                |    5 +-
 definitions/grib2/template.7.6.def                 |    3 +-
 definitions/grib2/template.7.61.def                |    3 +-
 definitions/grib2/template.7.second_order.def      |    2 +-
 definitions/grib2/units.def                        |   20 +-
 definitions/gts/boot.def                           |    2 +-
 definitions/installDefinitions.sh                  |    2 +-
 definitions/mars/class.table                       |    1 +
 definitions/mars/grib.edmm.fc.def                  |    3 +-
 definitions/mars/grib.ewmm.fc.def                  |    3 +-
 definitions/mars/grib.mnth.fc.def                  |    3 +-
 definitions/mars/grib.wamo.fc.def                  |    3 +-
 definitions/mars/make_type_switch_case.sh          |    2 +-
 definitions/metar/boot.def                         |    2 +-
 definitions/metar/boot.flexible.def                |    2 +-
 definitions/publish_new_parameters.sh              |    2 +-
 definitions/taf/boot.def                           |    2 +-
 definitions/tide/boot.def                          |    2 +-
 definitions/tide/mars_labeling.def                 |    2 +-
 definitions/tide/section.1.def                     |    2 +-
 definitions/tide/section.4.def                     |    2 +-
 definitions/wrap/boot.def                          |    2 +-
 eccodes_config.h.in                                |    6 +-
 examples/C/CMakeLists.txt                          |   28 +-
 examples/C/box.c                                   |    2 +-
 examples/C/bufr_attributes.c                       |    2 +-
 examples/C/bufr_attributes.sh                      |    2 +-
 examples/C/bufr_clone.c                            |    2 +-
 examples/C/bufr_clone.sh                           |    6 +-
 examples/C/bufr_copy_data.c                        |  117 +
 examples/C/bufr_copy_data.sh                       |   67 +
 examples/C/bufr_expanded.c                         |    2 +-
 examples/C/bufr_expanded.sh                        |    2 +-
 examples/C/bufr_get_keys.c                         |    2 +-
 examples/C/bufr_get_keys.sh                        |    2 +-
 examples/C/bufr_keys_iterator.c                    |    2 +-
 examples/C/bufr_keys_iterator.sh                   |    2 +-
 examples/C/bufr_missing.c                          |    2 +-
 examples/C/bufr_missing.sh                         |    2 +-
 examples/C/bufr_pthreads.c                         |   70 +
 examples/C/bufr_pthreads.sh                        |   15 +
 examples/C/bufr_read_header.c                      |    2 +-
 examples/C/bufr_read_header.sh                     |    2 +-
 examples/C/bufr_read_scatterometer.c               |    2 +-
 examples/C/bufr_read_scatterometer.sh              |    2 +-
 examples/C/bufr_read_synop.c                       |    2 +-
 examples/C/bufr_read_synop.sh                      |    2 +-
 examples/C/bufr_read_temp.c                        |    2 +-
 examples/C/bufr_read_temp.sh                       |    2 +-
 examples/C/bufr_set_keys.c                         |    2 +-
 examples/C/bufr_set_keys.sh                        |    6 +-
 examples/C/bufr_subset.c                           |    2 +-
 examples/C/bufr_subset.sh                          |    2 +-
 examples/C/ecmwf_link.sh                           |    2 +-
 examples/C/fieldset.c                              |    2 +-
 examples/C/get_product_kind.c                      |    2 +-
 examples/C/get_product_kind.sh                     |    2 +-
 examples/C/grib_clone.c                            |    2 +-
 examples/C/grib_clone.sh                           |    2 +-
 examples/C/grib_copy_message.c                     |    6 +-
 examples/C/grib_copy_message.sh                    |    2 +-
 examples/C/grib_ensemble_index.c                   |    6 +-
 examples/C/grib_ensemble_index.sh                  |   23 +
 examples/C/grib_get_data.c                         |    2 +-
 examples/C/grib_get_data.sh                        |    2 +-
 examples/C/grib_get_keys.c                         |    6 +-
 examples/C/grib_get_keys.sh                        |    2 +-
 examples/C/grib_index.c                            |   60 +-
 examples/C/grib_iterator.c                         |    4 +-
 examples/C/grib_iterator.sh                        |    2 +-
 examples/C/grib_iterator_bitmap.c                  |    2 +-
 examples/C/grib_keys_iterator.c                    |    2 +-
 examples/C/grib_keys_iterator.sh                   |    2 +-
 examples/C/grib_list.c                             |    2 +-
 examples/C/grib_list.sh                            |    2 +-
 examples/C/grib_multi.c                            |    2 +-
 examples/C/grib_multi.sh                           |    2 +-
 examples/C/grib_multi_write.c                      |    2 +-
 examples/C/grib_multi_write.sh                     |    2 +-
 examples/C/grib_nearest.c                          |    2 +-
 examples/C/grib_precipitation.c                    |    2 +-
 examples/C/grib_precision.c                        |    2 +-
 examples/C/grib_precision.sh                       |    2 +-
 examples/C/grib_print_data.c                       |   18 +-
 examples/C/grib_print_data.sh                      |    2 +-
 examples/C/grib_pthreads.c                         |    9 +-
 examples/C/grib_pthreads.sh                        |    2 +-
 examples/C/grib_set_bitmap.c                       |    2 +-
 examples/C/grib_set_bitmap.sh                      |    4 +-
 examples/C/grib_set_data.c                         |    8 +-
 examples/C/grib_set_data.sh                        |   16 +
 examples/C/grib_set_keys.c                         |    2 +-
 examples/C/grib_set_keys.sh                        |    2 +-
 examples/C/grib_set_pv.c                           |    2 +-
 examples/C/grib_set_pv.sh                          |    2 +-
 examples/C/include.ctest.sh.in                     |    7 +
 examples/C/include.sh                              |    8 +-
 examples/C/large_grib1.c                           |    4 +-
 examples/C/large_grib1.sh                          |    2 +-
 examples/C/mars_param.c                            |    2 +-
 examples/C/multi2.c                                |    2 +-
 examples/C/nc.c                                    |    2 +-
 examples/C/new_sample.c                            |    2 +-
 examples/C/points.c                                |    2 +-
 examples/C/rename.sh                               |    2 +-
 examples/C/run_examples.sh                         |    2 +-
 examples/C/sections_copy.c                         |    2 +-
 examples/C/sections_copy.sh                        |    2 +-
 examples/C/set_missing.c                           |    2 +-
 examples/C/set_missing.sh                          |    2 +-
 examples/C/values_check.c                          |    2 +-
 examples/F90/CMakeLists.txt                        |   13 +-
 examples/F90/Makefile.am                           |    4 +-
 examples/F90/bufr_attributes.f90                   |   63 +-
 examples/F90/bufr_attributes.sh                    |    2 +-
 examples/F90/bufr_clone.f90                        |   21 +-
 examples/F90/bufr_clone.sh                         |    4 +-
 examples/F90/bufr_copy_data.f90                    |   87 +
 examples/F90/bufr_copy_data.sh                     |   67 +
 examples/F90/bufr_copy_keys.f90                    |   34 +
 examples/F90/bufr_copy_keys.sh                     |   25 +
 examples/F90/bufr_copy_message.f90                 |    6 +-
 examples/F90/bufr_copy_message.sh                  |    4 +-
 examples/F90/bufr_expanded.f90                     |   21 +-
 examples/F90/bufr_expanded.sh                      |    2 +-
 examples/F90/bufr_get_keys.f90                     |   29 +-
 examples/F90/bufr_get_keys.sh                      |    2 +-
 examples/F90/bufr_get_string_array.f90             |   18 +-
 examples/F90/bufr_get_string_array.sh              |    2 +-
 examples/F90/bufr_keys_iterator.f90                |   41 +-
 examples/F90/bufr_keys_iterator.sh                 |    2 +-
 examples/F90/bufr_read_header.f90                  |   39 +-
 examples/F90/bufr_read_header.sh                   |    2 +-
 examples/F90/bufr_read_scatterometer.f90           |   50 +-
 examples/F90/bufr_read_scatterometer.sh            |    2 +-
 examples/F90/bufr_read_synop.f90                   |   16 +-
 examples/F90/bufr_read_synop.sh                    |    2 +-
 examples/F90/bufr_read_temp.f90                    |   12 +-
 examples/F90/bufr_read_temp.sh                     |    2 +-
 examples/F90/bufr_read_tropical_cyclone.f90        |   26 +-
 examples/F90/bufr_read_tropical_cyclone.sh         |    2 +-
 examples/F90/bufr_set_keys.f90                     |   18 +-
 examples/F90/bufr_set_keys.sh                      |    6 +-
 examples/F90/bufr_subset.f90                       |   39 +-
 examples/F90/bufr_subset.sh                        |    2 +-
 examples/F90/copy_namespace.f90                    |   37 -
 examples/F90/get_fortran.f90                       |   49 +-
 examples/F90/get_pl.f90                            |    2 +-
 examples/F90/get_pl.sh                             |    2 +-
 examples/F90/get_product_kind.f90                  |    2 +-
 examples/F90/get_product_kind.sh                   |    2 +-
 examples/F90/get_pv.f90                            |    2 +-
 examples/F90/get_pv.sh                             |    2 +-
 examples/F90/get_set_uuid.f90                      |    2 +-
 examples/F90/get_set_uuid.sh                       |    6 +-
 examples/F90/grib_clone.f90                        |    2 +-
 examples/F90/grib_clone.sh                         |    2 +-
 examples/F90/grib_copy_message.f90                 |    2 +-
 examples/F90/grib_copy_message.sh                  |    4 +-
 examples/F90/grib_copy_namespace.f90               |   36 +
 examples/F90/grib_copy_namespace.sh                |   26 +
 examples/F90/grib_count_messages.f90               |    2 +-
 examples/F90/grib_count_messages.sh                |    2 +-
 examples/F90/grib_count_messages_multi.f90         |    2 +-
 examples/F90/grib_count_messages_multi.sh          |    2 +-
 examples/F90/grib_get_data.f90                     |    2 +-
 examples/F90/grib_get_data.sh                      |    2 +-
 examples/F90/grib_get_keys.f90                     |    2 +-
 examples/F90/grib_get_keys.sh                      |    2 +-
 examples/F90/grib_index.f90                        |    2 +-
 examples/F90/grib_index.sh                         |    2 +-
 examples/F90/grib_keys_iterator.f90                |    2 +-
 examples/F90/grib_keys_iterator.sh                 |    2 +-
 examples/F90/grib_multi.f90                        |    2 +-
 examples/F90/grib_multi.sh                         |    2 +-
 examples/F90/grib_multi_write.f90                  |    2 +-
 examples/F90/grib_multi_write.sh                   |    4 +-
 examples/F90/grib_nearest.f90                      |    2 +-
 examples/F90/grib_nearest.sh                       |    2 +-
 examples/F90/grib_precision.f90                    |    2 +-
 examples/F90/grib_precision.sh                     |    2 +-
 examples/F90/grib_print_data.f90                   |    2 +-
 examples/F90/grib_print_data.sh                    |    2 +-
 examples/F90/grib_print_data_static.f90            |    2 +-
 examples/F90/grib_samples.f90                      |   10 +-
 examples/F90/grib_samples.sh                       |    2 +-
 examples/F90/grib_set_bitmap.f90                   |    3 +-
 examples/F90/grib_set_bitmap.sh                    |    4 +-
 examples/F90/grib_set_data.f90                     |   63 +
 examples/F90/grib_set_data.sh                      |   16 +
 examples/F90/grib_set_gvc.f90                      |    2 +-
 examples/F90/grib_set_keys.f90                     |    2 +-
 examples/F90/grib_set_keys.sh                      |    6 +-
 examples/F90/grib_set_missing.f90                  |    2 +-
 examples/F90/grib_set_missing.sh                   |    2 +-
 examples/F90/grib_set_pv.f90                       |   26 +-
 examples/F90/grib_set_pv.sh                        |    2 +-
 examples/F90/include.ctest.sh.in                   |    7 +
 examples/F90/include.sh                            |    8 +-
 examples/F90/iterator_fortran.f90                  |   11 +-
 examples/F90/keys_iterator_fortran.f90             |    2 +-
 examples/F90/multi_fortran.f90                     |    2 +-
 examples/F90/new_from_file.f90                     |    2 +-
 examples/F90/precision_fortran.f90                 |    2 +-
 examples/F90/print_data_fortran.f90                |    2 +-
 examples/F90/read_from_file.f90                    |    2 +-
 examples/F90/read_from_file.sh                     |    2 +-
 examples/F90/read_message.f90                      |    2 +-
 examples/F90/read_message.sh                       |    2 +-
 examples/F90/set_fortran.f90                       |    2 +-
 examples/F90/set_missing_fortran.f90               |    2 +-
 examples/python/CMakeLists.txt                     |   10 +
 examples/python/binary_message.py                  |    8 +-
 examples/python/binary_message.sh                  |    7 +-
 examples/python/bufr_attributes.py                 |    2 +-
 examples/python/bufr_attributes.sh                 |    2 +-
 examples/python/bufr_clone.py                      |   15 +-
 examples/python/bufr_clone.sh                      |    2 +-
 examples/python/bufr_copy_data.py                  |   87 +
 examples/python/bufr_copy_data.sh                  |   67 +
 examples/python/bufr_encode_flight.py              |    2 +-
 examples/python/bufr_expanded.py                   |    2 +-
 examples/python/bufr_expanded.sh                   |    2 +-
 examples/python/bufr_get_keys.py                   |    2 +-
 examples/python/bufr_get_keys.sh                   |    2 +-
 examples/python/bufr_keys_iterator.py              |    2 +-
 examples/python/bufr_keys_iterator.sh              |    2 +-
 examples/python/bufr_read_header.py                |    2 +-
 examples/python/bufr_read_scatterometer.py         |    8 +-
 examples/python/bufr_read_scatterometer.sh         |    2 +-
 examples/python/bufr_read_synop.py                 |    2 +-
 examples/python/bufr_read_synop.sh                 |    2 +-
 examples/python/bufr_read_temp.py                  |    2 +-
 examples/python/bufr_read_temp.sh                  |    2 +-
 examples/python/bufr_read_tropical_cyclone.py      |   76 +-
 examples/python/bufr_read_tropical_cyclone.sh      |    2 +-
 examples/python/bufr_set_keys.py                   |    6 +-
 examples/python/bufr_set_keys.sh                   |    2 +-
 examples/python/bufr_subset.py                     |    2 +-
 examples/python/bufr_subset.sh                     |    2 +-
 examples/python/get_product_kind.py                |    2 +-
 examples/python/get_product_kind.sh                |    2 +-
 examples/python/grib_ccsds.py                      |    2 +-
 examples/python/grib_clone.py                      |    2 +-
 examples/python/grib_count_messages.c              |    2 +-
 examples/python/grib_count_messages.py             |    2 +-
 examples/python/grib_get_keys.py                   |    2 +-
 examples/python/grib_get_message_offset.py         |    2 +-
 examples/python/grib_get_message_offset.sh         |    2 +-
 examples/python/grib_index.py                      |    2 +-
 examples/python/grib_index.sh                      |    5 +-
 examples/python/grib_iterator.c                    |    2 +-
 examples/python/grib_iterator.py                   |    2 +-
 examples/python/grib_iterator_bitmap.py            |    2 +-
 examples/python/grib_keys_iterator.c               |    2 +-
 examples/python/grib_keys_iterator.py              |    2 +-
 examples/python/grib_ls_JSON.py                    |  106 +
 examples/python/grib_multi_write.py                |    2 +-
 examples/python/grib_nearest.py                    |    2 +-
 examples/python/grib_print_data.c                  |    2 +-
 examples/python/grib_print_data.py                 |    2 +-
 examples/python/grib_samples.py                    |    2 +-
 examples/python/grib_set_bitmap.py                 |    2 +-
 examples/python/grib_set_keys.py                   |    2 +-
 examples/python/grib_set_missing.py                |    2 +-
 examples/python/grib_set_pv.py                     |    4 +-
 examples/python/grib_set_pv.sh                     |    7 +
 examples/python/gts_get_keys.py                    |    2 +-
 examples/python/gts_get_keys.sh                    |    2 +-
 examples/python/high_level_api.py                  |  396 +++
 examples/python/high_level_api.sh                  |   10 +
 examples/python/keys_iterator_bufr.py              |   62 -
 examples/python/keys_iterator_gts.py               |    2 +-
 examples/python/metar_get_keys.py                  |    2 +-
 examples/python/metar_get_keys.sh                  |    2 +-
 fortran/create_grib_f90.sh                         |    2 +-
 fortran/eccodes_constants.h                        |  136 +-
 fortran/eccodes_f90_head.f90                       |    2 +-
 fortran/eccodes_f90_int.f90                        |    2 +-
 fortran/eccodes_f90_int_size_t.f90                 |    2 +-
 fortran/eccodes_f90_long_int.f90                   |    2 +-
 fortran/eccodes_f90_long_size_t.f90                |    2 +-
 fortran/eccodes_f90_tail.f90                       |  132 +-
 fortran/eccodes_visibility.h                       |    1 +
 fortran/grib_api_externals.h                       |    6 +-
 fortran/grib_api_visibility.h                      |    4 +-
 fortran/grib_f77.c                                 |    2 +-
 fortran/grib_f90_head.f90                          |    2 +-
 fortran/grib_f90_int.f90                           |    2 +-
 fortran/grib_f90_int_size_t.f90                    |    2 +-
 fortran/grib_f90_long_int.f90                      |    2 +-
 fortran/grib_f90_long_size_t.f90                   |    2 +-
 fortran/grib_f90_tail.f90                          |  289 +-
 fortran/grib_fortran.c                             |   72 +-
 fortran/grib_fortran_kinds.c                       |    2 +-
 fortran/grib_fortran_prototypes.h                  |    7 +-
 fortran/grib_types.f90                             |    2 +-
 fortran/same_int_long.f90                          |    2 +-
 fortran/same_int_size_t.f90                        |    2 +-
 html/annotated.html                                |   53 +-
 html/classec_codes_1_1_codes_internal_error.html   |  109 -
 html/classeccodes.html                             |  174 +-
 html/classes.html                                  |   21 +-
 html/classhigh__level__api_1_1_test_bufr_file.html |  229 ++
 ...lasshigh__level__api_1_1_test_bufr_message.html |  225 ++
 html/classhigh__level__api_1_1_test_grib_file.html |  237 ++
 .../classhigh__level__api_1_1_test_grib_index.html |  183 ++
 ...lasshigh__level__api_1_1_test_grib_message.html |  233 ++
 html/dir_d050070cc3e4bbd91d897ff8856046e0.html     |    6 +
 html/dir_da7ee69c60c6cc261c862ec60d8c4bc7.html     |    4 +
 html/eccodes_8h.html                               |   34 +-
 html/functions.html                                |   81 +-
 html/functions_0x74.html                           |  156 ++
 html/functions_func.html                           |   81 +-
 html/functions_func_0x74.html                      |  156 ++
 html/globals.html                                  |    8 +-
 html/globals_defs.html                             |    3 +
 html/globals_func.html                             |    5 +-
 html/group__codes__handle.html                     |   12 +-
 html/group__errors.html                            |    4 +-
 html/group__get__set.html                          |    6 +-
 html/group__keys__iterator.html                    |   16 +
 html/interfaceeccodes_1_1codes__get__element.html  |   48 +-
 ...rfaceeccodes_1_1codes__grib__find__nearest.html |   24 +-
 html/interfaceeccodes_1_1codes__set.html           |    3 +-
 html/namespaceec_codes.html                        |  552 ++--
 html/namespacemembers.html                         |   23 +-
 html/namespacemembers_func.html                    |   23 +-
 html/search/all_63.js                              |   29 +-
 html/search/all_67.js                              |    2 -
 html/search/all_74.js                              |   20 +-
 html/search/classes_63.js                          |    3 +-
 html/search/classes_74.html                        |   26 +
 html/search/classes_74.js                          |    8 +
 html/search/functions_63.js                        |   23 +-
 html/search/functions_67.html                      |   26 -
 html/search/functions_67.js                        |    5 -
 html/search/functions_74.html                      |   26 +
 html/search/functions_74.js                        |   16 +
 html/search/search.js                              |    4 +-
 license.pl                                         |    2 +-
 memfs/CMakeLists.txt                               |    9 +-
 perf/jmeter.awk                                    |    2 +-
 perf/time.sh                                       |    2 +-
 perl/GRIB-API/API.xs                               |  987 -------
 perl/GRIB-API/Changes                              |    6 -
 perl/GRIB-API/INSTALL                              |   13 -
 perl/GRIB-API/MANIFEST                             |   12 -
 perl/GRIB-API/Makefile.PL.in                       |   23 -
 perl/GRIB-API/README                               |   38 -
 perl/GRIB-API/convert.pl                           |  529 ----
 perl/GRIB-API/lib/GRIB/API.pm                      |   97 -
 perl/GRIB-API/lib/GRIB/API/Debug.pm                |    7 -
 perl/GRIB-API/lib/GRIB/API/Tie.pm                  |   46 -
 perl/GRIB-API/ppport.h                             | 1096 --------
 perl/GRIB-API/t/GRIB-API.t                         |   27 -
 perl/GRIB-API/test.pl                              |  133 -
 perl/GRIB-API/typemap                              |    2 -
 perl/Makefile.am                                   |   39 -
 perl/README                                        |   20 -
 python/CMakeLists.txt                              |    6 +-
 python/create_errors.py.sh                         |  111 +
 python/eccodes/__init__.py                         |    9 +
 python/eccodes/eccodes.py                          |    3 +
 python/eccodes/high_level/__init__.py              |    0
 python/eccodes/high_level/bufr.py                  |   79 +
 python/eccodes/high_level/codesfile.py             |   71 +
 python/eccodes/high_level/codesmessage.py          |  179 ++
 python/eccodes/high_level/gribfile.py              |   17 +
 python/eccodes/high_level/gribindex.py             |  102 +
 python/eccodes/high_level/gribmessage.py           |   80 +
 python/grib_errors.h                               |    2 +-
 python/grib_interface.c                            |   15 +-
 python/grib_interface.h                            |    1 +
 python/gribapi.c                                   |    2 +-
 python/gribapi/errors.py                           |  235 ++
 python/gribapi/gribapi.py                          |   80 +-
 python/gribapi_swig.i                              |    2 +
 python/setup.py.in                                 |    8 +-
 python/swig_wrap_numpy.c                           |   50 +
 python/swig_wrap_numpy.py                          |    4 +
 share/ecbuild/toolchains/ecmwf-XC30-Cray.cmake     |   14 +-
 share/ecbuild/toolchains/ecmwf-XC30-GNU.cmake      |   14 +-
 share/ecbuild/toolchains/ecmwf-XC30-Intel.cmake    |   14 +-
 show_compile.sh                                    |    2 +-
 src/CMakeLists.txt                                 |    9 +-
 src/Makefile.am                                    |    7 +-
 src/action.c                                       |   15 +-
 src/action.class                                   |    2 -
 src/action_class_alias.c                           |   30 +-
 src/action_class_assert.c                          |    3 +-
 src/action_class_close.c                           |    3 +-
 src/action_class_concept.c                         |    8 +-
 src/action_class_gen.c                             |   36 +-
 src/action_class_hash_array.c                      |   49 +-
 src/action_class_if.c                              |   26 +-
 src/action_class_list.c                            |   22 +-
 src/action_class_meta.c                            |    4 +-
 src/action_class_modify.c                          |   15 +-
 src/action_class_noop.c                            |   14 +-
 src/action_class_print.c                           |    3 +-
 src/action_class_put.c                             |    3 +-
 src/action_class_remove.c                          |   14 +-
 src/action_class_rename.c                          |   11 +-
 src/action_class_section.c                         |   11 +-
 src/action_class_set.c                             |   16 +-
 src/action_class_set_darray.c                      |    3 +-
 src/action_class_set_iarray.c                      |    3 +-
 src/action_class_set_missing.c                     |    3 +-
 src/action_class_set_sarray.c                      |    3 +-
 src/action_class_switch.c                          |    4 +-
 src/action_class_template.c                        |   28 +-
 src/action_class_transient_darray.c                |    4 +-
 src/action_class_trigger.c                         |    4 +-
 src/action_class_variable.c                        |   27 +-
 src/action_class_when.c                            |   27 +-
 src/action_class_while.c                           |    4 +-
 src/action_class_write.c                           |   14 +-
 src/bufr_keys_iterator.c                           |  217 ++
 src/bufr_util.c                                    |  126 +
 src/codes_memfs.c                                  |    2 +-
 src/compile.c                                      |  105 -
 src/eccodes.c                                      |   12 +-
 src/eccodes.h                                      |  189 +-
 src/eccodes_version.h.in                           |    2 +-
 src/eccodes_windef.h                               |    2 +-
 src/encode_double_array.c                          |    2 +-
 src/errors.pl                                      |  147 +-
 src/expression.class                               |    2 -
 src/extrules.am                                    |   11 +-
 src/functions.c                                    |    2 +-
 src/grib2c.pl                                      |    2 +-
 src/grib_2order_packer_simple.c                    |  122 +-
 src/grib_accessor.c                                |    7 +-
 src/grib_accessor_class.c                          |    8 +-
 src/grib_accessor_class_abstract_long_vector.c     |    2 +-
 src/grib_accessor_class_abstract_vector.c          |    2 +-
 src/grib_accessor_class_apply_operators.c          | 1070 ++++----
 src/grib_accessor_class_array.c                    |    2 +-
 src/grib_accessor_class_ascii.c                    |    2 +-
 src/grib_accessor_class_assert.c                   |    2 +-
 src/grib_accessor_class_bit.c                      |    2 +-
 src/grib_accessor_class_bitmap.c                   |    2 +-
 src/grib_accessor_class_bits.c                     |   47 +-
 src/grib_accessor_class_bits_per_value.c           |    2 +-
 src/grib_accessor_class_blob.c                     |    2 +-
 src/grib_accessor_class_box.c                      |    2 +-
 src/grib_accessor_class_budgdate.c                 |    2 +-
 src/grib_accessor_class_bufr_data.c                |    2 +-
 src/grib_accessor_class_bufr_data_array.c          |  215 +-
 src/grib_accessor_class_bufr_data_element.c        |    3 +-
 src/grib_accessor_class_bufr_elements_table.c      |  104 +-
 ...grib_accessor_class_bufr_extract_area_subsets.c |    6 +-
 ..._accessor_class_bufr_extract_datetime_subsets.c |   14 +-
 src/grib_accessor_class_bufr_extract_subsets.c     |    2 +-
 src/grib_accessor_class_bufr_group.c               |    2 +-
 ...b_accessor_class_bufr_has_delayed_replication.c |    2 +-
 src/grib_accessor_class_bufr_simple_thinning.c     |    3 +-
 src/grib_accessor_class_bufr_string_values.c       |    2 +-
 ...ib_accessor_class_bufrdc_expanded_descriptors.c |    2 +-
 src/grib_accessor_class_bytes.c                    |    2 +-
 ...grib_accessor_class_change_scanning_direction.c |    2 +-
 src/grib_accessor_class_check_internal_version.c   |    2 +-
 src/grib_accessor_class_codeflag.c                 |    2 +-
 src/grib_accessor_class_codetable.c                |   40 +-
 src/grib_accessor_class_codetable_title.c          |    2 +-
 src/grib_accessor_class_codetable_units.c          |    2 +-
 src/grib_accessor_class_concept.c                  |    2 +-
 src/grib_accessor_class_constant.c                 |    2 +-
 src/grib_accessor_class_count_file.c               |    2 +-
 src/grib_accessor_class_count_missing.c            |    2 +-
 src/grib_accessor_class_count_total.c              |    2 +-
 src/grib_accessor_class_data_2order_packing.c      |    2 +-
 ...grib_accessor_class_data_2order_packing_count.c |    2 +-
 src/grib_accessor_class_data_apply_bitmap.c        |    2 +-
 ...rib_accessor_class_data_apply_boustrophedonic.c |    2 +-
 ...essor_class_data_apply_boustrophedonic_bitmap.c |    2 +-
 src/grib_accessor_class_data_apply_gdsnotpresent.c |    2 +-
 src/grib_accessor_class_data_ccsds_packing.c       |   13 +-
 src/grib_accessor_class_data_complex_packing.c     |  629 ++++-
 src/grib_accessor_class_data_constant_field.c      |    2 +-
 src/grib_accessor_class_data_dummy_field.c         |    3 +-
 src/grib_accessor_class_data_g1complex_packing.c   |    3 +-
 ...ss_data_g1second_order_constant_width_packing.c |    3 +-
 ..._data_g1second_order_general_extended_packing.c |  676 ++++-
 ...sor_class_data_g1second_order_general_packing.c |    3 +-
 ..._class_data_g1second_order_row_by_row_packing.c |    3 +-
 src/grib_accessor_class_data_g1secondary_bitmap.c  |    2 +-
 src/grib_accessor_class_data_g1shsimple_packing.c  |    2 +-
 src/grib_accessor_class_data_g1simple_packing.c    |    7 +-
 src/grib_accessor_class_data_g22order_packing.c    |   14 +-
 src/grib_accessor_class_data_g2complex_packing.c   |    3 +-
 src/grib_accessor_class_data_g2secondary_bitmap.c  |    2 +-
 src/grib_accessor_class_data_g2shsimple_packing.c  |    2 +-
 src/grib_accessor_class_data_g2simple_packing.c    |    3 +-
 ...lass_data_g2simple_packing_with_preprocessing.c |    2 +-
 src/grib_accessor_class_data_jpeg2000_packing.c    |   15 +-
 src/grib_accessor_class_data_png_packing.c         |   22 +-
 src/grib_accessor_class_data_raw_packing.c         |    2 +-
 src/grib_accessor_class_data_secondary_bitmap.c    |    2 +-
 src/grib_accessor_class_data_sh_packed.c           |    3 +-
 src/grib_accessor_class_data_sh_unpacked.c         |    3 +-
 src/grib_accessor_class_data_shsimple_packing.c    |    2 +-
 src/grib_accessor_class_data_simple_packing.c      |   35 +-
 src/grib_accessor_class_decimal_precision.c        |    2 +-
 src/grib_accessor_class_dictionary.c               |   10 +-
 src/grib_accessor_class_dirty.c                    |    2 +-
 src/grib_accessor_class_divdouble.c                |    2 +-
 src/grib_accessor_class_double.c                   |    2 +-
 src/grib_accessor_class_element.c                  |    2 +-
 src/grib_accessor_class_evaluate.c                 |    2 +-
 src/grib_accessor_class_expanded_descriptors.c     |   99 +-
 src/grib_accessor_class_forward.c                  |    2 +-
 ...accessor_class_from_scale_factor_scaled_value.c |    2 +-
 src/grib_accessor_class_g1_half_byte_codeflag.c    |    2 +-
 src/grib_accessor_class_g1_increment.c             |    2 +-
 src/grib_accessor_class_g1_message_length.c        |    2 +-
 src/grib_accessor_class_g1_section4_length.c       |    2 +-
 src/grib_accessor_class_g1area.c                   |    2 +-
 src/grib_accessor_class_g1bitmap.c                 |    2 +-
 src/grib_accessor_class_g1date.c                   |    2 +-
 src/grib_accessor_class_g1day_of_the_year_date.c   |    2 +-
 ...grib_accessor_class_g1end_of_interval_monthly.c |    2 +-
 src/grib_accessor_class_g1fcperiod.c               |    2 +-
 src/grib_accessor_class_g1forecastmonth.c          |    2 +-
 src/grib_accessor_class_g1monthlydate.c            |    2 +-
 ...sor_class_g1number_of_coded_values_sh_complex.c |    2 +-
 ...ssor_class_g1number_of_coded_values_sh_simple.c |    2 +-
 src/grib_accessor_class_g1p1p2.c                   |    2 +-
 src/grib_accessor_class_g1param.c                  |    2 +-
 src/grib_accessor_class_g1step_range.c             |    2 +-
 src/grib_accessor_class_g1verificationdate.c       |    2 +-
 src/grib_accessor_class_g2_chemical.c              |    2 +-
 src/grib_accessor_class_g2_eps.c                   |    2 +-
 src/grib_accessor_class_g2_mars_labeling.c         |    2 +-
 src/grib_accessor_class_g2bitmap.c                 |    2 +-
 src/grib_accessor_class_g2bitmap_present.c         |    2 +-
 src/grib_accessor_class_g2date.c                   |    2 +-
 src/grib_accessor_class_g2end_step.c               |    2 +-
 src/grib_accessor_class_g2grid.c                   |    2 +-
 src/grib_accessor_class_g2latlon.c                 |    2 +-
 src/grib_accessor_class_g2level.c                  |    2 +-
 src/grib_accessor_class_g2lon.c                    |    2 +-
 src/grib_accessor_class_g2step.c                   |    2 +-
 src/grib_accessor_class_g2step_range.c             |    2 +-
 src/grib_accessor_class_gaussian_grid_name.c       |    2 +-
 src/grib_accessor_class_gds_is_present.c           |    2 +-
 src/grib_accessor_class_gds_not_present_bitmap.c   |    2 +-
 src/grib_accessor_class_gen.c                      |   64 +-
 src/grib_accessor_class_getenv.c                   |    2 +-
 src/grib_accessor_class_global_gaussian.c          |    2 +-
 src/grib_accessor_class_group.c                    |    2 +-
 src/grib_accessor_class_gts_header.c               |    2 +-
 src/grib_accessor_class_hash_array.c               |  202 +-
 src/grib_accessor_class_headers_only.c             |    2 +-
 src/grib_accessor_class_ibmfloat.c                 |    2 +-
 src/grib_accessor_class_ieeefloat.c                |    2 +-
 src/grib_accessor_class_ifs_param.c                |    2 +-
 src/grib_accessor_class_int16.c                    |    2 +-
 src/grib_accessor_class_int16_little_endian.c      |    2 +-
 src/grib_accessor_class_int32.c                    |    2 +-
 src/grib_accessor_class_int32_little_endian.c      |    2 +-
 src/grib_accessor_class_int64.c                    |    2 +-
 src/grib_accessor_class_int64_little_endian.c      |    2 +-
 src/grib_accessor_class_int8.c                     |    2 +-
 src/grib_accessor_class_iterator.c                 |    2 +-
 src/grib_accessor_class_julian_day.c               |    2 +-
 src/grib_accessor_class_ksec1expver.c              |    2 +-
 src/grib_accessor_class_label.c                    |    2 +-
 src/grib_accessor_class_laplacian.c                |    2 +-
 src/grib_accessor_class_latitudes.c                |    2 +-
 src/grib_accessor_class_latlon_increment.c         |    2 +-
 src/grib_accessor_class_latlonvalues.c             |    2 +-
 src/grib_accessor_class_library_version.c          |    2 +-
 src/grib_accessor_class_local_definition.c         |    2 +-
 src/grib_accessor_class_long.c                     |    2 +-
 src/grib_accessor_class_long_vector.c              |    2 +-
 src/grib_accessor_class_longitudes.c               |    2 +-
 src/grib_accessor_class_lookup.c                   |    2 +-
 src/grib_accessor_class_mars_param.c               |    2 +-
 src/grib_accessor_class_mars_step.c                |    2 +-
 src/grib_accessor_class_md5.c                      |    2 +-
 src/grib_accessor_class_message.c                  |    2 +-
 src/grib_accessor_class_message_copy.c             |    2 +-
 src/grib_accessor_class_missing.c                  |    2 +-
 src/grib_accessor_class_nearest.c                  |    2 +-
 src/grib_accessor_class_non_alpha.c                |    2 +-
 src/grib_accessor_class_number_of_coded_values.c   |    2 +-
 src/grib_accessor_class_number_of_points.c         |    2 +-
 ...grib_accessor_class_number_of_points_gaussian.c |    2 +-
 src/grib_accessor_class_number_of_values.c         |    2 +-
 ...essor_class_number_of_values_data_raw_packing.c |    2 +-
 src/grib_accessor_class_octahedral_gaussian.c      |    2 +-
 src/grib_accessor_class_octect_number.c            |    2 +-
 src/grib_accessor_class_offset_file.c              |    2 +-
 src/grib_accessor_class_offset_values.c            |    2 +-
 src/grib_accessor_class_pack_bufr_values.c         |    2 +-
 src/grib_accessor_class_pad.c                      |    2 +-
 src/grib_accessor_class_padding.c                  |    2 +-
 src/grib_accessor_class_padto.c                    |    2 +-
 src/grib_accessor_class_padtoeven.c                |    2 +-
 src/grib_accessor_class_padtomultiple.c            |    2 +-
 src/grib_accessor_class_position.c                 |    2 +-
 src/grib_accessor_class_raw.c                      |    2 +-
 src/grib_accessor_class_reference_value_error.c    |    2 +-
 src/grib_accessor_class_round.c                    |    2 +-
 src/grib_accessor_class_scale.c                    |    2 +-
 src/grib_accessor_class_scale_values.c             |    2 +-
 ...ib_accessor_class_second_order_bits_per_value.c |   10 +-
 src/grib_accessor_class_section.c                  |    2 +-
 src/grib_accessor_class_section_length.c           |    2 +-
 src/grib_accessor_class_section_padding.c          |    2 +-
 src/grib_accessor_class_section_pointer.c          |    2 +-
 src/grib_accessor_class_select_step_template.c     |    2 +-
 src/grib_accessor_class_sexagesimal2decimal.c      |    2 +-
 src/grib_accessor_class_signed.c                   |    2 +-
 src/grib_accessor_class_signed_bits.c              |    2 +-
 src/grib_accessor_class_simple_packing_error.c     |    2 +-
 src/grib_accessor_class_size.c                     |    2 +-
 src/grib_accessor_class_smart_table.c              |  382 ++-
 src/grib_accessor_class_smart_table_column.c       |    2 +-
 src/grib_accessor_class_spd.c                      |    2 +-
 src/grib_accessor_class_spectral_truncation.c      |    2 +-
 src/grib_accessor_class_sprintf.c                  |    2 +-
 src/grib_accessor_class_statistics.c               |    2 +-
 src/grib_accessor_class_statistics_spectral.c      |    2 +-
 src/grib_accessor_class_step_in_units.c            |    2 +-
 src/grib_accessor_class_sum.c                      |    2 +-
 src/grib_accessor_class_suppressed.c               |    2 +-
 src/grib_accessor_class_time.c                     |    2 +-
 src/grib_accessor_class_times.c                    |    2 +-
 src/grib_accessor_class_to_double.c                |    2 +-
 src/grib_accessor_class_to_integer.c               |    2 +-
 src/grib_accessor_class_to_string.c                |    2 +-
 src/grib_accessor_class_transient.c                |    2 +-
 src/grib_accessor_class_transient_darray.c         |    2 +-
 src/grib_accessor_class_uint16.c                   |    2 +-
 src/grib_accessor_class_uint16_little_endian.c     |    2 +-
 src/grib_accessor_class_uint32.c                   |    2 +-
 src/grib_accessor_class_uint32_little_endian.c     |    2 +-
 src/grib_accessor_class_uint64.c                   |    2 +-
 src/grib_accessor_class_uint64_little_endian.c     |    2 +-
 src/grib_accessor_class_uint8.c                    |    2 +-
 src/grib_accessor_class_unexpanded_descriptors.c   |   16 +-
 src/grib_accessor_class_unpack_bufr_values.c       |    2 +-
 src/grib_accessor_class_unsigned.c                 |    2 +-
 src/grib_accessor_class_unsigned_bits.c            |    2 +-
 src/grib_accessor_class_validity_date.c            |    2 +-
 src/grib_accessor_class_validity_time.c            |    2 +-
 src/grib_accessor_class_values.c                   |    2 +-
 src/grib_accessor_class_variable.c                 |    3 +-
 src/grib_accessor_class_vector.c                   |    2 +-
 src/grib_accessor_class_when.c                     |    2 +-
 src/grib_accessor_classes_hash.c                   |    2 +-
 src/grib_api.h                                     |   39 +-
 src/grib_api_internal.h                            |   68 +-
 src/grib_api_prototypes.h                          |   94 +-
 src/grib_api_version.c                             |    2 +-
 src/grib_bits.c                                    |    2 +-
 src/grib_bits_any_endian.c                         |   19 +-
 src/grib_bits_any_endian_omp.c                     |  268 +-
 src/grib_bits_any_endian_simple.c                  |   90 +-
 src/grib_bits_any_endian_vector.c                  |    2 +-
 src/grib_bits_fast_big_endian.c                    |    2 +-
 src/grib_bits_fast_big_endian_omp.c                |    2 +-
 src/grib_bits_fast_big_endian_simple.c             |    2 +-
 src/grib_bits_fast_big_endian_vector.c             |    2 +-
 src/grib_bits_ibmpow.c                             |    2 +-
 src/grib_bits_ibmpow_opt.c                         |    2 +-
 src/grib_box.c                                     |    2 +-
 src/grib_box_class.c                               |    2 +-
 src/grib_box_class_gen.c                           |    2 +-
 src/grib_box_class_reduced_gaussian.c              |    2 +-
 src/grib_box_class_regular_gaussian.c              |    2 +-
 src/grib_buffer.c                                  |   10 +-
 src/grib_bufr_descriptor.c                         |    2 +-
 src/grib_bufr_descriptors_array.c                  |  200 +-
 src/grib_compressor.c                              |    2 +-
 src/grib_concept.c                                 |    2 +-
 src/grib_concept_index.c                           |    2 +-
 src/grib_context.c                                 |   11 +-
 src/grib_darray.c                                  |    6 +-
 src/grib_date.c                                    |    2 +-
 src/grib_db.c                                      |    2 +-
 src/grib_dependency.c                              |    2 +-
 src/grib_dumper.c                                  |    2 +-
 src/grib_dumper_class.c                            |    9 +-
 src/grib_dumper_class.h                            |    1 -
 src/grib_dumper_class_bufr_decode_C.c              |   54 +-
 src/grib_dumper_class_bufr_decode_filter.c         |   36 +-
 src/grib_dumper_class_bufr_decode_fortran.c        |   36 +-
 src/grib_dumper_class_bufr_decode_python.c         |   40 +-
 src/grib_dumper_class_bufr_encode_C.c              |   65 +-
 src/grib_dumper_class_bufr_encode_filter.c         |   42 +-
 src/grib_dumper_class_bufr_encode_fortran.c        |   43 +-
 src/grib_dumper_class_bufr_encode_python.c         |   45 +-
 src/grib_dumper_class_debug.c                      |    2 +-
 src/grib_dumper_class_default.c                    |    6 +-
 src/grib_dumper_class_grib_encode_C.c              |    2 +-
 src/grib_dumper_class_json.c                       |    9 +-
 src/grib_dumper_class_keys.c                       |    2 +-
 src/grib_dumper_class_serialize.c                  |    2 +-
 src/grib_dumper_class_wmo.c                        |    4 +-
 src/grib_dumper_class_xml.c                        |  693 -----
 src/grib_dumper_factory.h                          |   29 +-
 src/grib_emoslib.h                                 |    2 +-
 src/grib_errors.c                                  |    2 +-
 src/grib_errors.txt                                |    2 +-
 src/grib_expression.c                              |   23 +-
 src/grib_expression.h                              |    2 +-
 src/grib_expression_class_accessor.c               |  134 +-
 src/grib_expression_class_binop.c                  |   17 +-
 src/grib_expression_class_column.c                 |    3 +-
 src/grib_expression_class_constant.c               |    3 +-
 src/grib_expression_class_double.c                 |   11 +-
 src/grib_expression_class_functor.c                |   14 +-
 src/grib_expression_class_is_in_dict.c             |   11 +-
 src/grib_expression_class_is_in_list.c             |   11 +-
 src/grib_expression_class_is_integer.c             |   11 +-
 src/grib_expression_class_length.c                 |   11 +-
 src/grib_expression_class_long.c                   |   11 +-
 src/grib_expression_class_string.c                 |   11 +-
 src/grib_expression_class_string_compare.c         |   16 +-
 src/grib_expression_class_sub_string.c             |   13 +-
 src/grib_expression_class_true.c                   |    3 +-
 src/grib_expression_class_unop.c                   |   15 +-
 src/grib_fieldset.c                                |   12 +-
 src/grib_filepool.c                                |    2 +-
 src/grib_gaussian_reduced.c                        |    2 +-
 src/grib_geography.c                               |   29 +-
 src/grib_handle.c                                  |    4 +-
 src/grib_hash_array.c                              |    2 +-
 src/grib_hash_keys.c                               |    4 +-
 src/grib_header_compute.c                          |    2 +-
 src/grib_iarray.c                                  |    2 +-
 src/grib_ibmfloat.c                                |    2 +-
 src/grib_ieeefloat.c                               |    2 +-
 src/grib_index.c                                   |   13 +-
 src/grib_io.c                                      |    8 +-
 src/grib_iterator.c                                |    2 +-
 src/grib_iterator_class.c                          |    2 +-
 src/grib_iterator_class.h                          |    1 +
 src/grib_iterator_class_gaussian.c                 |    2 +-
 src/grib_iterator_class_gaussian_reduced.c         |    3 +-
 src/grib_iterator_class_gen.c                      |    2 +-
 ...b_iterator_class_lambert_azimuthal_equal_area.c |    2 +-
 src/grib_iterator_class_lambert_conformal.c        |    2 +-
 src/grib_iterator_class_latlon.c                   |    2 +-
 src/grib_iterator_class_latlon_reduced.c           |    2 +-
 src/grib_iterator_class_polar_stereographic.c      |    2 +-
 src/grib_iterator_class_regular.c                  |    2 +-
 src/grib_iterator_class_space_view.c               |  328 +++
 src/grib_iterator_factory.h                        |    1 +
 src/grib_itrie.c                                   |  119 +-
 src/grib_itrie_keys.c                              |  136 +-
 src/grib_jasper_encoding.c                         |    8 +-
 src/grib_keys_iterator.c                           |   22 +-
 src/grib_lex.c                                     |    2 +-
 src/grib_loader_from_array.c                       |    2 +-
 src/grib_loader_from_file.c                        |    2 +-
 src/grib_loader_from_handle.c                      |    2 +-
 src/grib_memory.c                                  |    2 +-
 src/grib_nearest.c                                 |    2 +-
 src/grib_nearest_class.c                           |    2 +-
 src/grib_nearest_class_gen.c                       |    2 +-
 src/grib_nearest_class_lambert_conformal.c         |    2 +-
 src/grib_nearest_class_latlon_reduced.c            |    2 +-
 src/grib_nearest_class_reduced.c                   |    2 +-
 src/grib_nearest_class_regular.c                   |    2 +-
 src/grib_nearest_class_sh.c                        |    2 +-
 src/grib_openjpeg_encoding.c                       |    4 +-
 src/grib_optimize_decimal_factor.c                 |  218 ++
 src/grib_optimize_decimal_factor.h                 |   14 +
 src/grib_parse_utils.c                             |   12 +-
 src/grib_query.c                                   |   45 +-
 src/grib_rules.c                                   |    2 +-
 src/grib_sarray.c                                  |    2 +-
 src/grib_scaling.c                                 |    2 +-
 src/grib_templates.c                               |    2 +-
 src/grib_templates.h                               |    2 +-
 src/grib_timer.c                                   |    2 +-
 src/grib_trie.c                                    |  230 +-
 src/grib_util.c                                    |  100 +-
 src/grib_value.c                                   |  184 +-
 src/grib_vdarray.c                                 |    2 +-
 src/grib_viarray.c                                 |    2 +-
 src/grib_vsarray.c                                 |    2 +-
 src/gribl.l                                        |    2 +-
 src/griby.y                                        |    2 +-
 src/jgribapi_GribFile.h                            |    2 +-
 src/jgribapi_GribHandle.h                          |    2 +-
 src/jgribapi_GribIterator.h                        |    2 +-
 src/md5.c                                          |    2 +-
 src/md5.h                                          |    2 +-
 src/minmax_val.c                                   |    2 +-
 src/string_util.c                                  |   93 +
 tests/CMakeLists.txt                               |   39 +-
 tests/Makefile.am                                  |    4 +-
 tests/badgrib.sh                                   |    2 +-
 tests/bitmap.sh                                    |   18 +-
 tests/bits.c                                       |    2 +-
 tests/bitsPerValue.sh                              |    2 +-
 tests/bpv_limit.c                                  |    2 +-
 tests/bpv_limit.sh                                 |    2 +-
 tests/budg.sh                                      |    2 +-
 tests/bufr_change_edition.sh                       |    2 +-
 tests/bufr_compare.sh                              |    4 +-
 tests/bufr_copy.sh                                 |    2 +-
 tests/bufr_count.sh                                |    2 +-
 tests/bufr_dump.sh                                 |    2 +-
 tests/bufr_dump_decode_C.sh                        |    4 +-
 tests/bufr_dump_decode_filter.sh                   |    2 +-
 tests/bufr_dump_decode_fortran.sh                  |    2 +-
 tests/bufr_dump_decode_python.sh                   |    2 +-
 tests/bufr_dump_encode_C.sh                        |    4 +-
 tests/bufr_dump_encode_filter.sh                   |    2 +-
 tests/bufr_dump_encode_fortran.sh                  |    2 +-
 tests/bufr_dump_encode_python.sh                   |    2 +-
 tests/bufr_filter.sh                               |   59 +-
 tests/bufr_filter_extract_area.sh                  |    5 +-
 tests/bufr_filter_extract_datetime.sh              |    5 +-
 tests/bufr_get.sh                                  |    2 +-
 tests/bufr_json.sh                                 |    4 +-
 tests/bufr_keys_iter.c                             |   49 +
 tests/bufr_keys_iter.sh                            |  227 ++
 tests/bufr_ls.sh                                   |    2 +-
 tests/bufr_set.sh                                  |    2 +-
 tests/bufrdc_desc_ref.sh                           |    2 +-
 tests/bufrdc_ref.sh                                |    2 +-
 tests/calendar.sh                                  |    2 +-
 tests/ccsds.sh                                     |    4 +-
 tests/ccsds_perf.c                                 |    2 +-
 tests/change_scanning.sh                           |    2 +-
 tests/check_gaussian_grids.sh                      |    2 +-
 tests/concept.sh                                   |    2 +-
 tests/decimalPrecision.sh                          |    2 +-
 tests/decode.c                                     |    2 +-
 tests/definitions.sh                               |    2 +-
 tests/ecc-197.sh                                   |    2 +-
 tests/ecc-286.sh                                   |    2 +-
 tests/ecc-288.sh                                   |    2 +-
 tests/ecc-379.sh                                   |   75 +
 tests/ecc-386.c                                    |   78 +
 tests/ecc-386.sh                                   |   14 +
 tests/ecc-393.sh                                   |   62 +
 tests/filter.sh                                    |  125 -
 tests/fortran_interface.sh                         |    2 +-
 tests/gauss_sub.c                                  |    2 +-
 tests/get_fail.sh                                  |    2 +-
 tests/global.sh                                    |    2 +-
 tests/grib1to2.sh                                  |    2 +-
 tests/grib2to1.sh                                  |    2 +-
 tests/grib_2nd_order_numValues.c                   |    2 +-
 tests/grib_2nd_order_numValues.sh                  |    2 +-
 tests/grib_check_param_concepts.sh                 |   16 +-
 tests/grib_compare.sh                              |   13 +-
 tests/grib_double_cmp.c                            |    2 +-
 tests/grib_double_cmp.sh                           |    2 +-
 tests/grib_dump.sh                                 |    2 +-
 tests/grib_dump_debug.sh                           |    2 +-
 tests/grib_filter.sh                               |  144 +
 tests/grib_png.sh                                  |    4 +-
 tests/grib_to_netcdf.sh                            |    2 +-
 tests/grib_util_set_spec.c                         |   92 +-
 tests/grib_util_set_spec.sh                        |   25 +-
 tests/gribex_perf.c                                |    2 +-
 tests/gridType.sh                                  |    2 +-
 tests/gts_compare.sh                               |    2 +-
 tests/gts_get.sh                                   |    7 +-
 tests/gts_ls.sh                                    |    2 +-
 tests/ibm.c                                        |    2 +-
 tests/ieee.c                                       |    2 +-
 tests/ieee.sh                                      |    2 +-
 tests/include.ctest.sh.in                          |    8 +-
 tests/include.sh                                   |    6 +-
 tests/index.c                                      |    2 +-
 tests/index.sh                                     |    2 +-
 tests/index_orderby.c                              |    2 +-
 tests/iterator.sh                                  |    2 +-
 tests/jpeg.sh                                      |   13 +-
 tests/jpeg_perf.c                                  |    2 +-
 tests/julian.c                                     |    2 +-
 tests/julian.sh                                    |    2 +-
 tests/lamb_az_eq_area.sh                           |    2 +-
 tests/laplacian.c                                  |    2 +-
 tests/largefile.c                                  |    2 +-
 tests/level.sh                                     |    2 +-
 tests/list.sh                                      |    2 +-
 tests/list_all_keys.ksh                            |    2 +-
 tests/local.sh                                     |    2 +-
 tests/local_MeteoFrance.c                          |    2 +-
 tests/local_MeteoFrance.sh                         |    2 +-
 tests/ls.sh                                        |    2 +-
 tests/metar_compare.sh                             |    2 +-
 tests/metar_dump.sh                                |    2 +-
 tests/metar_get.sh                                 |    2 +-
 tests/metar_ls.sh                                  |    2 +-
 tests/missing.sh                                   |    2 +-
 tests/multi.sh                                     |    2 +-
 tests/multi_from_message.c                         |    2 +-
 tests/multi_from_message.sh                        |    2 +-
 tests/mybufrdc_ref.sh                              |    2 +-
 tests/neg_fctime.sh                                |    2 +-
 tests/octahedral.sh                                |    2 +-
 tests/optimize_scaling.c                           | 2795 ++++++++++++++++++++
 tests/optimize_scaling.sh                          |   13 +
 tests/optimize_scaling_sh.c                        |  306 +++
 tests/optimize_scaling_sh.sh                       |   13 +
 tests/pack_unpack.c                                |    2 +-
 tests/packing.c                                    |    2 +-
 tests/packing_check.c                              |    2 +-
 tests/padding.sh                                   |    2 +-
 tests/png_perf.c                                   |    2 +-
 tests/read_any.c                                   |    2 +-
 tests/read_any.sh                                  |    2 +-
 tests/read_index.c                                 |    2 +-
 tests/second_order.sh                              |    2 +-
 tests/set.sh                                       |    2 +-
 tests/so_perf.c                                    |    2 +-
 tests/statistics.sh                                |    2 +-
 tests/step.sh                                      |    2 +-
 tests/tigge.sh                                     |    2 +-
 tests/tigge_conversions.sh                         |    2 +-
 tests/timing.c                                     |    2 +-
 tests/tiny.sh                                      |    2 +-
 tests/uerra.sh                                     |    2 +-
 tests/unit_tests.c                                 |   36 +-
 tests/unit_tests.sh                                |    2 +-
 tests/utils.sh                                     |    2 +-
 tests/values_to_ascii.c                            |    2 +-
 tigge/jma.pl                                       |    2 +-
 tigge/tigge_accumulations.c                        |    2 +-
 tigge/tigge_check.c                                |   58 +-
 tigge/tigge_check.h                                |  612 +++--
 tigge/tigge_name.c                                 |    2 +-
 tigge/tigge_split.c                                |    2 +-
 tools/CMakeLists.txt                               |    2 +-
 tools/Makefile.am                                  |   13 +-
 tools/big2gribex.c                                 |    2 +-
 tools/bufr_3to4.c                                  |    2 +-
 tools/bufr_compare.c                               |   72 +-
 tools/bufr_copy.c                                  |    2 +-
 tools/bufr_dump.c                                  |    2 +-
 tools/bufr_filter.c                                |    2 +-
 tools/bufr_get.c                                   |    2 +-
 tools/bufr_index_build.c                           |    2 +-
 tools/bufr_ls.c                                    |    2 +-
 tools/bufr_ls.sh                                   |    2 +-
 tools/bufr_set.c                                   |    2 +-
 tools/codes_count.c                                |    2 +-
 tools/codes_info.c                                 |   10 +-
 tools/codes_parser.c                               |    2 +-
 tools/compile.c                                    |    2 +-
 tools/deprecated/all_keys.c                        |    2 +-
 tools/deprecated/dump.c                            |    2 +-
 tools/deprecated/dumpload.c                        |    2 +-
 tools/deprecated/grib_add.c                        |    2 +-
 tools/deprecated/grib_cmp.c                        |    2 +-
 tools/deprecated/grib_convert.c                    |    2 +-
 tools/deprecated/grib_corruption_check.c           |    2 +-
 tools/deprecated/grib_debug.c                      |    2 +-
 tools/deprecated/grib_diff.c                       |    2 +-
 tools/deprecated/grib_distance.c                   |    2 +-
 tools/deprecated/grib_error.c                      |    2 +-
 tools/deprecated/grib_gen.c                        |    2 +-
 tools/deprecated/grib_keys.c                       |    2 +-
 tools/deprecated/grib_moments.c                    |    2 +-
 tools/deprecated/grib_packing.c                    |    2 +-
 tools/deprecated/grib_points.c                     |    2 +-
 tools/gaussian.c                                   |    2 +-
 tools/gg_sub_area_check.c                          |    2 +-
 tools/grib2ppm.c                                   |    2 +-
 tools/grib_2_request.c                             |    2 +-
 tools/grib_check_gaussian_grid.c                   |    2 +-
 tools/grib_compare.c                               |   18 +-
 tools/grib_copy.c                                  |    2 +-
 tools/grib_copy.dox                                |    2 +-
 tools/grib_dump.c                                  |    2 +-
 tools/grib_filter.c                                |    2 +-
 tools/grib_filter.h                                |    2 +-
 tools/grib_get.c                                   |    2 +-
 tools/grib_get_data.c                              |    3 +-
 tools/grib_histogram.c                             |    2 +-
 tools/grib_index_build.c                           |    2 +-
 tools/grib_ls.c                                    |    2 +-
 tools/grib_ls.dox                                  |    2 +-
 tools/grib_merge.c                                 |    2 +-
 tools/grib_nearest_land.c                          |    2 +-
 tools/grib_options.c                               |    4 +-
 tools/grib_repair.c                                |    2 +-
 tools/grib_set.c                                   |    2 +-
 tools/grib_to_json.c                               |    2 +-
 tools/grib_to_netcdf.c                             |    2 +-
 tools/grib_to_netcdf.sh                            |    5 +
 tools/grib_tools.c                                 |    5 +-
 tools/grib_tools.h                                 |    6 +-
 tools/gts_compare.c                                |   21 +-
 tools/gts_copy.c                                   |    2 +-
 tools/gts_dump.c                                   |    2 +-
 tools/gts_filter.c                                 |    2 +-
 tools/gts_get.c                                    |    2 +-
 tools/gts_ls.c                                     |    2 +-
 tools/list_keys.c                                  |    2 +-
 tools/load.c                                       |    2 +-
 tools/load.h                                       |    2 +-
 tools/mars_request.c                               |    2 +-
 tools/metar_compare.c                              |   10 +-
 tools/metar_copy.c                                 |    2 +-
 tools/metar_dump.c                                 |    2 +-
 tools/metar_filter.c                               |    2 +-
 tools/metar_get.c                                  |    2 +-
 tools/metar_ls.c                                   |    2 +-
 tools/taf_dump.c                                   |    2 +-
 tools/taf_filter.c                                 |    2 +-
 tools/taf_get.c                                    |    2 +-
 tools/taf_ls.c                                     |    2 +-
 tools/test.c                                       |    2 +-
 tools/wingetopt.c                                  |    2 +-
 tools/wingetopt.h                                  |    2 +-
 tools/xref.c                                       |    2 +-
 version.sh                                         |    6 +-
 windows/msvc/grib_api_lib/grib_api_lib.vcproj      |   26 +-
 1984 files changed, 26676 insertions(+), 10746 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index b70c556..f65b36f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,5 +1,5 @@
 #
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -24,7 +24,7 @@ set( CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH}
 
 include( ecbuild_system NO_POLICY_SCOPE )
 
-ecbuild_requires_macro_version( 2.4 )
+ecbuild_requires_macro_version( 2.6 )
 
 ###############################################################################
 # local project
@@ -61,6 +61,7 @@ ecbuild_add_option( FEATURE NETCDF
     DESCRIPTION "support for GRIB to NetCDF conversion"
     DEFAULT ON
     REQUIRED_PACKAGES NetCDF
+    NO_TPL
 )
 
 ecbuild_add_option( FEATURE AEC
@@ -147,6 +148,8 @@ if( ENABLE_JPG )
         list( APPEND ECCODES_TPLS Jasper )
         set( HAVE_JPEG 1 )
         set( HAVE_LIBJASPER 1 )
+        # Extract Jasper's major version number to enable conditional code. See ECC-396
+        string(REGEX REPLACE "^([0-9]+)\\.[0-9]+\\.[0-9]+.*" "\\1" JASPER_VERSION_MAJOR "${JASPER_VERSION_STRING}")
     endif()
 
     if( OPENJPEG_FOUND )
@@ -161,7 +164,7 @@ endif()
 ###############################################################################
 # other options
 
-if( GRIB_TIMER )
+if( HAVE_GRIB_TIMER )
     set( GRIB_TIMER 1 )
 else()
     set( GRIB_TIMER 0 )
@@ -302,7 +305,7 @@ add_subdirectory( ifs_samples ) # must come after samples
 # ecbuild_dont_pack( DIRS samples DONT_PACK_REGEX "*.grib" )
 ecbuild_dont_pack( DIRS
      concepts tests.ecmwf doxygen confluence examples.dev templates parameters java
-     config m4 rpms gaussian_experimental gribex examples/F77
+     perl config m4 rpms gaussian_experimental gribex examples/F77
      examples/extra examples/deprecated bamboo fortran/fortranCtypes tigge/tools
      share/eccodes  .settings
 )
@@ -341,7 +344,7 @@ ecbuild_pkgconfig(
   DESCRIPTION    "The ecCodes library"
   LIBRARIES      eccodes
   IGNORE_INCLUDE_DIRS ${PYTHON_INCLUDE_DIRS} ${NUMPY_INCLUDE_DIRS} ${NETCDF_INCLUDE_DIRS}
-  VARIABLES      HAVE_JPG HAVE_LIBJASPER HAVE_LIBOPENJPEG
+  VARIABLES      HAVE_JPEG HAVE_LIBJASPER HAVE_LIBOPENJPEG
                  HAVE_ECCODES_THREADS HAVE_ECCODES_OMP_THREADS
                  HAVE_NETCDF HAVE_PYTHON HAVE_FORTRAN HAVE_PNG HAVE_AEC
 )
@@ -353,7 +356,7 @@ if( EC_HAVE_FORTRAN )
     DESCRIPTION         "The ecCodes library for Fortran 90"
     IGNORE_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/fortran ${PROJECT_BINARY_DIR}/fortran
                         ${PYTHON_INCLUDE_DIRS} ${NUMPY_INCLUDE_DIRS} ${NETCDF_INCLUDE_DIRS}
-    VARIABLES           HAVE_JPG HAVE_LIBJASPER HAVE_LIBOPENJPEG
+    VARIABLES           HAVE_JPEG HAVE_LIBJASPER HAVE_LIBOPENJPEG
                         HAVE_ECCODES_THREADS HAVE_ECCODES_OMP_THREADS
                         HAVE_NETCDF HAVE_PYTHON HAVE_PNG HAVE_AEC
   )
diff --git a/INSTALL b/INSTALL
index f3da470..0121295 100644
--- a/INSTALL
+++ b/INSTALL
@@ -35,7 +35,7 @@ However it requires that cmake be installed on your system.
 
 You can also pass options to the cmake command above. Some typical examples are:
 
- -DBUILD_SHARED_LIBS=OFF         Install static libraries, not shared
+ -DENABLE_NETCDF=ON              Enable GRIB to netCDF conversion
  -DENABLE_ECCODES_THREADS=ON     Enable POSIX threads
  -DENABLE_JPG=ON                 Enable JPEG encoding/decoding (for GRIB packing)
  -DCMAKE_Fortran_COMPILER=pgf90  Set Fortran compiler to Portland Group F90 compiler
diff --git a/NOTICE b/NOTICE
index 8f0c435..89a95e9 100644
--- a/NOTICE
+++ b/NOTICE
@@ -1,5 +1,5 @@
 ECMWF ecCodes
-Copyright 2005-2016 ECMWF.
+Copyright 2005-2017 ECMWF.
 
 This product includes software developed at ECMWF (http://www.ecmwf.int).
 
diff --git a/README b/README
index f471c0e..2767b66 100644
--- a/README
+++ b/README
@@ -3,7 +3,7 @@ and a set of tools for decoding and encoding messages in the following formats:
 
    * WMO FM-92 GRIB edition 1 and edition 2
    * WMO FM-94 BUFR edition 3 and edition 4
-   * WMO GTS abbreviated header (only decoding in this release)
+   * WMO GTS abbreviated header (only decoding)
 
 A useful set of command line tools provide quick access to the messages.
 C, Fortran 90 and Python interfaces provide access to the main ecCodes functionality.
@@ -50,7 +50,7 @@ If you encounter any problems please send an e-mail with your problem to:
 COPYRIGHT AND LICENSE
 ----------------------
 
-Copyright 2005-2016 ECMWF.
+Copyright 2005-2017 ECMWF.
 
 This software is licensed under the terms of the Apache Licence Version 2.0
 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/VERSION.cmake b/VERSION.cmake
index fe3d06a..9cd120f 100644
--- a/VERSION.cmake
+++ b/VERSION.cmake
@@ -1 +1 @@
-set( ${PROJECT_NAME}_VERSION_STR  "2.0.2" )
+set( ${PROJECT_NAME}_VERSION_STR  "2.1.0" )
diff --git a/cmake/FindADSM.cmake b/cmake/FindADSM.cmake
index b46e798..daadf0e 100644
--- a/cmake/FindADSM.cmake
+++ b/cmake/FindADSM.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 # 
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
diff --git a/cmake/FindAEC.cmake b/cmake/FindAEC.cmake
index 717b2b5..0b0f69b 100644
--- a/cmake/FindAEC.cmake
+++ b/cmake/FindAEC.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindAIO.cmake b/cmake/FindAIO.cmake
index 76e357a..5dd9244 100644
--- a/cmake/FindAIO.cmake
+++ b/cmake/FindAIO.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 # 
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
diff --git a/cmake/FindArmadillo.cmake b/cmake/FindArmadillo.cmake
index 4ef1a4a..dfe77a2 100644
--- a/cmake/FindArmadillo.cmake
+++ b/cmake/FindArmadillo.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 # 
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
diff --git a/cmake/FindCMath.cmake b/cmake/FindCMath.cmake
index b8a2a0b..741728a 100644
--- a/cmake/FindCMath.cmake
+++ b/cmake/FindCMath.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 # 
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
diff --git a/cmake/FindDl.cmake b/cmake/FindDl.cmake
index 16463c6..31e426f 100644
--- a/cmake/FindDl.cmake
+++ b/cmake/FindDl.cmake
@@ -1,4 +1,4 @@
-# © Copyright 1996-2016 ECMWF.
+# © Copyright 1996-2017 ECMWF.
 # 
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
diff --git a/cmake/FindEMOS.cmake b/cmake/FindEMOS.cmake
index c549fc2..43f896e 100644
--- a/cmake/FindEMOS.cmake
+++ b/cmake/FindEMOS.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 # 
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
diff --git a/cmake/FindFDB.cmake b/cmake/FindFDB.cmake
index 4bcbdf3..66879c1 100644
--- a/cmake/FindFDB.cmake
+++ b/cmake/FindFDB.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 # 
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
diff --git a/cmake/FindFFTW.cmake b/cmake/FindFFTW.cmake
index b76afa5..d57c09a 100644
--- a/cmake/FindFFTW.cmake
+++ b/cmake/FindFFTW.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindGeoTIFF.cmake b/cmake/FindGeoTIFF.cmake
index 126bc46..7226f61 100644
--- a/cmake/FindGeoTIFF.cmake
+++ b/cmake/FindGeoTIFF.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindHPSS.cmake b/cmake/FindHPSS.cmake
index b2b662b..1cc829e 100644
--- a/cmake/FindHPSS.cmake
+++ b/cmake/FindHPSS.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 # 
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
diff --git a/cmake/FindLEX.cmake b/cmake/FindLEX.cmake
index 221868f..b6ab838 100644
--- a/cmake/FindLEX.cmake
+++ b/cmake/FindLEX.cmake
@@ -44,7 +44,7 @@
 # This file is based on the FindFLEX CMake macro, and adapted by ECMWF
 
 #=============================================================================
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindLibGFortran.cmake b/cmake/FindLibGFortran.cmake
index a293ea5..7f9cc64 100644
--- a/cmake/FindLibGFortran.cmake
+++ b/cmake/FindLibGFortran.cmake
@@ -1,4 +1,4 @@
-# © Copyright 1996-2016 ECMWF.
+# © Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindLibIFort.cmake b/cmake/FindLibIFort.cmake
index da782a4..4c3e299 100644
--- a/cmake/FindLibIFort.cmake
+++ b/cmake/FindLibIFort.cmake
@@ -1,4 +1,4 @@
-# © Copyright 1996-2016 ECMWF.
+# © Copyright 1996-2017 ECMWF.
 # 
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
diff --git a/cmake/FindLustreAPI.cmake b/cmake/FindLustreAPI.cmake
new file mode 100644
index 0000000..6db0ba2
--- /dev/null
+++ b/cmake/FindLustreAPI.cmake
@@ -0,0 +1,43 @@
+# (C) Copyright 1996-2017 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation
+# nor does it submit to any jurisdiction.
+
+# - Try to find lib Lustre API
+
+# usually installed on Cray systems under /opt/cray/lustre-cray_ari_s/default / create_test.c -L
+# .../include/lustre/lustreapi.h
+# .../lib64/liblustreapi.so
+
+# Once done this will define
+#  LUSTREAPI_FOUND        - System has LustreAPI
+#  LUSTREAPI_INCLUDE_DIRS - The LustreAPI include directories
+#  LUSTREAPI_LIBRARIES    - The libraries needed to use LustreAPI
+#
+# The following paths will be searched with priority if set in CMake or env
+#
+#  LUSTREAPI_DIR          - prefix path of the LustreAPI installation
+#  LUSTREAPI_PATH         - prefix path of the LustreAPI installation
+
+find_path( LUSTREAPI_INCLUDE_DIR lustre/lustreapi.h
+           PATHS ${LUSTREAPI_DIR} ${LUSTREAPI_PATH} ENV LUSTREAPI_DIR ENV LUSTREAPI_PATH
+           PATH_SUFFIXES include NO_DEFAULT_PATH )
+
+find_path( LUSTREAPI_INCLUDE_DIR lustre/lustreapi.h PATH_SUFFIXES include )
+
+find_library( LUSTREAPI_LIBRARY NAMES lustreapi
+              PATHS ${LUSTREAPI_DIR} ${LUSTREAPI_PATH} ENV LUSTREAPI_DIR ENV LUSTREAPI_PATH
+              PATH_SUFFIXES lib lib64 NO_DEFAULT_PATH )
+find_library( LUSTREAPI_LIBRARY NAMES lustreapi PATH_SUFFIXES lib lib64 )
+
+set( LUSTREAPI_LIBRARIES    ${LUSTREAPI_LIBRARY} )
+set( LUSTREAPI_INCLUDE_DIRS ${LUSTREAPI_INCLUDE_DIR} )
+
+include(FindPackageHandleStandardArgs)
+
+find_package_handle_standard_args(LUSTREAPI  DEFAULT_MSG LUSTREAPI_LIBRARY LUSTREAPI_INCLUDE_DIR)
+
+mark_as_advanced(LUSTREAPI_INCLUDE_DIR LUSTREAPI_LIBRARY )
diff --git a/cmake/FindMKL.cmake b/cmake/FindMKL.cmake
index 5941179..59eaa60 100644
--- a/cmake/FindMKL.cmake
+++ b/cmake/FindMKL.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindNDBM.cmake b/cmake/FindNDBM.cmake
index 869223f..8cd350e 100644
--- a/cmake/FindNDBM.cmake
+++ b/cmake/FindNDBM.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 # 
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
diff --git a/cmake/FindNetCDF.cmake b/cmake/FindNetCDF.cmake
index 9084549..69b88bd 100644
--- a/cmake/FindNetCDF.cmake
+++ b/cmake/FindNetCDF.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindNetCDF3.cmake b/cmake/FindNetCDF3.cmake
index 5519fd6..1783a72 100644
--- a/cmake/FindNetCDF3.cmake
+++ b/cmake/FindNetCDF3.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 # 
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
diff --git a/cmake/FindODB.cmake b/cmake/FindODB.cmake
index 1beb5c8..7c35d6e 100644
--- a/cmake/FindODB.cmake
+++ b/cmake/FindODB.cmake
@@ -1,4 +1,4 @@
-# © Copyright 1996-2016 ECMWF.
+# © Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindOpenCL.cmake b/cmake/FindOpenCL.cmake
index 9b6e978..510a3a9 100644
--- a/cmake/FindOpenCL.cmake
+++ b/cmake/FindOpenCL.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindOpenJPEG.cmake b/cmake/FindOpenJPEG.cmake
index c660238..66d976e 100644
--- a/cmake/FindOpenJPEG.cmake
+++ b/cmake/FindOpenJPEG.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindPGIFortran.cmake b/cmake/FindPGIFortran.cmake
index e68bdf6..5d33239 100644
--- a/cmake/FindPGIFortran.cmake
+++ b/cmake/FindPGIFortran.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 # 
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
diff --git a/cmake/FindPango.cmake b/cmake/FindPango.cmake
index 76e152a..f135864 100644
--- a/cmake/FindPango.cmake
+++ b/cmake/FindPango.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindPangoCairo.cmake b/cmake/FindPangoCairo.cmake
index 9979550..cb70737 100644
--- a/cmake/FindPangoCairo.cmake
+++ b/cmake/FindPangoCairo.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindREADLINE.cmake b/cmake/FindREADLINE.cmake
index 2ba08b4..a146c62 100644
--- a/cmake/FindREADLINE.cmake
+++ b/cmake/FindREADLINE.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindRPCGEN.cmake b/cmake/FindRPCGEN.cmake
index fd42e9f..42ed90c 100644
--- a/cmake/FindRPCGEN.cmake
+++ b/cmake/FindRPCGEN.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 # 
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
diff --git a/cmake/FindRealtime.cmake b/cmake/FindRealtime.cmake
index 843a54f..78fa4c5 100644
--- a/cmake/FindRealtime.cmake
+++ b/cmake/FindRealtime.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 # 
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
diff --git a/cmake/FindSZip.cmake b/cmake/FindSZip.cmake
index 925348c..f005546 100644
--- a/cmake/FindSZip.cmake
+++ b/cmake/FindSZip.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindTrilinos.cmake b/cmake/FindTrilinos.cmake
index 0d99b54..b1584f8 100644
--- a/cmake/FindTrilinos.cmake
+++ b/cmake/FindTrilinos.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 # 
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
diff --git a/cmake/FindViennaCL.cmake b/cmake/FindViennaCL.cmake
index aba2980..8f442c9 100644
--- a/cmake/FindViennaCL.cmake
+++ b/cmake/FindViennaCL.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindXLFortranLibs.cmake b/cmake/FindXLFortranLibs.cmake
index 37800c7..80f2923 100644
--- a/cmake/FindXLFortranLibs.cmake
+++ b/cmake/FindXLFortranLibs.cmake
@@ -1,4 +1,4 @@
-# © Copyright 1996-2016 ECMWF.
+# © Copyright 1996-2017 ECMWF.
 # 
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
diff --git a/cmake/FindYACC.cmake b/cmake/FindYACC.cmake
index 7b15bfe..3eb3b5c 100644
--- a/cmake/FindYACC.cmake
+++ b/cmake/FindYACC.cmake
@@ -41,7 +41,7 @@
 # This file is based on the FindFLEX CMake macro, and adapted by ECMWF
 
 #=============================================================================
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/Findgrib_api.cmake b/cmake/Findgrib_api.cmake
index ab6fc0b..c6f6421 100644
--- a/cmake/Findgrib_api.cmake
+++ b/cmake/Findgrib_api.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/Findodb_api.cmake b/cmake/Findodb_api.cmake
index 0058fbe..00f4152 100644
--- a/cmake/Findodb_api.cmake
+++ b/cmake/Findodb_api.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/Findspot.cmake b/cmake/Findspot.cmake
index 52e0fb5..d932bfe 100644
--- a/cmake/Findspot.cmake
+++ b/cmake/Findspot.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/VERSION.cmake b/cmake/VERSION.cmake
index d9d8705..ce5f7de 100644
--- a/cmake/VERSION.cmake
+++ b/cmake/VERSION.cmake
@@ -1,7 +1,7 @@
 set( ECBUILD_MAJOR_VERSION "2" )
-set( ECBUILD_MINOR_VERSION "5" )
+set( ECBUILD_MINOR_VERSION "6" )
 set( ECBUILD_PATCH_VERSION "0" )
 
-set( ECBUILD_VERSION_STR  "2.5.0" )
+set( ECBUILD_VERSION_STR  "2.6.0" )
 
 set( ECBUILD_MACRO_VERSION "${ECBUILD_MAJOR_VERSION}.${ECBUILD_MINOR_VERSION}" )
diff --git a/cmake/compiler_flags/Clang_C.cmake b/cmake/compiler_flags/Clang_C.cmake
index bc73c69..b742a5b 100644
--- a/cmake/compiler_flags/Clang_C.cmake
+++ b/cmake/compiler_flags/Clang_C.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/compiler_flags/Clang_CXX.cmake b/cmake/compiler_flags/Clang_CXX.cmake
index 53f0f21..7570630 100644
--- a/cmake/compiler_flags/Clang_CXX.cmake
+++ b/cmake/compiler_flags/Clang_CXX.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/compiler_flags/Cray_C.cmake b/cmake/compiler_flags/Cray_C.cmake
index f487cf4..f9b6e4b 100644
--- a/cmake/compiler_flags/Cray_C.cmake
+++ b/cmake/compiler_flags/Cray_C.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/compiler_flags/Cray_CXX.cmake b/cmake/compiler_flags/Cray_CXX.cmake
index a2a6632..fdc4749 100644
--- a/cmake/compiler_flags/Cray_CXX.cmake
+++ b/cmake/compiler_flags/Cray_CXX.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/compiler_flags/Cray_Fortran.cmake b/cmake/compiler_flags/Cray_Fortran.cmake
index 34b96e4..8575bba 100644
--- a/cmake/compiler_flags/Cray_Fortran.cmake
+++ b/cmake/compiler_flags/Cray_Fortran.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/compiler_flags/GNU_C.cmake b/cmake/compiler_flags/GNU_C.cmake
index 955f527..288fc70 100644
--- a/cmake/compiler_flags/GNU_C.cmake
+++ b/cmake/compiler_flags/GNU_C.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/compiler_flags/GNU_CXX.cmake b/cmake/compiler_flags/GNU_CXX.cmake
index 0ab8c3a..1a01e2d 100644
--- a/cmake/compiler_flags/GNU_CXX.cmake
+++ b/cmake/compiler_flags/GNU_CXX.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/compiler_flags/GNU_Fortran.cmake b/cmake/compiler_flags/GNU_Fortran.cmake
index a12abec..6e28844 100644
--- a/cmake/compiler_flags/GNU_Fortran.cmake
+++ b/cmake/compiler_flags/GNU_Fortran.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/compiler_flags/Intel_C.cmake b/cmake/compiler_flags/Intel_C.cmake
index dbea59f..5736004 100644
--- a/cmake/compiler_flags/Intel_C.cmake
+++ b/cmake/compiler_flags/Intel_C.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/compiler_flags/Intel_CXX.cmake b/cmake/compiler_flags/Intel_CXX.cmake
index 5b8dc78..8e466e5 100644
--- a/cmake/compiler_flags/Intel_CXX.cmake
+++ b/cmake/compiler_flags/Intel_CXX.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/compiler_flags/Intel_Fortran.cmake b/cmake/compiler_flags/Intel_Fortran.cmake
index 86b69dc..abd85f8 100644
--- a/cmake/compiler_flags/Intel_Fortran.cmake
+++ b/cmake/compiler_flags/Intel_Fortran.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/compiler_flags/PGI_C.cmake b/cmake/compiler_flags/PGI_C.cmake
index 6784a14..1cc6485 100644
--- a/cmake/compiler_flags/PGI_C.cmake
+++ b/cmake/compiler_flags/PGI_C.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/compiler_flags/PGI_CXX.cmake b/cmake/compiler_flags/PGI_CXX.cmake
index 877ef3f..6d31cf4 100644
--- a/cmake/compiler_flags/PGI_CXX.cmake
+++ b/cmake/compiler_flags/PGI_CXX.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/compiler_flags/PGI_Fortran.cmake b/cmake/compiler_flags/PGI_Fortran.cmake
index a268cc9..86c2a35 100644
--- a/cmake/compiler_flags/PGI_Fortran.cmake
+++ b/cmake/compiler_flags/PGI_Fortran.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild-config-version.cmake b/cmake/ecbuild-config-version.cmake
index 735aaf1..3ca2385 100644
--- a/cmake/ecbuild-config-version.cmake
+++ b/cmake/ecbuild-config-version.cmake
@@ -1,4 +1,4 @@
-set(PACKAGE_VERSION "2.5.0")
+set(PACKAGE_VERSION "2.6.0")
 
 # check whether the requested PACKAGE_FIND_VERSION is compatible
 
diff --git a/cmake/ecbuild-config.cmake b/cmake/ecbuild-config.cmake
index 260664d..1aad5ac 100644
--- a/cmake/ecbuild-config.cmake
+++ b/cmake/ecbuild-config.cmake
@@ -28,9 +28,9 @@ set( ECBUILD_TPL_INCLUDE_DIRS  "" )
 set( ECBUILD_TPL_DEFINITIONS   "" )
 set( ECBUILD_TPL_LIBRARIES     "" )
 
-set( ECBUILD_VERSION           "2.5.0" )
-set( ECBUILD_GIT_SHA1          "7ec05b00ab6843a69d6dff1f0c0450ca894b409b" )
-set( ECBUILD_GIT_SHA1_SHORT    "7ec05b0" )
+set( ECBUILD_VERSION           "2.6.0" )
+set( ECBUILD_GIT_SHA1          "2967c31ee4768c165e61cab919c370a54dde0772" )
+set( ECBUILD_GIT_SHA1_SHORT    "2967c31" )
 
 ### export include paths as absolute paths
 
diff --git a/cmake/ecbuild_add_c_flags.cmake b/cmake/ecbuild_add_c_flags.cmake
index 098c254..138e4d8 100644
--- a/cmake/ecbuild_add_c_flags.cmake
+++ b/cmake/ecbuild_add_c_flags.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_add_cxx11_flags.cmake b/cmake/ecbuild_add_cxx11_flags.cmake
index df8cde5..6c5c861 100644
--- a/cmake/ecbuild_add_cxx11_flags.cmake
+++ b/cmake/ecbuild_add_cxx11_flags.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_add_cxx_flags.cmake b/cmake/ecbuild_add_cxx_flags.cmake
index 5104880..699c50a 100644
--- a/cmake/ecbuild_add_cxx_flags.cmake
+++ b/cmake/ecbuild_add_cxx_flags.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_add_executable.cmake b/cmake/ecbuild_add_executable.cmake
index 424059e..5d78348 100644
--- a/cmake/ecbuild_add_executable.cmake
+++ b/cmake/ecbuild_add_executable.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -142,6 +142,28 @@ macro( ecbuild_add_executable )
 
   if( _${_PAR_TARGET}_condition )
 
+    # insert already compiled objects (from OBJECT libraries)
+    unset( _all_objects )
+    foreach( _obj ${_PAR_OBJECTS} )
+      list( APPEND _all_objects $<TARGET_OBJECTS:${_obj}> )
+    endforeach()
+
+    list( APPEND _PAR_SOURCES ${_glob_srcs} )
+
+    if( ECBUILD_LIST_SOURCES )
+      ecbuild_debug("ecbuild_add_library(${_PAR_TARGET}): sources ${_PAR_SOURCES}")
+    endif()
+
+    # glob sources
+    unset( _glob_srcs )
+    foreach( pattern ${_PAR_SOURCES_GLOB} )
+      ecbuild_list_add_pattern( LIST _glob_srcs GLOB "${pattern}" )
+    endforeach()
+
+    foreach( pattern ${_PAR_SOURCES_EXCLUDE_REGEX} )
+      ecbuild_list_exclude_pattern( LIST _glob_srcs REGEX "${pattern}" )
+    endforeach()
+
     # add persistent layer files
     if( DEFINED _PAR_PERSISTENT )
       if( DEFINED PERSISTENT_NAMESPACE )
@@ -158,29 +180,26 @@ macro( ecbuild_add_executable )
       add_custom_target( ${_PAR_TARGET}_templates SOURCES ${_PAR_TEMPLATES} )
     endif()
 
-    # glob sources
-    unset( _glob_srcs )
-    foreach( pattern ${_PAR_SOURCES_GLOB} )
-        ecbuild_list_add_pattern( LIST _glob_srcs GLOB "${pattern}" )
-    endforeach()
-
-    foreach( pattern ${_PAR_SOURCES_EXCLUDE_REGEX} )
-        ecbuild_list_exclude_pattern( LIST _glob_srcs REGEX "${pattern}" )
-    endforeach()
-
-    # insert already compiled objects (from OBJECT libraries)
-    unset( _all_objects )
-    foreach( _obj ${_PAR_OBJECTS} )
-      list( APPEND _all_objects $<TARGET_OBJECTS:${_obj}> )
-    endforeach()
-
-    list( APPEND _PAR_SOURCES ${_glob_srcs} )
+    # Separate sources
+    if( _PAR_SOURCES )
+      ecbuild_separate_sources( TARGET ${_PAR_TARGET} SOURCES ${_PAR_SOURCES} )
+    endif()
 
-    if( ECBUILD_LIST_SOURCES )
-      ecbuild_debug("ecbuild_add_library(${_PAR_TARGET}): sources ${_PAR_SOURCES}")
+    if( ${_PAR_TARGET}_cuda_srcs )
+      if( NOT CUDA_FOUND )
+        ecbuild_error("ecbuild_add_executable(${_PAR_TARGET}): CUDA source files detected"
+                      "but CUDA was not found.")
+      endif()
+      ecbuild_debug("ecbuild_add_executable(${_PAR_TARGET}): CUDA sources detected."
+                    "Building executable with ecbuild_add_executable() rather than intrinsic"
+                    "add_executable().")
     endif()
 
-    add_executable( ${_PAR_TARGET} ${_PAR_SOURCES} ${_all_objects} )
+    if( NOT ${_PAR_TARGET}_cuda_srcs )
+      add_executable( ${_PAR_TARGET} ${_PAR_SOURCES} ${_all_objects} )
+    else()
+      cuda_add_executable( ${_PAR_TARGET} ${_PAR_SOURCES}  ${_all_objects} )
+    endif()
 
     # ecbuild_echo_target( ${_PAR_TARGET} )
 
@@ -225,15 +244,6 @@ macro( ecbuild_add_executable )
       endforeach()
     endif()
 
-    # filter sources
-
-    ecbuild_separate_sources( TARGET ${_PAR_TARGET} SOURCES ${_PAR_SOURCES} )
-
-    #   ecbuild_debug_var( ${_PAR_TARGET}_h_srcs )
-    #   ecbuild_debug_var( ${_PAR_TARGET}_c_srcs )
-    #   ecbuild_debug_var( ${_PAR_TARGET}_cxx_srcs )
-    #   ecbuild_debug_var( ${_PAR_TARGET}_fortran_srcs )
-
     # Override compilation flags on a per source file basis
     ecbuild_target_flags( ${_PAR_TARGET} "${_PAR_CFLAGS}" "${_PAR_CXXFLAGS}" "${_PAR_FFLAGS}" )
 
diff --git a/cmake/ecbuild_add_extra_search_paths.cmake b/cmake/ecbuild_add_extra_search_paths.cmake
index 94ac85b..690cde6 100644
--- a/cmake/ecbuild_add_extra_search_paths.cmake
+++ b/cmake/ecbuild_add_extra_search_paths.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_add_fortran_flags.cmake b/cmake/ecbuild_add_fortran_flags.cmake
index 0d3b544..2ac89e8 100644
--- a/cmake/ecbuild_add_fortran_flags.cmake
+++ b/cmake/ecbuild_add_fortran_flags.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_add_library.cmake b/cmake/ecbuild_add_library.cmake
index a7f8001..ee29008 100644
--- a/cmake/ecbuild_add_library.cmake
+++ b/cmake/ecbuild_add_library.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -200,6 +200,26 @@ function( ecbuild_add_library_impl )
       ecbuild_debug("ecbuild_add_library(${_PAR_TARGET}): library type is ${_PAR_TYPE}")
     endif()
 
+    # insert already compiled objects (from OBJECT libraries)
+    unset( _all_objects )
+    foreach( _obj ${_PAR_OBJECTS} )
+      list( APPEND _all_objects $<TARGET_OBJECTS:${_obj}> )
+    endforeach()
+
+    # glob sources
+    unset( _glob_srcs )
+    foreach( pattern ${_PAR_SOURCES_GLOB} )
+      ecbuild_list_add_pattern( LIST _glob_srcs GLOB "${pattern}" )
+    endforeach()
+
+    foreach( pattern ${_PAR_SOURCES_EXCLUDE_REGEX} )
+      ecbuild_list_exclude_pattern( LIST _glob_srcs REGEX "${pattern}" )
+    endforeach()
+    list( APPEND _PAR_SOURCES ${_glob_srcs} )
+
+    if( ECBUILD_LIST_SOURCES )
+      ecbuild_debug("ecbuild_add_library(${_PAR_TARGET}): sources ${_PAR_SOURCES}")
+    endif()
 
     # add persistent layer files
     if( DEFINED _PAR_PERSISTENT )
@@ -217,30 +237,30 @@ function( ecbuild_add_library_impl )
       add_custom_target( ${_PAR_TARGET}_templates SOURCES ${_PAR_TEMPLATES} )
     endif()
 
-    # glob sources
-    unset( _glob_srcs )
-    foreach( pattern ${_PAR_SOURCES_GLOB} )
-        ecbuild_list_add_pattern( LIST _glob_srcs GLOB "${pattern}" )
-    endforeach()
-
-    foreach( pattern ${_PAR_SOURCES_EXCLUDE_REGEX} )
-        ecbuild_list_exclude_pattern( LIST _glob_srcs REGEX "${pattern}" )
-    endforeach()
-
-    # insert already compiled objects (from OBJECT libraries)
-    unset( _all_objects )
-    foreach( _obj ${_PAR_OBJECTS} )
-      list( APPEND _all_objects $<TARGET_OBJECTS:${_obj}> )
-    endforeach()
-
-    list( APPEND _PAR_SOURCES ${_glob_srcs} )
-
-    if( ECBUILD_LIST_SOURCES )
-      ecbuild_debug("ecbuild_add_library(${_PAR_TARGET}): sources ${_PAR_SOURCES}")
+    # Separate sources
+    if( _PAR_SOURCES )
+      ecbuild_separate_sources( TARGET ${_PAR_TARGET} SOURCES ${_PAR_SOURCES} )
     endif()
 
-    add_library( ${_PAR_TARGET} ${_PAR_TYPE} ${_PAR_SOURCES}  ${_all_objects} )
+    if( ${_PAR_TARGET}_cuda_srcs )
+      if( NOT CUDA_FOUND )
+          ecbuild_error("ecbuild_add_library(${_PAR_TARGET}): CUDA source files detected"
+                        "but CUDA was not found.")
+      endif()
+      if( _PAR_TYPE MATCHES "OBJECT" )
+          ecbuild_error("ecbuild_add_library(${_PAR_TARGET}): CUDA source files detected"
+                        "but CMake OBJECT libraries with CUDA are not supported.")
+      endif()
+      ecbuild_debug("ecbuild_add_library(${_PAR_TARGET}): CUDA sources detected."
+                    "Building library with cuda_add_library() rather than intrinsic"
+                    "add_library().")
+    endif()
 
+    if( NOT ${_PAR_TARGET}_cuda_srcs )
+      add_library( ${_PAR_TARGET} ${_PAR_TYPE} ${_PAR_SOURCES}  ${_all_objects} )
+    else()
+      cuda_add_library( ${_PAR_TARGET} ${_PAR_TYPE} ${_PAR_SOURCES}  ${_all_objects} )
+    endif()
     # ecbuild_echo_target( ${_PAR_TARGET} )
 
     # set OUTPUT_NAME
@@ -363,17 +383,6 @@ function( ecbuild_add_library_impl )
       endif()
     endif()
 
-    # filter sources
-
-    if( _PAR_SOURCES )
-      ecbuild_separate_sources( TARGET ${_PAR_TARGET} SOURCES ${_PAR_SOURCES} )
-    endif()
-
-    #   ecbuild_debug_var( ${_PAR_TARGET}_h_srcs )
-    #   ecbuild_debug_var( ${_PAR_TARGET}_c_srcs )
-    #   ecbuild_debug_var( ${_PAR_TARGET}_cxx_srcs )
-    #   ecbuild_debug_var( ${_PAR_TARGET}_fortran_srcs )
-
     # Override compilation flags on a per source file basis
     ecbuild_target_flags( ${_PAR_TARGET} "${_PAR_CFLAGS}" "${_PAR_CXXFLAGS}" "${_PAR_FFLAGS}" )
 
@@ -536,7 +545,10 @@ macro( ecbuild_add_library )
         ecbuild_add_library_impl( TARGET ${_p_TARGET}        TYPE SHARED ${_p_UNPARSED_ARGUMENTS} )
         ecbuild_add_library_impl( TARGET ${_p_TARGET}-static TYPE STATIC ${_p_UNPARSED_ARGUMENTS} DEPENDS ${_p_TARGET} )
 
-        set_target_properties( ${_p_TARGET}-static PROPERTIES OUTPUT_NAME ${_p_TARGET} )
+        # If the library is built conditionally the target might not exist
+        if ( TARGET ${_p_TARGET}-static )
+          set_target_properties( ${_p_TARGET}-static PROPERTIES OUTPUT_NAME ${_p_TARGET} )
+        endif()
 
       else()
 
diff --git a/cmake/ecbuild_add_option.cmake b/cmake/ecbuild_add_option.cmake
index fd8076e..6d5363f 100644
--- a/cmake/ecbuild_add_option.cmake
+++ b/cmake/ecbuild_add_option.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -17,7 +17,6 @@
 #   ecbuild_add_option( FEATURE <name>
 #                       [ DEFAULT ON|OFF ]
 #                       [ DESCRIPTION <description> ]
-#                       [ PURPOSE <purpose> ]
 #                       [ REQUIRED_PACKAGES <package1> [<package2> ...] ]
 #                       [ CONDITION <condition> ]
 #                       [ ADVANCED ] [ NO_TPL ] )
@@ -34,12 +33,6 @@
 # DESCRIPTION : optional
 #   string describing the feature (shown in summary and stored in the cache)
 #
-# TYPE : optional, one of RUNTIME|OPTIONAL|RECOMMENDED|REQUIRED
-#   type of dependency of the project on this package (defaults to OPTIONAL)
-#
-# PURPOSE : optional
-#   string describing which functionality this package enables in the project
-#
 # REQUIRED_PACKAGES : optional
 #   list of packages required to be found for this feature to be enabled
 #
@@ -59,6 +52,22 @@
 #   The entire specification must be enclosed in quotes and is passed on
 #   verbatim. Any options of ``ecbuild_use_package`` are supported.
 #
+#   .. note::
+#
+#     Arguments inside the package string that require quoting need to use the
+#     `bracket argument syntax`_ introduced in CMake 3.0 since
+#     regular quotes even when escaped are swallowed by the CMake parser.
+#
+#     Alternatively, the name of a CMake variable containing the string can be
+#     passed, which will be expanded by ``ecbuild_find_package``: ::
+#
+#       set( ECCODES_FAIL_MSG
+#            "grib_api can be used instead (select with -DENABLE_ECCODES=OFF)" )
+#       ecbuild_add_option( FEATURE ECCODES
+#                           DESCRIPTION "Use eccodes instead of grib_api"
+#                           REQUIRED_PACKAGES "PROJECT eccodes REQUIRED FAILURE_MSG ECCODES_FAIL_MSG"
+#                           DEFAULT ON )
+#
 # CONDITION : optional
 #   conditional expression which must evaluate to true for this option to be
 #   enabled (must be valid in a CMake ``if`` statement)
@@ -83,6 +92,8 @@
 # With an already populated cache, use ``-DENABLE_<FEATURE>=REQUIRE`` to make
 # the feature a required feature (this cannot be done via the CMake GUI).
 #
+# .. _bracket argument syntax: https://cmake.org/cmake/help/latest/manual/cmake-language.7.html#bracket-argument
+#
 ##############################################################################
 
 macro( ecbuild_add_option )
@@ -114,8 +125,11 @@ macro( ecbuild_add_option )
   endif()
   ecbuild_debug("ecbuild_add_option(${_p_FEATURE}): defaults to ${_p_DEFAULT}")
 
-  if( NOT _p_TYPE  )
-    set( _p_TYPE OPTIONAL )
+  if( _p_PURPOSE  )
+    ecbuild_deprecate( "ecbuild_add_option: argument PURPOSE is ignored and will be removed in a future release." )
+  endif()
+  if( _p_TYPE  )
+    ecbuild_deprecate( "ecbuild_add_option: argument TYPE is ignored and will be removed in a future release." )
   endif()
 
   # check CONDITION parameter
@@ -154,13 +168,14 @@ macro( ecbuild_add_option )
   # define the option -- for cmake GUI
 
   option( ENABLE_${_p_FEATURE} "${_p_DESCRIPTION}" ${_p_DEFAULT} )
-  ecbuild_debug("ecbuild_add_option(${_p_FEATURE}): defining option ENABLE_${_p_FEATURE} '${_p_DESCRIPTION}' ${_p_DEFAULT}")
-  ecbuild_set_feature( ${_p_FEATURE} ENABLED ${_p_DEFAULT} )
-  set_package_properties( ${_p_FEATURE} PROPERTIES
-                          DESCRIPTION "${_p_DESCRIPTION}"
-                          TYPE ${_p_TYPE}
-                          PURPOSE "${_p_PURPOSE}" )
+  get_property( _feature_desc GLOBAL PROPERTY _CMAKE_${_p_FEATURE}_DESCRIPTION )
+  if( _feature_desc )
+    add_feature_info( ${_p_FEATURE} ENABLE_${_p_FEATURE} "${_feature_desc}, ${PROJECT_NAME}: ${_p_DESCRIPTION}" )
+  else()
+    add_feature_info( ${_p_FEATURE} ENABLE_${_p_FEATURE} "${PROJECT_NAME}: ${_p_DESCRIPTION}" )
+  endif()
 
+  ecbuild_debug("ecbuild_add_option(${_p_FEATURE}): defining option ENABLE_${_p_FEATURE} '${_p_DESCRIPTION}' ${_p_DEFAULT}")
   ecbuild_debug("ecbuild_add_option(${_p_FEATURE}): ENABLE_${_p_FEATURE}=${ENABLE_${_p_FEATURE}}")
 
   if( ENABLE_${_p_FEATURE} )
@@ -183,6 +198,12 @@ macro( ecbuild_add_option )
         if( pkgname STREQUAL "PROJECT" )  # if 1st entry is PROJECT, then we are looking for a ecbuild project
           set( pkgproject 1 )
           list( GET pkglist 1 pkgname )
+          # Use feature description as package description if there is none
+          list( FIND pkglist DESCRIPTION __description )
+          if( __description LESS 0 )
+            ecbuild_debug("ecbuild_add_option(${_p_FEATURE}): no description for ${pkgname}, using feature description '${_p_DESCRIPTION}'")
+            list( APPEND pkglist DESCRIPTION "${_p_DESCRIPTION}" )
+          endif()
         else()                            # else 1st entry is package name
           set( pkgproject 0 )
         endif()
@@ -209,7 +230,14 @@ macro( ecbuild_add_option )
 
           else()
 
-            if( pkgname STREQUAL "MPI" )
+            if( pkgname STREQUAL "LAPACK" )
+              ecbuild_debug("ecbuild_add_option(${_p_FEATURE}): searching for LAPACK - ecbuild_find_package( NAME ${pkglist} )")
+              ecbuild_find_package( NAME ${pkglist} )
+              if( HAVE_LAPACK AND TARGET lapack )
+                ecbuild_debug( "LAPACK found as CMake target lapack" )
+                set( LAPACK_LIBRARIES lapack )
+              endif()
+            elseif( pkgname STREQUAL "MPI" )
               set( _find_args ${pkglist} )
               list( REMOVE_ITEM _find_args "MPI" )
               ecbuild_debug("ecbuild_add_option(${_p_FEATURE}): searching for MPI - ecbuild_find_mpi( ${_find_args} )")
@@ -270,15 +298,18 @@ macro( ecbuild_add_option )
       set( HAVE_${_p_FEATURE} 0 )
     endif( _${_p_FEATURE}_condition )
 
-    ecbuild_set_feature( ${_p_FEATURE} ENABLED ${HAVE_${_p_FEATURE}} )
     # FINAL CHECK
 
     if( HAVE_${_p_FEATURE} )
 
+      ecbuild_enable_feature( ${_p_FEATURE} )
+
       ecbuild_info( "Feature ${_p_FEATURE} enabled" )
 
     else() # if user provided input and we cannot satisfy FAIL otherwise WARN
 
+      ecbuild_disable_feature( ${_p_FEATURE} )
+
       if( ${_p_FEATURE}_user_provided_input )
         if( NOT _${_p_FEATURE}_condition )
           string(REPLACE ";" " " _condition_msg "${_p_CONDITION}")
@@ -294,7 +325,7 @@ macro( ecbuild_add_option )
           ecbuild_info( "Feature ${_p_FEATURE} was not enabled (also not requested) -- following required packages weren't found: ${_failed_to_find_packages}" )
         endif()
         set( ENABLE_${_p_FEATURE} OFF )
-        ecbuild_set_feature( ${_p_FEATURE} ENABLED OFF )
+        ecbuild_disable_feature( ${_p_FEATURE} )
       endif()
 
     endif()
@@ -303,7 +334,7 @@ macro( ecbuild_add_option )
 
     ecbuild_debug("ecbuild_add_option(${_p_FEATURE}): feature disabled")
     set( HAVE_${_p_FEATURE} 0 )
-    ecbuild_set_feature( ${_p_FEATURE} ENABLED OFF )
+    ecbuild_disable_feature( ${_p_FEATURE} )
 
   endif()
 
diff --git a/cmake/ecbuild_add_persistent.cmake b/cmake/ecbuild_add_persistent.cmake
index 42bb44b..e5a875b 100644
--- a/cmake/ecbuild_add_persistent.cmake
+++ b/cmake/ecbuild_add_persistent.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_add_resources.cmake b/cmake/ecbuild_add_resources.cmake
index cf0543b..2dfaa5e 100644
--- a/cmake/ecbuild_add_resources.cmake
+++ b/cmake/ecbuild_add_resources.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 # 
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
diff --git a/cmake/ecbuild_add_test.cmake b/cmake/ecbuild_add_test.cmake
index 1dcf2c6..1da8568 100644
--- a/cmake/ecbuild_add_test.cmake
+++ b/cmake/ecbuild_add_test.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_append_to_rpath.cmake b/cmake/ecbuild_append_to_rpath.cmake
index 9ecde3e..895f837 100644
--- a/cmake/ecbuild_append_to_rpath.cmake
+++ b/cmake/ecbuild_append_to_rpath.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_bundle.cmake b/cmake/ecbuild_bundle.cmake
index aee900c..6a49354 100644
--- a/cmake/ecbuild_bundle.cmake
+++ b/cmake/ecbuild_bundle.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -165,13 +165,30 @@ endmacro()
 #
 #   ecbuild_bundle_finalize()
 #
+# Options
+# -------
+#
+# See documentation for ecbuild_install_project() since all arguments are
+# forwarded to an internal call to that macro.
+#
+# If no arguments are passed, then the default installation NAME is set to
+# the default project name ${CMAKE_PROJECT_NAME}
+#
 ##############################################################################
 
 macro( ecbuild_bundle_finalize )
 
   add_custom_target( update DEPENDS ${git_update_targets} )
 
-  ecbuild_install_project( NAME ${CMAKE_PROJECT_NAME} )
+  ecbuild_info("---------------------------------------------------------")
+  ecbuild_info("Bundle ${CMAKE_PROJECT_NAME}")
+  ecbuild_info("---------------------------------------------------------")
+
+  if("${ARGV1}")
+      ecbuild_install_project( ${ARGV} )
+  else()
+      ecbuild_install_project( NAME ${CMAKE_PROJECT_NAME} )
+  endif()
 
   ecbuild_print_summary()
 
diff --git a/cmake/ecbuild_cache.cmake b/cmake/ecbuild_cache.cmake
index e257b36..d45b31a 100644
--- a/cmake/ecbuild_cache.cmake
+++ b/cmake/ecbuild_cache.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 # 
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
diff --git a/cmake/ecbuild_check_c_source_return.cmake b/cmake/ecbuild_check_c_source_return.cmake
index 18b6117..38d89f7 100644
--- a/cmake/ecbuild_check_c_source_return.cmake
+++ b/cmake/ecbuild_check_c_source_return.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 # 
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
diff --git a/cmake/ecbuild_check_compiler.cmake b/cmake/ecbuild_check_compiler.cmake
index 437b81e..197f0b5 100644
--- a/cmake/ecbuild_check_compiler.cmake
+++ b/cmake/ecbuild_check_compiler.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_check_cxx11.cmake b/cmake/ecbuild_check_cxx11.cmake
index 9552389..d2f9629 100644
--- a/cmake/ecbuild_check_cxx11.cmake
+++ b/cmake/ecbuild_check_cxx11.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_check_cxx_source_return.cmake b/cmake/ecbuild_check_cxx_source_return.cmake
index 0868b22..7270540 100644
--- a/cmake/ecbuild_check_cxx_source_return.cmake
+++ b/cmake/ecbuild_check_cxx_source_return.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_check_fortran.cmake b/cmake/ecbuild_check_fortran.cmake
index 5612134..d7a63cf 100644
--- a/cmake/ecbuild_check_fortran.cmake
+++ b/cmake/ecbuild_check_fortran.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_check_fortran_source_return.cmake b/cmake/ecbuild_check_fortran_source_return.cmake
index 175f4ef..92168b9 100644
--- a/cmake/ecbuild_check_fortran_source_return.cmake
+++ b/cmake/ecbuild_check_fortran_source_return.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 # 
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
diff --git a/cmake/ecbuild_check_functions.cmake b/cmake/ecbuild_check_functions.cmake
index 73f5cb5..4307429 100644
--- a/cmake/ecbuild_check_functions.cmake
+++ b/cmake/ecbuild_check_functions.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_check_os.cmake b/cmake/ecbuild_check_os.cmake
index 8d325dc..be92c87 100644
--- a/cmake/ecbuild_check_os.cmake
+++ b/cmake/ecbuild_check_os.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -42,35 +42,32 @@ endif()
 
 if( ENABLE_OS_TYPES_TEST )
 
-	set( EC_SIZEOF_PTR ${CMAKE_SIZEOF_VOID_P} )
-	ecbuild_cache_var( EC_SIZEOF_PTR )
-    ecbuild_cache_check_type_size( char           EC_SIZEOF_CHAR        )
-    ecbuild_cache_check_type_size( short          EC_SIZEOF_SHORT       )
-	ecbuild_cache_check_type_size( int            EC_SIZEOF_INT         )
-	ecbuild_cache_check_type_size( long           EC_SIZEOF_LONG        )
-	ecbuild_cache_check_type_size( "long long"    EC_SIZEOF_LONG_LONG   )
-	ecbuild_cache_check_type_size( float          EC_SIZEOF_FLOAT       )
-	ecbuild_cache_check_type_size( double         EC_SIZEOF_DOUBLE      )
-	ecbuild_cache_check_type_size( "long double"  EC_SIZEOF_LONG_DOUBLE )
-	ecbuild_cache_check_type_size( size_t         EC_SIZEOF_SIZE_T      )
-	ecbuild_cache_check_type_size( ssize_t        EC_SIZEOF_SSIZE_T     )
-	ecbuild_cache_check_type_size( off_t          EC_SIZEOF_OFF_T       )
-
-#	ecbuild_info( "sizeof void*  [${EC_SIZEOF_PTR}]" )
-#	ecbuild_info( "sizeof off_t  [${EC_SIZEOF_OFF_T}]" )
-#	ecbuild_info( "sizeof int    [${EC_SIZEOF_INT}]" )
-#	ecbuild_info( "sizeof short  [${EC_SIZEOF_SHORT}]" )
-#	ecbuild_info( "sizeof long   [${EC_SIZEOF_LONG}]" )
-#	ecbuild_info( "sizeof size_t [${EC_SIZEOF_SIZE_T}]" )
-#	ecbuild_info( "sizeof float  [${EC_SIZEOF_FLOAT}]" )
-#	ecbuild_info( "sizeof double [${EC_SIZEOF_DOUBLE}]" )
-#	ecbuild_info( "sizeof long long   [${EC_SIZEOF_LONG_LONG}]" )
-#	ecbuild_info( "sizeof long double [${EC_SIZEOF_LONG_DOUBLE}]" )
-
-#	ecbuild_info( "system sizeof :" )
-#	ecbuild_info( "  void*  [${EC_SIZEOF_PTR}]  size_t [${EC_SIZEOF_SIZE_T}]  off_t  [${EC_SIZEOF_OFF_T}]   short  [${EC_SIZEOF_SHORT}]" )
-#	ecbuild_info( "  int    [${EC_SIZEOF_INT}]  long   [${EC_SIZEOF_LONG}]  long long   [${EC_SIZEOF_LONG_LONG}]" )
-#	ecbuild_info( "  float  [${EC_SIZEOF_FLOAT}]  double [${EC_SIZEOF_DOUBLE}]  long double [${EC_SIZEOF_LONG_DOUBLE}]" )
+  set( EC_SIZEOF_PTR ${CMAKE_SIZEOF_VOID_P} )
+  ecbuild_cache_var( EC_SIZEOF_PTR )
+  ecbuild_cache_check_type_size( char           EC_SIZEOF_CHAR        )
+  ecbuild_cache_check_type_size( short          EC_SIZEOF_SHORT       )
+  ecbuild_cache_check_type_size( int            EC_SIZEOF_INT         )
+  ecbuild_cache_check_type_size( long           EC_SIZEOF_LONG        )
+  ecbuild_cache_check_type_size( "long long"    EC_SIZEOF_LONG_LONG   )
+  ecbuild_cache_check_type_size( float          EC_SIZEOF_FLOAT       )
+  ecbuild_cache_check_type_size( double         EC_SIZEOF_DOUBLE      )
+  ecbuild_cache_check_type_size( "long double"  EC_SIZEOF_LONG_DOUBLE )
+  ecbuild_cache_check_type_size( size_t         EC_SIZEOF_SIZE_T      )
+  ecbuild_cache_check_type_size( ssize_t        EC_SIZEOF_SSIZE_T     )
+  ecbuild_cache_check_type_size( off_t          EC_SIZEOF_OFF_T       )
+
+  ecbuild_debug( "sizeof void*       [${EC_SIZEOF_PTR}]" )
+  ecbuild_debug( "sizeof char        [${EC_SIZEOF_CHAR}]" )
+  ecbuild_debug( "sizeof short       [${EC_SIZEOF_SHORT}]" )
+  ecbuild_debug( "sizeof int         [${EC_SIZEOF_INT}]" )
+  ecbuild_debug( "sizeof long        [${EC_SIZEOF_LONG}]" )
+  ecbuild_debug( "sizeof long long   [${EC_SIZEOF_LONG_LONG}]" )
+  ecbuild_debug( "sizeof float       [${EC_SIZEOF_FLOAT}]" )
+  ecbuild_debug( "sizeof double      [${EC_SIZEOF_DOUBLE}]" )
+  ecbuild_debug( "sizeof long double [${EC_SIZEOF_LONG_DOUBLE}]" )
+  ecbuild_debug( "sizeof size_t      [${EC_SIZEOF_SIZE_T}]" )
+  ecbuild_debug( "sizeof ssize_t     [${EC_SIZEOF_SSIZE_T}]" )
+  ecbuild_debug( "sizeof off_t       [${EC_SIZEOF_OFF_T}]" )
 
 endif()
 
@@ -84,25 +81,25 @@ if( ENABLE_LARGE_FILE_SUPPORT )
 
   ecbuild_cache_check_type_size( off_t EC_SIZEOF_OFF_T )
 
-	if( EC_SIZEOF_OFF_T LESS "8" )
+  if( EC_SIZEOF_OFF_T LESS "8" )
 
-		if( ${CMAKE_SYSTEM_NAME} MATCHES "Linux" OR ${CMAKE_SYSTEM_NAME} MATCHES "Darwin" )
-			add_definitions( -D_FILE_OFFSET_BITS=64 )
-		endif()
+    if( ${CMAKE_SYSTEM_NAME} MATCHES "Linux" OR ${CMAKE_SYSTEM_NAME} MATCHES "Darwin" )
+      add_definitions( -D_FILE_OFFSET_BITS=64 )
+    endif()
 
-		if( ${CMAKE_SYSTEM_NAME} MATCHES "AIX" )
-			add_definitions( -D_LARGE_FILES=64 )
-		endif()
+    if( ${CMAKE_SYSTEM_NAME} MATCHES "AIX" )
+      add_definitions( -D_LARGE_FILES=64 )
+    endif()
 
-		get_directory_property( __compile_defs COMPILE_DEFINITIONS )
+    get_directory_property( __compile_defs COMPILE_DEFINITIONS )
 
-		if( __compile_defs )
-			foreach( def ${__compile_defs} )
-				list( APPEND CMAKE_REQUIRED_DEFINITIONS -D${def} )
-			endforeach()
-		endif()
+    if( __compile_defs )
+      foreach( def ${__compile_defs} )
+        list( APPEND CMAKE_REQUIRED_DEFINITIONS -D${def} )
+      endforeach()
+    endif()
 
-	endif()
+  endif()
 
 endif()
 
@@ -113,15 +110,15 @@ if( ENABLE_OS_ENDINESS_TEST )
 
   if( NOT DEFINED EC_BIG_ENDIAN AND NOT DEFINED EC_LITTLE_ENDIAN )
 
-  	test_big_endian( _BIG_ENDIAN )
+    test_big_endian( _BIG_ENDIAN )
 
-  	if( _BIG_ENDIAN )
+    if( _BIG_ENDIAN )
         set( EC_BIG_ENDIAN    1 )
         set( EC_LITTLE_ENDIAN 0 )
-  	else()
+    else()
         set( EC_BIG_ENDIAN    0 )
         set( EC_LITTLE_ENDIAN 1 )
-  	endif()
+    endif()
 
   endif()
 
@@ -129,35 +126,35 @@ if( ENABLE_OS_ENDINESS_TEST )
   ecbuild_cache_var( EC_LITTLE_ENDIAN )
 
   if( NOT DEFINED IEEE_BE )
-  	check_c_source_runs(
-  		 "int compare(unsigned char* a,unsigned char* b) {
-  		   while(*a != 0) if (*(b++)!=*(a++)) return 1;
-  		   return 0;
-  		 }
-  		 int main(int argc,char** argv) {
-  		   unsigned char dc[]={0x30,0x61,0xDE,0x80,0x93,0x67,0xCC,0xD9,0};
-  		   double da=1.23456789e-75;
-  		   unsigned char* ca;
+    check_c_source_runs(
+       "int compare(unsigned char* a,unsigned char* b) {
+         while(*a != 0) if (*(b++)!=*(a++)) return 1;
+         return 0;
+       }
+       int main(int argc,char** argv) {
+         unsigned char dc[]={0x30,0x61,0xDE,0x80,0x93,0x67,0xCC,0xD9,0};
+         double da=1.23456789e-75;
+         unsigned char* ca;
 
-  		   unsigned char fc[]={0x05,0x83,0x48,0x22,0};
-  		   float fa=1.23456789e-35;
+         unsigned char fc[]={0x05,0x83,0x48,0x22,0};
+         float fa=1.23456789e-35;
 
-  		   if (sizeof(double)!=8) return 1;
+         if (sizeof(double)!=8) return 1;
 
-  		   ca=(unsigned char*)&da;
-  		   if (compare(dc,ca)) return 1;
+         ca=(unsigned char*)&da;
+         if (compare(dc,ca)) return 1;
 
-  		   if (sizeof(float)!=4) return 1;
+         if (sizeof(float)!=4) return 1;
 
-  		   ca=(unsigned char*)&fa;
-  		   if (compare(fc,ca)) return 1;
+         ca=(unsigned char*)&fa;
+         if (compare(fc,ca)) return 1;
 
-  		   return 0;
-  		 }" IEEE_BE )
+         return 0;
+       }" IEEE_BE )
 
-  	if( "${IEEE_BE}" STREQUAL "" )
-  		set( IEEE_BE 0 CACHE INTERNAL "Test IEEE_BE")
-  	endif()
+    if( "${IEEE_BE}" STREQUAL "" )
+      set( IEEE_BE 0 CACHE INTERNAL "Test IEEE_BE")
+    endif()
 
   endif()
 
@@ -167,36 +164,36 @@ if( ENABLE_OS_ENDINESS_TEST )
     ecbuild_critical("Failed to sanity check on endiness: OS should be Big-Endian but compiled code runs differently -- to ignore this pass -DIEEE_BE=0 to CMake/ecBuild")
   endif()
 
-    if( NOT DEFINED IEEE_LE )
-  	check_c_source_runs(
-  		 "int compare(unsigned char* a,unsigned char* b) {
-  		   while(*a != 0) if (*(b++)!=*(a++)) return 1;
-  		   return 0;
-  		 }
-  		 int main(int argc,char** argv) {
-  		   unsigned char dc[]={0xD9,0xCC,0x67,0x93,0x80,0xDE,0x61,0x30,0};
-  		   double da=1.23456789e-75;
-  		   unsigned char* ca;
+  if( NOT DEFINED IEEE_LE )
+    check_c_source_runs(
+       "int compare(unsigned char* a,unsigned char* b) {
+         while(*a != 0) if (*(b++)!=*(a++)) return 1;
+         return 0;
+       }
+       int main(int argc,char** argv) {
+         unsigned char dc[]={0xD9,0xCC,0x67,0x93,0x80,0xDE,0x61,0x30,0};
+         double da=1.23456789e-75;
+         unsigned char* ca;
 
-  		   unsigned char fc[]={0x22,0x48,0x83,0x05,0};
-  		   float fa=1.23456789e-35;
+         unsigned char fc[]={0x22,0x48,0x83,0x05,0};
+         float fa=1.23456789e-35;
 
-  		   if (sizeof(double)!=8) return 1;
+         if (sizeof(double)!=8) return 1;
 
-  		   ca=(unsigned char*)&da;
-  		   if (compare(dc,ca)) return 1;
+         ca=(unsigned char*)&da;
+         if (compare(dc,ca)) return 1;
 
-  		   if (sizeof(float)!=4) return 1;
+         if (sizeof(float)!=4) return 1;
 
-  		   ca=(unsigned char*)&fa;
-  		   if (compare(fc,ca)) return 1;
+         ca=(unsigned char*)&fa;
+         if (compare(fc,ca)) return 1;
 
-  		   return 0;
-  		 }" IEEE_LE )
+         return 0;
+       }" IEEE_LE )
 
-  	if( "${IEEE_LE}" STREQUAL "" )
-  		set( IEEE_LE 0 CACHE INTERNAL "Test IEEE_LE")
-  	endif()
+    if( "${IEEE_LE}" STREQUAL "" )
+      set( IEEE_LE 0 CACHE INTERNAL "Test IEEE_LE")
+    endif()
   endif()
 
   ecbuild_cache_var( IEEE_LE )
@@ -281,102 +278,102 @@ if( UNIX )
 
   endif()
 
-	### Solaris ###
+  ### Solaris ###
 
-	if( ${CMAKE_SYSTEM_NAME} MATCHES "SunOS" )
-		set( EC_OS_NAME "solaris" )
-	endif()
+  if( ${CMAKE_SYSTEM_NAME} MATCHES "SunOS" )
+    set( EC_OS_NAME "solaris" )
+  endif()
 
-	### AIX ###
+  ### AIX ###
 
-	if( ${CMAKE_SYSTEM_NAME} MATCHES "AIX" )
+  if( ${CMAKE_SYSTEM_NAME} MATCHES "AIX" )
 
-		set( EC_OS_NAME "aix" )
+    set( EC_OS_NAME "aix" )
 
-		set( CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -bbigtoc" )
+    set( CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -bbigtoc" )
 
-		if( CMAKE_C_COMPILER_ID MATCHES "GNU" )
-			set( CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Xlinker" )
-		endif()
+    if( CMAKE_C_COMPILER_ID MATCHES "GNU" )
+      set( CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Xlinker" )
+    endif()
 
-		if( CMAKE_COMPILER_IS_GNUCC )
-			if( EC_OS_BITS EQUAL "64" )
-				ecbuild_add_c_flags("-maix64")
-			endif()
-			if( EC_OS_BITS EQUAL "32" )
-				ecbuild_add_c_flags("-maix32")
-			endif()
-		endif()
+    if( CMAKE_COMPILER_IS_GNUCC )
+      if( EC_OS_BITS EQUAL "64" )
+        ecbuild_add_c_flags("-maix64")
+      endif()
+      if( EC_OS_BITS EQUAL "32" )
+        ecbuild_add_c_flags("-maix32")
+      endif()
+    endif()
 
-		if( CMAKE_COMPILER_IS_GNUCXX )
-			if( EC_OS_BITS EQUAL "64" )
-				ecbuild_add_cxx_flags("-maix64")
-			endif()
-			if( EC_OS_BITS EQUAL "32" )
-				ecbuild_add_cxx_flags("-maix32")
-			endif()
-		endif()
+    if( CMAKE_COMPILER_IS_GNUCXX )
+      if( EC_OS_BITS EQUAL "64" )
+        ecbuild_add_cxx_flags("-maix64")
+      endif()
+      if( EC_OS_BITS EQUAL "32" )
+        ecbuild_add_cxx_flags("-maix32")
+      endif()
+    endif()
 
-		if( CMAKE_C_COMPILER_ID MATCHES "XL" )
+    if( CMAKE_C_COMPILER_ID MATCHES "XL" )
 
-			ecbuild_add_c_flags("-qpic=large")
+      ecbuild_add_c_flags("-qpic=large")
 #            ecbuild_add_c_flags("-qweaksymbol")
 
-			if(EC_OS_BITS EQUAL "32" )
-				ecbuild_add_c_flags("-q32")
-			endif()
+      if(EC_OS_BITS EQUAL "32" )
+        ecbuild_add_c_flags("-q32")
+      endif()
 
-			if(${CMAKE_BUILD_TYPE} MATCHES "Release" OR ${CMAKE_BUILD_TYPE} MATCHES "Production" )
-					ecbuild_add_c_flags("-qstrict")
-					ecbuild_add_c_flags("-qinline")
-			endif()
+      if(${CMAKE_BUILD_TYPE} MATCHES "Release" OR ${CMAKE_BUILD_TYPE} MATCHES "Production" )
+          ecbuild_add_c_flags("-qstrict")
+          ecbuild_add_c_flags("-qinline")
+      endif()
 
-			if(${CMAKE_BUILD_TYPE} MATCHES "Debug")
-					ecbuild_add_c_flags("-qfullpath")
-					ecbuild_add_c_flags("-qkeepparm")
-			endif()
+      if(${CMAKE_BUILD_TYPE} MATCHES "Debug")
+          ecbuild_add_c_flags("-qfullpath")
+          ecbuild_add_c_flags("-qkeepparm")
+      endif()
 
-		endif()
+    endif()
 
-		if( CMAKE_CXX_COMPILER_ID MATCHES "XL" )
+    if( CMAKE_CXX_COMPILER_ID MATCHES "XL" )
 
-			ecbuild_add_cxx_flags("-qpic=large")
-			ecbuild_add_cxx_flags("-bmaxdata:0x40000000")
-			ecbuild_add_cxx_flags("-qrtti")
-			ecbuild_add_cxx_flags("-qfuncsect")
+      ecbuild_add_cxx_flags("-qpic=large")
+      ecbuild_add_cxx_flags("-bmaxdata:0x40000000")
+      ecbuild_add_cxx_flags("-qrtti")
+      ecbuild_add_cxx_flags("-qfuncsect")
 
 #           ecbuild_add_cxx_flags("-qweaksymbol")
 
-			if(EC_OS_BITS EQUAL "32" )
-				ecbuild_add_cxx_flags("-q32")
-			endif()
+      if(EC_OS_BITS EQUAL "32" )
+        ecbuild_add_cxx_flags("-q32")
+      endif()
 
-			if(${CMAKE_BUILD_TYPE} MATCHES "Release" OR ${CMAKE_BUILD_TYPE} MATCHES "Production" )
-					ecbuild_add_cxx_flags("-qstrict")
-					ecbuild_add_cxx_flags("-qinline")
-			endif()
+      if(${CMAKE_BUILD_TYPE} MATCHES "Release" OR ${CMAKE_BUILD_TYPE} MATCHES "Production" )
+          ecbuild_add_cxx_flags("-qstrict")
+          ecbuild_add_cxx_flags("-qinline")
+      endif()
 
-			if(${CMAKE_BUILD_TYPE} MATCHES "Debug")
-					ecbuild_add_cxx_flags("-qfullpath")
-					ecbuild_add_cxx_flags("-qkeepparm")
-			endif()
+      if(${CMAKE_BUILD_TYPE} MATCHES "Debug")
+          ecbuild_add_cxx_flags("-qfullpath")
+          ecbuild_add_cxx_flags("-qkeepparm")
+      endif()
 
-		endif()
+    endif()
 
-		if( CMAKE_Fortran_COMPILER_ID MATCHES "XL" )
+    if( CMAKE_Fortran_COMPILER_ID MATCHES "XL" )
 
-			ecbuild_add_fortran_flags("-qxflag=dealloc_cfptr")
-			ecbuild_add_fortran_flags("-qextname")
-			ecbuild_add_fortran_flags("-qdpc=e")
-			ecbuild_add_fortran_flags("-bmaxdata:0x40000000")
-			ecbuild_add_fortran_flags("-bloadmap:loadmap -bmap:loadmap")
+      ecbuild_add_fortran_flags("-qxflag=dealloc_cfptr")
+      ecbuild_add_fortran_flags("-qextname")
+      ecbuild_add_fortran_flags("-qdpc=e")
+      ecbuild_add_fortran_flags("-bmaxdata:0x40000000")
+      ecbuild_add_fortran_flags("-bloadmap:loadmap -bmap:loadmap")
 
-			if(EC_OS_BITS EQUAL "32" )
-				ecbuild_add_fortran_flags("-q32")
-			endif()
-		endif()
+      if(EC_OS_BITS EQUAL "32" )
+        ecbuild_add_fortran_flags("-q32")
+      endif()
+    endif()
 
-	endif()
+  endif()
 
 endif()
 
@@ -384,8 +381,8 @@ endif()
 
 if( ${CMAKE_SYSTEM_NAME} MATCHES "CYGWIN" )
 
-	set( EC_OS_NAME "cygwin" )
-	ecbuild_warn( "Building on Cygwin should work but is untested" )
+  set( EC_OS_NAME "cygwin" )
+  ecbuild_warn( "Building on Cygwin should work but is untested" )
 
 endif()
 
@@ -393,12 +390,12 @@ endif()
 
 if( ${EC_OS_NAME} MATCHES "UNKNOWN" )
 
-	if( DISABLE_OS_CHECK )
-		ecbuild_warn( "ecBuild is untested for this operating system: [${CMAKE_SYSTEM_NAME}]"
+  if( DISABLE_OS_CHECK )
+    ecbuild_warn( "ecBuild is untested for this operating system: [${CMAKE_SYSTEM_NAME}]"
                   " -- DISABLE_OS_CHECK is ON so proceeding at your own risk ..." )
-	else()
-		ecbuild_critical( "ecBuild is untested for this operating system: [${CMAKE_SYSTEM_NAME}]"
+  else()
+    ecbuild_critical( "ecBuild is untested for this operating system: [${CMAKE_SYSTEM_NAME}]"
                       " -- refusing to continue. Disable this check with -DDISABLE_OS_CHECK=ON" )
-	endif()
+  endif()
 
 endif()
diff --git a/cmake/ecbuild_compiler_flags.cmake b/cmake/ecbuild_compiler_flags.cmake
index 0e3fe1e..a6c2944 100644
--- a/cmake/ecbuild_compiler_flags.cmake
+++ b/cmake/ecbuild_compiler_flags.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -200,6 +200,12 @@ foreach( _lang C CXX Fortran )
 endforeach()
 
 # Apply user or toolchain specified linker flag overrides per object type (NOT written to cache)
+foreach( _obj EXE SHARED MODULE )
+  if( ECBUILD_${_obj}_LINKER_FLAGS )
+    set( CMAKE_${_obj}_LINKER_FLAGS ${ECBUILD_${_obj}_LINKER_FLAGS} )
+  endif()
+endforeach()
+
 foreach( _btype NONE DEBUG BIT PRODUCTION RELEASE RELWITHDEBINFO )
 
   foreach( _obj EXE SHARED MODULE )
diff --git a/cmake/ecbuild_config.h.in b/cmake/ecbuild_config.h.in
index df9eb91..2eed359 100644
--- a/cmake/ecbuild_config.h.in
+++ b/cmake/ecbuild_config.h.in
@@ -1,5 +1,5 @@
 /*
- * (C) Copyright 1996-2016 ECMWF.
+ * (C) Copyright 1996-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_declare_project.cmake b/cmake/ecbuild_declare_project.cmake
index c95e8e3..e2f9cc8 100644
--- a/cmake/ecbuild_declare_project.cmake
+++ b/cmake/ecbuild_declare_project.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_define_build_types.cmake b/cmake/ecbuild_define_build_types.cmake
index cf92d23..7cfc591 100644
--- a/cmake/ecbuild_define_build_types.cmake
+++ b/cmake/ecbuild_define_build_types.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_define_libs_and_execs_target.cmake b/cmake/ecbuild_define_libs_and_execs_target.cmake
index 812f42c..799eb7d 100644
--- a/cmake/ecbuild_define_libs_and_execs_target.cmake
+++ b/cmake/ecbuild_define_libs_and_execs_target.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_define_links_target.cmake b/cmake/ecbuild_define_links_target.cmake
index b5f53fe..745288c 100644
--- a/cmake/ecbuild_define_links_target.cmake
+++ b/cmake/ecbuild_define_links_target.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_define_options.cmake b/cmake/ecbuild_define_options.cmake
index af40ae1..fc6376e 100644
--- a/cmake/ecbuild_define_options.cmake
+++ b/cmake/ecbuild_define_options.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_define_paths.cmake b/cmake/ecbuild_define_paths.cmake
index 6584b26..c5e4830 100644
--- a/cmake/ecbuild_define_paths.cmake
+++ b/cmake/ecbuild_define_paths.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_dont_pack.cmake b/cmake/ecbuild_dont_pack.cmake
index bc62182..9f9f4a4 100644
--- a/cmake/ecbuild_dont_pack.cmake
+++ b/cmake/ecbuild_dont_pack.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_download_resource.cmake b/cmake/ecbuild_download_resource.cmake
index 5d394f5..e1e8eff 100644
--- a/cmake/ecbuild_download_resource.cmake
+++ b/cmake/ecbuild_download_resource.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -18,25 +18,53 @@
 #
 # curl or wget is required (curl is preferred if available).
 #
+# The default timeout is 30 seconds, which can be overridden with
+# ``ECBUILD_DOWNLOAD_TIMEOUT``. Downloads are by default only tried once, use
+# ``ECBUILD_DOWNLOAD_RETRIES`` to set the number of retries.
+#
 ##############################################################################
 
 function( ecbuild_download_resource _p_OUT _p_URL )
 
+  # Do not retry downloads by default (ECBUILD-307)
+  if( NOT DEFINED ECBUILD_DOWNLOAD_RETRIES )
+    set( ECBUILD_DOWNLOAD_RETRIES 0 )
+  endif()
+  # Use default timeout of 30s if not specified (ECBUILD-307)
+  if( NOT DEFINED ECBUILD_DOWNLOAD_TIMEOUT )
+    set( ECBUILD_DOWNLOAD_TIMEOUT 30 )
+  endif()
+
   if( NOT EXISTS ${_p_OUT} )
 
     find_program( CURL_PROGRAM curl )
     mark_as_advanced(CURL_PROGRAM)
     if( CURL_PROGRAM )
-      execute_process( COMMAND ${CURL_PROGRAM} --silent --show-error --fail --output ${_p_OUT} ${_p_URL}
+
+      execute_process( COMMAND ${CURL_PROGRAM} --silent --show-error --fail
+                               --retry ${ECBUILD_DOWNLOAD_RETRIES}
+                               --connect-timeout ${ECBUILD_DOWNLOAD_TIMEOUT}
+                               --output ${_p_OUT} ${_p_URL}
                        WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} RESULT_VARIABLE CMD_RESULT )
+
     else()
+
       find_program( WGET_PROGRAM wget )
+
       if( WGET_PROGRAM )
-        execute_process( COMMAND ${WGET_PROGRAM} -nv -O ${_p_OUT} ${_p_URL}
+
+        # wget takes the total number of tries, curl the number or retries
+        math( EXPR ECBUILD_DOWNLOAD_RETRIES ${ECBUILD_DOWNLOAD_RETRIES} + 1 )
+
+        execute_process( COMMAND ${WGET_PROGRAM} -nv -O ${_p_OUT}
+                                 -t ${ECBUILD_DOWNLOAD_RETRIES}
+                                 -T ${ECBUILD_DOWNLOAD_TIMEOUT} ${_p_URL}
                          WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} RESULT_VARIABLE CMD_RESULT )
+
       else()
         ecbuild_critical("Could not find curl or wget. Error downloading ${_p_URL}")
       endif()
+
     endif()
 
     if(CMD_RESULT)
diff --git a/cmake/ecbuild_echo_targets.cmake b/cmake/ecbuild_echo_targets.cmake
index 1406a1f..61250ee 100644
--- a/cmake/ecbuild_echo_targets.cmake
+++ b/cmake/ecbuild_echo_targets.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_enable_fortran.cmake b/cmake/ecbuild_enable_fortran.cmake
index c1c5503..9d86aa7 100644
--- a/cmake/ecbuild_enable_fortran.cmake
+++ b/cmake/ecbuild_enable_fortran.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -58,11 +58,19 @@ macro( ecbuild_enable_fortran )
   endif()
 
   if( CMAKE_Fortran_COMPILER_LOADED )
+
     include(CheckFortranFunctionExists)
     if( CMAKE_C_COMPILER_LOADED AND ENABLE_FORTRAN_C_INTERFACE )
       include(FortranCInterface)
     endif()
     set( EC_HAVE_FORTRAN 1 )
+
+    # see issue ECBUILD-298
+    if( CMAKE_Fortran_COMPILER_ID MATCHES PGI )
+      unset( CMAKE_Fortran_COMPILE_OPTIONS_PIE )
+      unset( CMAKE_SHARED_LIBRARY_LINK_Fortran_FLAGS )
+    endif()
+
   endif()
 
   if( DEFINED _PAR_MODULE_DIRECTORY )
diff --git a/cmake/ecbuild_features.cmake b/cmake/ecbuild_features.cmake
index 6d20038..9406fd8 100644
--- a/cmake/ecbuild_features.cmake
+++ b/cmake/ecbuild_features.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -55,44 +55,3 @@ function( ecbuild_disable_feature _name )
   set_property(GLOBAL PROPERTY DISABLED_FEATURES "${_disabled_features}" )
 
 endfunction()
-
-# en/disable feature ${_name} and set its description and purpose
-function( ecbuild_set_feature _name )
-
-  set(options ) # none
-  set(oneValueArgs ENABLED )
-  set(multiValueArgs ) # none
-
-  cmake_parse_arguments( _PAR "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )
-
-  get_property( _feature_desc      GLOBAL PROPERTY _CMAKE_${_name}_DESCRIPTION )
-  get_property( _enabled_features  GLOBAL PROPERTY ENABLED_FEATURES )
-  get_property( _disabled_features GLOBAL PROPERTY DISABLED_FEATURES )
-
-  if( DEFINED _PAR_ENABLED )
-    if( _PAR_ENABLED )
-      ecbuild_debug( "ecbuild_set_feature(${_name}): enabling feature" )
-      ecbuild_enable_feature( ${_name} )
-    else()
-      ecbuild_debug( "ecbuild_set_feature(${_name}): disabling feature" )
-      ecbuild_disable_feature( ${_name} )
-    endif()
-  endif()
-
-  ecbuild_enabled_features( _enabled_features )
-  list (FIND _enabled_features "${_name}" _index)
-  if (${_index} GREATER -1)
-    set( _feature_found 1 )
-  endif()
-
-  ecbuild_disabled_features( _disabled_features )
-  list (FIND _disabled_features "${_name}" _index)
-  if (${_index} GREATER -1)
-    set( _feature_found 1 )
-  endif()
-
-  if( NOT _feature_found )
-    ecbuild_warn( "Feature ${_name} has not yet been enabled or disabled" )
-  endif()
-
-endfunction()
diff --git a/cmake/ecbuild_find_fortranlibs.cmake b/cmake/ecbuild_find_fortranlibs.cmake
index 279833f..905d020 100644
--- a/cmake/ecbuild_find_fortranlibs.cmake
+++ b/cmake/ecbuild_find_fortranlibs.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_find_lexyacc.cmake b/cmake/ecbuild_find_lexyacc.cmake
index 5c13269..3dc8b61 100644
--- a/cmake/ecbuild_find_lexyacc.cmake
+++ b/cmake/ecbuild_find_lexyacc.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_find_mpi.cmake b/cmake/ecbuild_find_mpi.cmake
index a0c6cfa..85ae5e1 100644
--- a/cmake/ecbuild_find_mpi.cmake
+++ b/cmake/ecbuild_find_mpi.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_find_omp.cmake b/cmake/ecbuild_find_omp.cmake
index 914da24..ea9da24 100644
--- a/cmake/ecbuild_find_omp.cmake
+++ b/cmake/ecbuild_find_omp.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_find_package.cmake b/cmake/ecbuild_find_package.cmake
index f7f1a9c..71be044 100644
--- a/cmake/ecbuild_find_package.cmake
+++ b/cmake/ecbuild_find_package.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -17,6 +17,11 @@
 #   ecbuild_find_package( NAME <name>
 #                         [ VERSION <version> [ EXACT ] ]
 #                         [ COMPONENTS <component1> [ <component2> ... ] ]
+#                         [ URL <url> ]
+#                         [ DESCRIPTION <description> ]
+#                         [ TYPE <type> ]
+#                         [ PURPOSE <purpose> ]
+#                         [ FAILURE_MSG <message> ]
 #                         [ REQUIRED ]
 #                         [ QUIET ] )
 #
@@ -35,6 +40,23 @@
 # EXACT : optional, requires VERSION
 #   require the exact version rather than a minimum version
 #
+# URL : optional
+#   homepage of the package (shown in summary and stored in the cache)
+#
+# DESCRIPTION : optional
+#   literal string or name of CMake variable describing the package
+#
+# TYPE : optional, one of RUNTIME|OPTIONAL|RECOMMENDED|REQUIRED
+#   type of dependency of the project on this package (defaults to OPTIONAL)
+#
+# PURPOSE : optional
+#   literal string or name of CMake variable describing which functionality
+#   this package enables in the project
+#
+# FAILURE_MSG : optional
+#   literal string or name of CMake variable containing a message to be
+#   appended to the failure message if the package is not found
+#
 # REQUIRED : optional
 #   fail if package cannot be found
 #
@@ -86,7 +108,7 @@
 macro( ecbuild_find_package )
 
   set( options REQUIRED QUIET EXACT )
-  set( single_value_args NAME VERSION )
+  set( single_value_args NAME VERSION URL DESCRIPTION TYPE PURPOSE FAILURE_MSG )
   set( multi_value_args COMPONENTS )
 
   cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
@@ -103,6 +125,12 @@ macro( ecbuild_find_package )
     ecbuild_critical("Call to ecbuild_find_package() requests EXACT but doesn't specify VERSION.")
   endif()
 
+  # If the package is required, set TYPE to REQUIRED
+  # Due to shortcomings in CMake's argument parser, passing TYPE REQUIRED has no effect
+  if( _PAR_REQUIRED )
+    set( _PAR_TYPE REQUIRED )
+  endif()
+
   # ecbuild_debug_var( _PAR_NAME )
 
   string( TOUPPER ${_PAR_NAME} pkgUPPER )
@@ -191,10 +219,10 @@ macro( ecbuild_find_package )
 
     if( NOT ${_PAR_NAME}_FOUND )
       if( ${_PAR_NAME}_PATH )
-        ecbuild_critical( "${_PAR_NAME}_PATH was provided by user but package ${_PAR_NAME} wasn't found" )
+        ecbuild_critical( "${_PAR_NAME}_PATH was provided by user but package ${_PAR_NAME} wasn't found at '${${_PAR_NAME}_PATH}'" )
       endif()
       if( ${pkgUPPER}_PATH )
-        ecbuild_critical( "${pkgUPPER}_PATH was provided by user but package ${_PAR_NAME} wasn't found" )
+        ecbuild_critical( "${pkgUPPER}_PATH was provided by user but package ${_PAR_NAME} wasn't found at '${${pkgUPPER}_PATH}'" )
       endif()
     endif()
 
@@ -288,20 +316,8 @@ macro( ecbuild_find_package )
 
   ### final messages
 
-  set( _failed_message
-    "\n"
-    "  ${PROJECT_NAME} FAILED to find package ${_PAR_NAME}\n"
-    "\n"
-    "    Provide location with \"-D${pkgUPPER}_PATH=/...\" or \"-D${_PAR_NAME}_DIR=/...\" \n"
-    "    You may also export environment variables ${pkgUPPER}_PATH or ${_PAR_NAME}_DIR\n"
-    "\n"
-    "  Values (note CAPITALISATION):\n"
-    "    ${pkgUPPER}_PATH should contain the path to the install prefix (as in <install>/bin <install>/lib <install>/include)\n"
-    "    ${_PAR_NAME}_DIR should be a directory containing a <package>-config.cmake file (usually <install>/share/<package>/cmake)\n"
-    "\n"
-    )
-
   if( ${_PAR_NAME}_FOUND OR ${pkgUPPER}_FOUND )
+
     if( NOT _PAR_QUIET )
       ecbuild_info( "[${_PAR_NAME}] (${${_PAR_NAME}_VERSION})" )
       foreach( var in ITEMS INCLUDE_DIR INCLUDE_DIRS DEFINITIONS LIBRARY LIBRARIES )
@@ -312,14 +328,41 @@ macro( ecbuild_find_package )
         endif()
       endforeach()
     endif()
+
+    if( DEFINED ${_PAR_DESCRIPTION} )
+      set( _PAR_DESCRIPTION ${${_PAR_DESCRIPTION}} )
+    endif()
+    if( DEFINED ${_PAR_PURPOSE} )
+      set( _PAR_PURPOSE ${${_PAR_PURPOSE}} )
+    endif()
+    set_package_properties( ${_PAR_NAME} PROPERTIES
+                            URL "${_PAR_URL}"
+                            DESCRIPTION "${_PAR_DESCRIPTION}"
+                            TYPE "${_PAR_TYPE}"
+                            PURPOSE "${_PAR_PURPOSE}" )
+
   else()
+
+    if( DEFINED ${_PAR_FAILURE_MSG} )
+      set( _PAR_FAILURE_MSG ${${_PAR_FAILURE_MSG}} )
+    endif()
+    set( _failed_message
+      "  ${PROJECT_NAME} FAILED to find package ${_PAR_NAME}\n"
+      "    Provide location with \"-D${pkgUPPER}_PATH=/...\" or \"-D${_PAR_NAME}_DIR=/...\" \n"
+      "    You may also export environment variables ${pkgUPPER}_PATH or ${_PAR_NAME}_DIR\n"
+      "  Values (note CAPITALISATION):\n"
+      "    ${pkgUPPER}_PATH should contain the path to the install prefix (as in <install>/bin <install>/lib <install>/include)\n"
+      "    ${_PAR_NAME}_DIR should be a directory containing a <package>-config.cmake file (usually <install>/share/<package>/cmake)\n"
+      )
+
     if( _PAR_REQUIRED )
-      ecbuild_critical( ${_failed_message} " !! ${PROJECT_NAME} requires package ${_PAR_NAME} !!" )
+      ecbuild_critical( "${_failed_message}!! ${PROJECT_NAME} requires package ${_PAR_NAME} !!\n${_PAR_FAILURE_MSG}" )
     else()
       if( NOT _PAR_QUIET )
-        ecbuild_warn( ${_failed_message} )
+        ecbuild_warn( "${_failed_message}\n${_PAR_FAILURE_MSG}" )
       endif()
     endif()
+
   endif()
 
 endmacro()
diff --git a/cmake/ecbuild_find_perl.cmake b/cmake/ecbuild_find_perl.cmake
index 97b22f8..b6c1825 100644
--- a/cmake/ecbuild_find_perl.cmake
+++ b/cmake/ecbuild_find_perl.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 # 
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
diff --git a/cmake/ecbuild_find_python.cmake b/cmake/ecbuild_find_python.cmake
index d3cf377..0e9adaa 100644
--- a/cmake/ecbuild_find_python.cmake
+++ b/cmake/ecbuild_find_python.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -67,8 +67,10 @@ function( ecbuild_find_python )
       ecbuild_critical("Unknown keywords given to ecbuild_find_python(): \"${_p_UNPARSED_ARGUMENTS}\"")
     endif()
     if( _p_REQUIRED )
+      ecbuild_debug( "ecbuild_find_python: Searching for Python interpreter (required) ..." )
       set( _p_REQUIRED REQUIRED )
     else()
+      ecbuild_debug( "ecbuild_find_python: Searching for Python interpreter ..." )
       unset( _p_REQUIRED )
     endif()
 
@@ -81,7 +83,7 @@ function( ecbuild_find_python )
     # If no suitable version was found, search again with the version specified
     if( PYTHONINTERP_FOUND AND _p_VERSION )
       if( _p_VERSION VERSION_GREATER "${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}.${PYTHON_VERSION_PATCH}" )
-        ecbuild_debug( "ecbuild_find_python: Found Python interpreter version ${PYTHON_VERSION_STRING} at ${PYTHON_EXECUTABLE}, however version ${_p_VERSION} is required. Searching again..." )
+        ecbuild_debug( "ecbuild_find_python: Found Python interpreter version '${PYTHON_VERSION_STRING}' at '${PYTHON_EXECUTABLE}', however version '${_p_VERSION}' is required. Searching again..." )
         unset( PYTHONINTERP_FOUND )
         unset( PYTHON_EXECUTABLE )
         unset( PYTHON_EXECUTABLE CACHE )
@@ -93,10 +95,14 @@ function( ecbuild_find_python )
       endif()
     endif()
 
+    set_package_properties( PythonInterp PROPERTIES
+                            URL http://python.org
+                            DESCRIPTION "Python interpreter" )
+
     set( __required_vars PYTHONINTERP_FOUND )
 
     if( PYTHONINTERP_FOUND )
-        ecbuild_debug( "ecbuild_find_python: Found Python interpreter version ${PYTHON_VERSION_STRING} at ${PYTHON_EXECUTABLE}" )
+        ecbuild_debug( "ecbuild_find_python: Found Python interpreter version '${PYTHON_VERSION_STRING}' at '${PYTHON_EXECUTABLE}'" )
 
         # find where python site-packages are ...
 
@@ -104,10 +110,15 @@ function( ecbuild_find_python )
             execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())" OUTPUT_VARIABLE PYTHON_SITE_PACKAGES OUTPUT_STRIP_TRAILING_WHITESPACE)
         endif()
         ecbuild_debug( "ecbuild_find_python: PYTHON_SITE_PACKAGES=${PYTHON_SITE_PACKAGES}" )
+    else()
+        ecbuild_debug( "ecbuild_find_python: could NOT find Python interpreter!" )
     endif()
 
-    if( PYTHONINTERP_FOUND AND NOT _p_NO_LIBS )
+    if( PYTHONINTERP_FOUND AND _p_NO_LIBS )
+        ecbuild_debug( "ecbuild_find_python: NOT searching for Python libraries" )
+    elseif( PYTHONINTERP_FOUND )
         list( APPEND __required_vars PYTHONLIBS_FOUND PYTHON_LIBS_WORKING )
+        ecbuild_debug( "ecbuild_find_python: Searching for Python libraries ..." )
 
         # find python config
 
@@ -124,7 +135,7 @@ function( ecbuild_find_python )
                                 python-config )
         endif()
 
-        ecbuild_debug_var( PYTHON_CONFIG_EXECUTABLE )
+        ecbuild_debug( "ecbuild_find_python: found python-config at '${PYTHON_CONFIG_EXECUTABLE}'" )
 
         # find python libs
 
@@ -132,33 +143,39 @@ function( ecbuild_find_python )
         # that don't reliably report linking flags that will work.
 
         if( PYTHON_CONFIG_EXECUTABLE AND NOT ( PYTHON_NO_CONFIG OR ${CMAKE_SYSTEM_NAME} STREQUAL "OpenBSD" ) )
-            ecbuild_debug( "ecbuild_find_python: Searching for Python include directories and libraries using ${PYTHON_CONFIG_EXECUTABLE}" )
+            ecbuild_debug( "ecbuild_find_python: Searching for Python include directories and libraries using '${PYTHON_CONFIG_EXECUTABLE}'" )
 
-            if( NOT PYTHON_LIBRARY )
+            if( DEFINED PYTHON_LIBRARY )
+              ecbuild_debug( "ecbuild_find_python: PYTHON_LIBRARY already set to '${PYTHON_LIBRARY}'" )
+            else()
               execute_process(COMMAND "${PYTHON_CONFIG_EXECUTABLE}" --prefix
                               OUTPUT_VARIABLE PYTHON_PREFIX
                               OUTPUT_STRIP_TRAILING_WHITESPACE
                               ERROR_QUIET)
+              ecbuild_debug( "ecbuild_find_python: PYTHON_PREFIX=${PYTHON_PREFIX}" )
 
               execute_process(COMMAND "${PYTHON_CONFIG_EXECUTABLE}" --ldflags
                               OUTPUT_VARIABLE PYTHON_LIBRARY
                               OUTPUT_STRIP_TRAILING_WHITESPACE
                               ERROR_QUIET)
+              ecbuild_debug( "ecbuild_find_python: PYTHON_LIBRARY=${PYTHON_LIBRARY}" )
 
               # Prepend -L and and set the RPATH to the lib directory under the
               # Python install prefix unless it is a standard system prefix path
               if( PYTHON_LIBRARY AND PYTHON_PREFIX AND NOT CMAKE_SYSTEM_PREFIX_PATH MATCHES ${PYTHON_PREFIX} )
+                ecbuild_debug( "ecbuild_find_python: Python libraries not in CMAKE_SYSTEM_PREFIX_PATH, prepending PYTHON_PREFIX '${PYTHON_PREFIX}' to PYTHON_LIBRARY" )
                 set( PYTHON_LIBRARY "-L${PYTHON_PREFIX}/lib -Wl,-rpath,${PYTHON_PREFIX}/lib ${PYTHON_LIBRARY}" )
               endif()
-
-              set( PYTHON_INCLUDE_DIR "${PYTHON_INCLUDE_DIR}" CACHE PATH
-                   "Path to where Python.h is found" FORCE )
             endif()
 
-            if(DEFINED PYTHON_INCLUDE_PATH AND NOT DEFINED PYTHON_INCLUDE_DIR)
+            if( DEFINED PYTHON_INCLUDE_DIR )
+              ecbuild_debug( "ecbuild_find_python: PYTHON_INCLUDE_DIR already set to '${PYTHON_INCLUDE_DIR}'" )
+            elseif(DEFINED PYTHON_INCLUDE_PATH AND NOT DEFINED PYTHON_INCLUDE_DIR)
+              ecbuild_debug( "ecbuild_find_python: PYTHON_INCLUDE_PATH already set to '${PYTHON_INCLUDE_PATH}'" )
+              ecbuild_deprecate( "ecbuild_find_python: PYTHON_INCLUDE_PATH is deprecated, use PYTHON_INCLUDE_DIR instead!" )
               set( PYTHON_INCLUDE_DIR "${PYTHON_INCLUDE_PATH}" CACHE PATH
                    "Path to where Python.h is found" FORCE )
-            elseif( NOT PYTHON_INCLUDE_DIR )
+            else()
               execute_process(COMMAND "${PYTHON_CONFIG_EXECUTABLE}" --includes
                               OUTPUT_VARIABLE PYTHON_INCLUDE_DIR
                               OUTPUT_STRIP_TRAILING_WHITESPACE
@@ -168,6 +185,7 @@ function( ecbuild_find_python )
               string(REGEX REPLACE "[ ]-I" " " PYTHON_INCLUDE_DIR "${PYTHON_INCLUDE_DIR}")
 
               separate_arguments(PYTHON_INCLUDE_DIR)
+              ecbuild_debug( "ecbuild_find_python: PYTHON_INCLUDE_DIR=${PYTHON_INCLUDE_DIR}" )
               set( PYTHON_INCLUDE_DIR "${PYTHON_INCLUDE_DIR}" CACHE PATH
                    "Path to where Python.h is found" FORCE )
 
@@ -184,23 +202,34 @@ function( ecbuild_find_python )
 
             find_package( PythonLibs "${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}.${PYTHON_VERSION_PATCH}" ${_p_REQUIRED} )
 
+            set_package_properties( PythonLibs PROPERTIES
+                                    URL http://python.org
+                                    DESCRIPTION "Python library and header" )
+
         endif()
 
         # Remove duplicate include directories
         list(REMOVE_DUPLICATES PYTHON_INCLUDE_DIRS)
 
+        ecbuild_debug( "ecbuild_find_python: PYTHON_INCLUDE_DIRS=${PYTHON_INCLUDE_DIRS}" )
+        ecbuild_debug( "ecbuild_find_python: PYTHON_LIBRARIES=${PYTHON_LIBRARIES}" )
 
         if( PYTHON_LIBRARIES AND PYTHON_INCLUDE_DIRS )
+            ecbuild_debug( "ecbuild_find_python: trying to link executable with Python libraries ..." )
             # Test if we can link against the Python libraries and include Python.h
             try_compile( PYTHON_LIBS_WORKING ${CMAKE_CURRENT_BINARY_DIR}
                          ${__test_python}
                          CMAKE_FLAGS "-DINCLUDE_DIRECTORIES=${PYTHON_INCLUDE_DIRS}"
                          LINK_LIBRARIES ${PYTHON_LIBRARIES}
                          OUTPUT_VARIABLE __try_compile_output )
-            if( NOT PYTHON_LIBS_WORKING )
+            if( PYTHON_LIBS_WORKING )
+              ecbuild_debug( "ecbuild_find_python: trying to link executable with Python libraries successful" )
+            else()
               ecbuild_debug( "ecbuild_find_python: trying to link executable with Python libraries failed\n${__try_compile_output}" )
             endif()
 
+        else()
+            ecbuild_debug( "ecbuild_find_python: Python library and include diretory not found" )
         endif()
 
     endif()
diff --git a/cmake/ecbuild_generate_config_headers.cmake b/cmake/ecbuild_generate_config_headers.cmake
index 6bc8301..8f2d44e 100644
--- a/cmake/ecbuild_generate_config_headers.cmake
+++ b/cmake/ecbuild_generate_config_headers.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_generate_fortran_interfaces.cmake b/cmake/ecbuild_generate_fortran_interfaces.cmake
index 93c7414..a127315 100644
--- a/cmake/ecbuild_generate_fortran_interfaces.cmake
+++ b/cmake/ecbuild_generate_fortran_interfaces.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_generate_rpc.cmake b/cmake/ecbuild_generate_rpc.cmake
index f06624f..e475f19 100644
--- a/cmake/ecbuild_generate_rpc.cmake
+++ b/cmake/ecbuild_generate_rpc.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_generate_yy.cmake b/cmake/ecbuild_generate_yy.cmake
index 35088fb..ea7ec13 100644
--- a/cmake/ecbuild_generate_yy.cmake
+++ b/cmake/ecbuild_generate_yy.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_get_cxx11_flags.cmake b/cmake/ecbuild_get_cxx11_flags.cmake
index a97fe11..acb0b21 100644
--- a/cmake/ecbuild_get_cxx11_flags.cmake
+++ b/cmake/ecbuild_get_cxx11_flags.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_get_date.cmake b/cmake/ecbuild_get_date.cmake
index 730ea54..0f94d7d 100644
--- a/cmake/ecbuild_get_date.cmake
+++ b/cmake/ecbuild_get_date.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 # 
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
diff --git a/cmake/ecbuild_get_resources.cmake b/cmake/ecbuild_get_resources.cmake
index f531d82..d6c20e4 100644
--- a/cmake/ecbuild_get_resources.cmake
+++ b/cmake/ecbuild_get_resources.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_get_test_data.cmake b/cmake/ecbuild_get_test_data.cmake
index 42185f1..37ea904 100644
--- a/cmake/ecbuild_get_test_data.cmake
+++ b/cmake/ecbuild_get_test_data.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -19,6 +19,15 @@ function( _download_test_data _p_NAME _p_DIRNAME )
   #set(ENV{http_proxy} "http://proxy.ecmwf.int:3333")
   #endif()
 
+  # Do not retry downloads by default (ECBUILD-307)
+  if( NOT DEFINED ECBUILD_DOWNLOAD_RETRIES )
+    set( ECBUILD_DOWNLOAD_RETRIES 0 )
+  endif()
+  # Use default timeout of 30s if not specified (ECBUILD-307)
+  if( NOT DEFINED ECBUILD_DOWNLOAD_TIMEOUT )
+    set( ECBUILD_DOWNLOAD_TIMEOUT 30 )
+  endif()
+
   find_program( CURL_PROGRAM curl )
   mark_as_advanced(CURL_PROGRAM)
 
@@ -27,6 +36,8 @@ function( _download_test_data _p_NAME _p_DIRNAME )
     add_custom_command( OUTPUT ${_p_NAME}
       COMMENT "(curl) downloading http://download.ecmwf.org/test-data/${_p_DIRNAME}/${_p_NAME}"
       COMMAND ${CURL_PROGRAM} --silent --show-error --fail --output ${_p_NAME}
+              --retry ${ECBUILD_DOWNLOAD_RETRIES}
+              --connect-timeout ${ECBUILD_DOWNLOAD_TIMEOUT}
               http://download.ecmwf.org/test-data/${_p_DIRNAME}/${_p_NAME} )
 
   else()
@@ -35,9 +46,13 @@ function( _download_test_data _p_NAME _p_DIRNAME )
 
     if( WGET_PROGRAM )
 
+      # wget takes the total number of tries, curl the number or retries
+      math( EXPR ECBUILD_DOWNLOAD_RETRIES ${ECBUILD_DOWNLOAD_RETRIES} + 1 )
+
       add_custom_command( OUTPUT ${_p_NAME}
         COMMENT "(wget) downloading http://download.ecmwf.org/test-data/${_p_DIRNAME}/${_p_NAME}"
         COMMAND ${WGET_PROGRAM} -nv -O ${_p_NAME}
+                -t ${ECBUILD_DOWNLOAD_RETRIES} -T ${ECBUILD_DOWNLOAD_TIMEOUT}
                 http://download.ecmwf.org/test-data/${_p_DIRNAME}/${_p_NAME} )
 
     else()
@@ -105,6 +120,10 @@ endfunction()
 # given as the ``MD5`` argument or downloaded from the server otherwise. Use
 # the argument ``NOCHECK`` to disable this check.
 #
+# The default timeout is 30 seconds, which can be overridden with
+# ``ECBUILD_DOWNLOAD_TIMEOUT``. Downloads are by default only tried once, use
+# ``ECBUILD_DOWNLOAD_RETRIES`` to set the number of retries.
+#
 # Examples
 # --------
 #
diff --git a/cmake/ecbuild_git.cmake b/cmake/ecbuild_git.cmake
index 0a378a6..b2d38fa 100644
--- a/cmake/ecbuild_git.cmake
+++ b/cmake/ecbuild_git.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_install_project.cmake b/cmake/ecbuild_install_project.cmake
index 5e26bea..ddba836 100644
--- a/cmake/ecbuild_install_project.cmake
+++ b/cmake/ecbuild_install_project.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -70,6 +70,17 @@
 #
 ##############################################################################
 
+function( ecbuild_set_if_not_defined VAR VALUE )
+
+    if(NOT DEFINED ${VAR})
+        set( ${VAR} "${VALUE}" PARENT_SCOPE )
+        # ecbuild_info("Variable not defined, setting ${VAR} => ${VALUE}")
+    # else()
+        # ecbuild_info("${VAR} == ${${VAR}}")
+    endif()
+
+endfunction()
+
 macro( ecbuild_install_project )
 
     set( options )
@@ -112,36 +123,34 @@ macro( ecbuild_install_project )
 
     # name, version, etc ...
 
-    set(CPACK_PACKAGE_NAME      "${_PAR_NAME}")
-    set(CPACK_PACKAGE_VERSION   "${${PNAME}_VERSION_STR}")
-
-    set(CPACK_PACKAGE_FILE_NAME   "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}")
+    ecbuild_set_if_not_defined(CPACK_PACKAGE_NAME      "${_PAR_NAME}")
+    ecbuild_set_if_not_defined(CPACK_PACKAGE_VERSION   "${${PNAME}_VERSION_STR}")
 
-    set(CPACK_DEBIAN_PACKAGE_MAINTAINER "ECMWF") # required for DEB
+    ecbuild_set_if_not_defined(CPACK_PACKAGE_FILE_NAME   "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}")
 
+    #    set(CPACK_DEBIAN_PACKAGE_MAINTAINER "ECMWF") # required for DEB
     #    set(CPACK_ARCHIVE_COMPONENT_INSTALL "ON")
     #    set(CPACK_RPM_COMPONENT_INSTALL "ON")
 
-    #    set(CPACK_GENERATOR        "TGZ;RPM;DEB")
-    set(CPACK_GENERATOR        "TGZ")
-    set(CPACK_SOURCE_GENERATOR "TGZ")
-    set(CPACK_PACKAGE_VENDOR   "ECMWF")
+    ecbuild_set_if_not_defined(CPACK_SOURCE_GENERATOR "TGZ")
+    ecbuild_set_if_not_defined(CPACK_GENERATOR "TGZ")
+    ecbuild_set_if_not_defined(CPACK_PACKAGE_VENDOR "ECMWF")
 
     # short description
 
     if( _PAR_DESCRIPTION )
-        set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${_PAR_DESCRIPTION}" )
+        ecbuild_set_if_not_defined(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${_PAR_DESCRIPTION}" )
     else()
-        set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${_PAR_NAME} misses a description" )
+        ecbuild_set_if_not_defined(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${_PAR_NAME} misses a description" )
     endif()
 
     # long description
 
     if( EXISTS ${PROJECT_SOURCE_DIR}/INSTALL )
-        set(CPACK_PACKAGE_DESCRIPTION_FILE "${PROJECT_SOURCE_DIR}/INSTALL")
+        ecbuild_set_if_not_defined(CPACK_PACKAGE_DESCRIPTION_FILE "${PROJECT_SOURCE_DIR}/INSTALL")
     endif()
     if( EXISTS ${PROJECT_SOURCE_DIR}/LICENSE )
-        set(CPACK_RESOURCE_FILE_LICENSE    "${PROJECT_SOURCE_DIR}/LICENSE")
+        ecbuild_set_if_not_defined(CPACK_RESOURCE_FILE_LICENSE    "${PROJECT_SOURCE_DIR}/LICENSE")
     endif()
 
     # set(CPACK_PACKAGE_EXECUTABLES ${ECBUILD_ALL_EXES})
diff --git a/cmake/ecbuild_list_add_pattern.cmake b/cmake/ecbuild_list_add_pattern.cmake
index 0f68217..a0f9f34 100644
--- a/cmake/ecbuild_list_add_pattern.cmake
+++ b/cmake/ecbuild_list_add_pattern.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_list_exclude_pattern.cmake b/cmake/ecbuild_list_exclude_pattern.cmake
index 7e02f47..bfb6ee8 100644
--- a/cmake/ecbuild_list_exclude_pattern.cmake
+++ b/cmake/ecbuild_list_exclude_pattern.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_list_extra_search_paths.cmake b/cmake/ecbuild_list_extra_search_paths.cmake
index b81f062..1ba31bc 100644
--- a/cmake/ecbuild_list_extra_search_paths.cmake
+++ b/cmake/ecbuild_list_extra_search_paths.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_list_macros.cmake b/cmake/ecbuild_list_macros.cmake
index 176a161..232e5e8 100644
--- a/cmake/ecbuild_list_macros.cmake
+++ b/cmake/ecbuild_list_macros.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_log.cmake b/cmake/ecbuild_log.cmake
index 32a1398..ca058fe 100644
--- a/cmake/ecbuild_log.cmake
+++ b/cmake/ecbuild_log.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -27,9 +27,10 @@
 # Furthermore there are auxilliary functions for outputting CMake variables,
 # CMake lists and environment variables if the log level is ``DEBUG``:
 #
-# :ecbuild_debug_var:     logs given CMake variables if log level <= ``DEBUG``
-# :ecbuild_debug_list:    logs given CMake lists if log level <= ``DEBUG``
-# :ecbuild_debug_env_var: logs given environment variables if log level <= ``DEBUG``
+# :ecbuild_debug_var:      logs given CMake variables if log level <= ``DEBUG``
+# :ecbuild_debug_list:     logs given CMake lists if log level <= ``DEBUG``
+# :ecbuild_debug_env_var:  logs given environment variables if log level <= ``DEBUG``
+# :ecbuild_debug_property: logs given global CMake property if log level <= ``DEBUG``
 #
 # To log a message to the ecBuild log file only at a given log level, use ::
 #
@@ -235,31 +236,14 @@ function( ecbuild_debug_env_var )
 endfunction()
 
 ##############################################################################
-# macro for debugging a cmake variable
+# function for debugging a CMake global property
 
-macro( debug_var VAR )
-
-    message( WARNING "DEPRECATED debug_var() -- ${VAR} [${${VAR}}]" )
-
-endmacro()
-
-##############################################################################
-# macro for debugging a cmake list
-
-macro( debug_list VAR )
-
-    message( WARNING "DEPRECATED debug_list() -- ${VAR}:" )
-    foreach( _elem ${${VAR}} )
-      message( WARNING "  ${_elem}" )
-    endforeach()
-
-endmacro()
-
-##############################################################################
-# macro for debugging a environment variable within cmake
-
-macro( debug_env_var VAR )
-
-    message( WARNING "DEPRECATED debug_env_var() -- ENV ${VAR} [$ENV{${VAR}}]" )
-
-endmacro()
+function( ecbuild_debug_property )
+  foreach( VAR ${ARGV} )
+    get_property( __prop GLOBAL PROPERTY ${VAR} )
+    ecbuild_log(DEBUG "PROPERTY ${VAR} : ${__prop}")
+    if( ECBUILD_LOG_LEVEL LESS 11)
+      message(STATUS "${Blue}DEBUG - PROPERTY ${VAR} [${__prop}]${ColourReset}")
+    endif()
+  endforeach()
+endfunction()
diff --git a/cmake/ecbuild_pkgconfig.cmake b/cmake/ecbuild_pkgconfig.cmake
index d839a86..ed1076d 100644
--- a/cmake/ecbuild_pkgconfig.cmake
+++ b/cmake/ecbuild_pkgconfig.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_policies.cmake b/cmake/ecbuild_policies.cmake
index 36ab7fe..df2b40f 100644
--- a/cmake/ecbuild_policies.cmake
+++ b/cmake/ecbuild_policies.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_print_summary.cmake b/cmake/ecbuild_print_summary.cmake
index 6fc70d0..c863e60 100644
--- a/cmake/ecbuild_print_summary.cmake
+++ b/cmake/ecbuild_print_summary.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -89,17 +89,23 @@ macro( ecbuild_print_summary )
 
     ecbuild_info( "common definitions: ${defs}" )
 
-    ecbuild_info( "---------------------------------------------------------" )
-
     ### FEATURE SUMMARY
 
-    # ecbuild_debug_var( CMAKE_VERSION )
+    ecbuild_info( "---------------------------------------------------------" )
+    ecbuild_info( "Feature summary" )
+    ecbuild_info( "---------------------------------------------------------" )
+
     if( ${CMAKE_VERSION} VERSION_LESS "2.8.6" )
-      feature_summary( WHAT ALL )
+      set( __what ALL )
     else()
-      feature_summary( WHAT ALL INCLUDE_QUIET_PACKAGES )
+      set( __what ALL INCLUDE_QUIET_PACKAGES )
     endif()
 
+    # Print feature summary
+    feature_summary( WHAT ${__what} )
+    # Write feature summary to ecbuild.log
+    feature_summary( WHAT ${__what} FILENAME ${ECBUILD_LOG_FILE} APPEND )
+
     ### WARNINGS
 
     # issue warnings / errors in case there are unused project files
diff --git a/cmake/ecbuild_project_files.cmake b/cmake/ecbuild_project_files.cmake
index 3e4b3d2..12c07c2 100644
--- a/cmake/ecbuild_project_files.cmake
+++ b/cmake/ecbuild_project_files.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_remove_fortran_flags.cmake b/cmake/ecbuild_remove_fortran_flags.cmake
index 3a80316..2a41f04 100644
--- a/cmake/ecbuild_remove_fortran_flags.cmake
+++ b/cmake/ecbuild_remove_fortran_flags.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_requires_macro_version.cmake b/cmake/ecbuild_requires_macro_version.cmake
index 1603446..8ff5617 100644
--- a/cmake/ecbuild_requires_macro_version.cmake
+++ b/cmake/ecbuild_requires_macro_version.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_separate_sources.cmake b/cmake/ecbuild_separate_sources.cmake
index 00722ae..69b6810 100644
--- a/cmake/ecbuild_separate_sources.cmake
+++ b/cmake/ecbuild_separate_sources.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -37,10 +37,11 @@
 # :<target>_cxx_srcs:     source files with extension .cc, .cxx, .cpp, .C
 # :<target>_fortran_srcs: source files with extension .f, .F, .for, f77, .f90,
 #                                                     .f95, .F77, .F90, .F95
+# :<target>_cuda_srcs:    source files with extension .cu
 #
 ##############################################################################
 
-macro( ecbuild_separate_sources )
+function( ecbuild_separate_sources )
 
 	set( options )
 	set( single_value_args TARGET  )
@@ -83,11 +84,20 @@ macro( ecbuild_separate_sources )
 			list( APPEND ${_PAR_TARGET}_fortran_srcs ${src} )
 		endif()
 	endforeach()
-	set_source_files_properties( ${${_PAR_TARGET}_fortran_srcs} PROPERTIES LANGUAGE Fortran )
 
-#    ecbuild_debug_var( ${_PAR_TARGET}_h_srcs )
-#    ecbuild_debug_var( ${_PAR_TARGET}_c_srcs )
-#    ecbuild_debug_var( ${_PAR_TARGET}_cxx_srcs )
-#    ecbuild_debug_var( ${_PAR_TARGET}_fortran_srcs )
+    foreach( src ${_PAR_SOURCES} )
+        if(${src} MATCHES "(\\.cu$)")
+            list( APPEND ${_PAR_TARGET}_cuda_srcs ${src} )
+        endif()
+    endforeach()
 
-endmacro( ecbuild_separate_sources )
+    set_source_files_properties( ${${_PAR_TARGET}_fortran_srcs} PROPERTIES LANGUAGE Fortran )
+
+    set( ${_PAR_TARGET}_h_srcs       "${${_PAR_TARGET}_h_srcs}"       PARENT_SCOPE )
+    set( ${_PAR_TARGET}_c_srcs       "${${_PAR_TARGET}_c_srcs}"       PARENT_SCOPE )
+    set( ${_PAR_TARGET}_cxx_srcs     "${${_PAR_TARGET}_cxx_srcs}"     PARENT_SCOPE )
+    set( ${_PAR_TARGET}_fortran_srcs "${${_PAR_TARGET}_fortran_srcs}" PARENT_SCOPE )
+    set( ${_PAR_TARGET}_cuda_srcs    "${${_PAR_TARGET}_cuda_srcs}"    PARENT_SCOPE )
+
+
+endfunction( ecbuild_separate_sources )
diff --git a/cmake/ecbuild_source_flags.cmake b/cmake/ecbuild_source_flags.cmake
index a281f1d..bd63258 100644
--- a/cmake/ecbuild_source_flags.cmake
+++ b/cmake/ecbuild_source_flags.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_system.cmake b/cmake/ecbuild_system.cmake
index f02113e..10af0c8 100644
--- a/cmake/ecbuild_system.cmake
+++ b/cmake/ecbuild_system.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -62,6 +62,12 @@ if( PROJECT_NAME STREQUAL CMAKE_PROJECT_NAME )
     # Include log macros since these are used right away
     include( ecbuild_log )
 
+    execute_process( COMMAND env OUTPUT_VARIABLE __env )
+    ecbuild_debug( "---------------------------------------------------------" )
+    ecbuild_debug( "Environment:" )
+    ecbuild_debug( "---------------------------------------------------------\n${__env}" )
+    ecbuild_debug( "---------------------------------------------------------" )
+
     ecbuild_info( "ecbuild   ${ecbuild_VERSION_STR}\t${ECBUILD_MACROS_DIR}" )
     ecbuild_info( "cmake     ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION}\t${CMAKE_COMMAND}" )
 
@@ -78,7 +84,7 @@ if( PROJECT_NAME STREQUAL CMAKE_PROJECT_NAME )
       ecbuild_info( "cache     ${ECBUILD_CACHE}" )
     endif()
 
-    message( STATUS "---------------------------------------------------------" )
+    ecbuild_info( "---------------------------------------------------------" )
 
     # clear the build dir exported targets file (only on the top project)
 
@@ -250,7 +256,7 @@ if( PROJECT_NAME STREQUAL CMAKE_PROJECT_NAME )
         set( EC_BUILD_TIMESTAMP  "${EC_BUILD_TIMESTAMP}" CACHE INTERNAL "Build timestamp" )
     endif()
 
-    message( STATUS "---------------------------------------------------------" )
+    ecbuild_info( "---------------------------------------------------------" )
 
 else()
 
@@ -259,7 +265,7 @@ else()
     # or
     #     set( ECBUILD_CONFIG "<subproject-config>.cmake" )
     if( ECBUILD_CONFIG )
-        message( STATUS "---------------------------------------------------------" )
+        ecbuild_info( "---------------------------------------------------------" )
         ecbuild_info( "config    ${ECBUILD_CONFIG}" )
         include( ${ECBUILD_CONFIG} )
     endif()
diff --git a/cmake/ecbuild_target_flags.cmake b/cmake/ecbuild_target_flags.cmake
index 4c589af..b6527d1 100644
--- a/cmake/ecbuild_target_flags.cmake
+++ b/cmake/ecbuild_target_flags.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_use_package.cmake b/cmake/ecbuild_use_package.cmake
index c88bca8..d54e459 100644
--- a/cmake/ecbuild_use_package.cmake
+++ b/cmake/ecbuild_use_package.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -16,6 +16,11 @@
 #
 #   ecbuild_use_package( PROJECT <name>
 #                        [ VERSION <version> [ EXACT ] ]
+#                        [ URL <url> ]
+#                        [ DESCRIPTION <description> ]
+#                        [ TYPE <type> ]
+#                        [ PURPOSE <purpose> ]
+#                        [ FAILURE_MSG <message> ]
 #                        [ REQUIRED ]
 #                        [ QUIET ] )
 #
@@ -31,6 +36,21 @@
 # EXACT : optional, requires VERSION
 #   require the exact version rather than a minimum version
 #
+# URL : optional
+#   homepage of the package (shown in summary and stored in the cache)
+#
+# DESCRIPTION : optional
+#   string describing the package (shown in summary and stored in the cache)
+#
+# TYPE : optional, one of RUNTIME|OPTIONAL|RECOMMENDED|REQUIRED
+#   type of dependency of the project on this package (defaults to OPTIONAL)
+#
+# PURPOSE : optional
+#   string describing which functionality this package enables in the project
+#
+# FAILURE_MSG : optional
+#   string to be appended to the failure message if the package is not found
+#
 # REQUIRED : optional
 #   fail if package cannot be found
 #
@@ -81,7 +101,7 @@
 macro( ecbuild_use_package )
 
   set( options            REQUIRED QUIET EXACT )
-  set( single_value_args  PROJECT VERSION )
+  set( single_value_args  PROJECT VERSION URL DESCRIPTION TYPE PURPOSE FAILURE_MSG )
   set( multi_value_args )
 
   cmake_parse_arguments( _p "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
@@ -98,6 +118,12 @@ macro( ecbuild_use_package )
     ecbuild_critical("Call to ecbuild_use_package() requests EXACT but doesn't specify VERSION.")
   endif()
 
+  # If the package is required, set TYPE to REQUIRED
+  # Due to shortcomings in CMake's argument parser, passing TYPE REQUIRED has no effect
+  if( _p_REQUIRED )
+    set( _p_TYPE REQUIRED )
+  endif()
+
   # try to find the package as a subproject and build it
 
   string( TOUPPER ${_p_PROJECT} pkgUPPER )
@@ -252,7 +278,16 @@ macro( ecbuild_use_package )
   # Case 4) is NOT FOUND so far, NOT as sub-project (now or before), and NOT as binary neither
   #         so try to find precompiled binaries or a build tree
 
-  if( NOT ${pkgUPPER}_FOUND )
+  if( ${pkgUPPER}_FOUND )
+    # Only set package properties if ecbuild_find_package, which itself calls
+    # set_package_properties, is not subsequently called since doing so would
+    # duplicate the purpose
+    set_package_properties( ${_p_PROJECT} PROPERTIES
+                            URL "${_p_URL}"
+                            DESCRIPTION "${_p_DESCRIPTION}"
+                            TYPE "${_p_TYPE}"
+                            PURPOSE "${_p_PURPOSE}" )
+  else()
 
     ecbuild_debug("ecbuild_use_package(${_p_PROJECT}): 4) project has NOT been added as a subproject and is NOT already FOUND")
 
@@ -266,6 +301,22 @@ macro( ecbuild_use_package )
     if( _p_REQUIRED )
       list( APPEND _opts REQUIRED )
     endif()
+    if( _p_URL )
+      list( APPEND _opts URL ${_p_URL} )
+    endif()
+    if( _p_DESCRIPTION )
+      list( APPEND _opts DESCRIPTION "${_p_DESCRIPTION}" )
+    endif()
+    if( _p_TYPE )
+      list( APPEND _opts TYPE ${_p_TYPE} )
+    endif()
+    if( _p_PURPOSE )
+      list( APPEND _opts PURPOSE "${_p_PURPOSE}" )
+    endif()
+    if( _p_FAILURE_MSG )
+      ecbuild_debug_var( _p_FAILURE_MSG )
+      list( APPEND _opts FAILURE_MSG "${_p_FAILURE_MSG}" )
+    endif()
 
     ecbuild_find_package( NAME ${_p_PROJECT} ${_opts} )
 
diff --git a/cmake/ecbuild_version.h.in b/cmake/ecbuild_version.h.in
index 70c5f0a..89b0e33 100644
--- a/cmake/ecbuild_version.h.in
+++ b/cmake/ecbuild_version.h.in
@@ -1,5 +1,5 @@
 /*
- * (C) Copyright 1996-2016 ECMWF.
+ * (C) Copyright 1996-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
diff --git a/cmake/ecbuild_warn_unused_files.cmake b/cmake/ecbuild_warn_unused_files.cmake
index 314a006..7d330d7 100644
--- a/cmake/ecbuild_warn_unused_files.cmake
+++ b/cmake/ecbuild_warn_unused_files.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 # 
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
diff --git a/cmake/gen_source_flags.py b/cmake/gen_source_flags.py
index b976d31..c08ad08 100644
--- a/cmake/gen_source_flags.py
+++ b/cmake/gen_source_flags.py
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/include/ecbuild/boost_test_framework.h b/cmake/include/ecbuild/boost_test_framework.h
index f593b70..ba48689 100644
--- a/cmake/include/ecbuild/boost_test_framework.h
+++ b/cmake/include/ecbuild/boost_test_framework.h
@@ -1,5 +1,5 @@
 /*
- * (C) Copyright 1996-2016 ECMWF.
+ * (C) Copyright 1996-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/sg.pl b/cmake/sg.pl
index 6bce843..f8c8e31 100644
--- a/cmake/sg.pl
+++ b/cmake/sg.pl
@@ -1,7 +1,7 @@
 #!/usr/bin/perl
 #!/usr/local/share/perl56
 
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
 # 
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
diff --git a/data/CMakeLists.txt b/data/CMakeLists.txt
index 0df7e73..352e014 100644
--- a/data/CMakeLists.txt
+++ b/data/CMakeLists.txt
@@ -19,9 +19,6 @@ ecbuild_get_test_multidata( TARGET eccodes_download_gribs
                             NOCHECK
                             NAMES ${files_to_download} )
 
-if( ENABLE_TESTS )
-  set_property( TEST eccodes_download_gribs APPEND PROPERTY LABELS download_data )
-endif()
 
 # Copy other files - e.g. reference data, text files etc from the source data dir
 LIST(APPEND other_files
diff --git a/data/bufr/CMakeLists.txt b/data/bufr/CMakeLists.txt
index 8f4818b..f816892 100644
--- a/data/bufr/CMakeLists.txt
+++ b/data/bufr/CMakeLists.txt
@@ -19,9 +19,6 @@ ecbuild_get_test_multidata(
      NOCHECK
      NAMES ${bufr_files_to_download} ${bufr_refs_to_download}
 )
-if( ENABLE_TESTS )
-  set_property( TEST eccodes_download_bufrs APPEND PROPERTY LABELS download_data )
-endif()
 
 # Copy other files - e.g. text files etc from the source data/bufr dir
 LIST(APPEND other_files
diff --git a/data/bufr/bufr_data_files.txt b/data/bufr/bufr_data_files.txt
index 0411148..e5d5005 100644
--- a/data/bufr/bufr_data_files.txt
+++ b/data/bufr/bufr_data_files.txt
@@ -137,3 +137,4 @@ profiler_european.bufr
 metar_with_2_bias.bufr
 temp-land-with-substituted-values.bufr
 imssnow.bufr
+sentinel1.bufr
diff --git a/data/grib_data_files.txt b/data/grib_data_files.txt
index 47f94f1..d25ae3e 100644
--- a/data/grib_data_files.txt
+++ b/data/grib_data_files.txt
@@ -22,6 +22,7 @@ index.grib
 grid_ieee.grib
 jpeg.grib2
 latlon.grib
+high_level_api.grib2
 lfpw.grib1
 missing_field.grib1
 missing.grib2
@@ -84,3 +85,4 @@ timeRangeIndicator_5.grib
 tp_ecmwf.grib
 v.grib2
 msl.octa.glob.grib1
+test_file.grib2
diff --git a/data/gts/CMakeLists.txt b/data/gts/CMakeLists.txt
index cee7c74..a349d27 100644
--- a/data/gts/CMakeLists.txt
+++ b/data/gts/CMakeLists.txt
@@ -14,10 +14,6 @@ ecbuild_get_test_multidata(
      NOCHECK
      NAMES ${gts_files_to_download} ${gts_refs_to_download}
 )
-if( ENABLE_TESTS )
-  set_property( TEST eccodes_download_gts APPEND PROPERTY LABELS download_data )
-endif()
-
 
 # Copy other files - e.g. text files etc from the source data/gts dir
 LIST(APPEND other_files
diff --git a/data/metar/CMakeLists.txt b/data/metar/CMakeLists.txt
index f1ab808..5d89807 100644
--- a/data/metar/CMakeLists.txt
+++ b/data/metar/CMakeLists.txt
@@ -18,10 +18,6 @@ ecbuild_get_test_multidata(
      NAMES ${metar_files_to_download} ${metar_refs_to_download}
 )
 
-if( ENABLE_TESTS )
-  set_property( TEST eccodes_download_metars APPEND PROPERTY LABELS download_data )
-endif()
-
 # Copy other files - e.g. text files etc from the source data/metar dir
 LIST(APPEND other_files
     metar_data_files.txt
diff --git a/data/tigge/CMakeLists.txt b/data/tigge/CMakeLists.txt
index 110c52d..375cbd3 100644
--- a/data/tigge/CMakeLists.txt
+++ b/data/tigge/CMakeLists.txt
@@ -8,10 +8,6 @@ string(REGEX REPLACE "\n" ";" tigge_files_to_download "${tigge_files_to_download
 ecbuild_get_test_multidata( TARGET eccodes_download_tigge_gribs
                             NOCHECK
                             NAMES ${tigge_files_to_download} )
-if( ENABLE_TESTS )
-  set_property( TEST eccodes_download_tigge_gribs APPEND PROPERTY LABELS download_data )
-endif()
-
 #######
 # Copy other files - e.g. reference data, text files etc from the source data dir
 LIST(APPEND other_files
diff --git a/definitions/Makefile.am b/definitions/Makefile.am
index fed200b..93d3611 100644
--- a/definitions/Makefile.am
+++ b/definitions/Makefile.am
@@ -22,6 +22,7 @@ dist_definitionsbudg_DATA = \
 definitionsbufrdir = @ECCODES_DEFINITION_PATH@/bufr
 dist_definitionsbufr_DATA = \
 	bufr/boot.def\
+	bufr/boot_edition_0.def\
 	bufr/boot_edition_1.def\
 	bufr/boot_edition_2.def\
 	bufr/boot_edition_3.def\
@@ -7050,6 +7051,467 @@ dist_definitionsbufr_tables_0_wmo_26_codetables_DATA = \
 	bufr/tables/0/wmo/26/codetables/8087.table\
 	bufr/tables/0/wmo/26/codetables/8091.table
 
+definitionsbufr_tables_0_wmo_27dir = @ECCODES_DEFINITION_PATH@/bufr/tables/0/wmo/27
+dist_definitionsbufr_tables_0_wmo_27_DATA = \
+	bufr/tables/0/wmo/27/element.table\
+	bufr/tables/0/wmo/27/sequence.def
+
+definitionsbufr_tables_0_wmo_27_codetablesdir = @ECCODES_DEFINITION_PATH@/bufr/tables/0/wmo/27/codetables
+dist_definitionsbufr_tables_0_wmo_27_codetables_DATA = \
+	bufr/tables/0/wmo/27/codetables/1003.table\
+	bufr/tables/0/wmo/27/codetables/10063.table\
+	bufr/tables/0/wmo/27/codetables/10064.table\
+	bufr/tables/0/wmo/27/codetables/1007.table\
+	bufr/tables/0/wmo/27/codetables/1024.table\
+	bufr/tables/0/wmo/27/codetables/1028.table\
+	bufr/tables/0/wmo/27/codetables/1029.table\
+	bufr/tables/0/wmo/27/codetables/1033.table\
+	bufr/tables/0/wmo/27/codetables/1034.table\
+	bufr/tables/0/wmo/27/codetables/1036.table\
+	bufr/tables/0/wmo/27/codetables/1038.table\
+	bufr/tables/0/wmo/27/codetables/1052.table\
+	bufr/tables/0/wmo/27/codetables/1090.table\
+	bufr/tables/0/wmo/27/codetables/1092.table\
+	bufr/tables/0/wmo/27/codetables/1101.table\
+	bufr/tables/0/wmo/27/codetables/11030.table\
+	bufr/tables/0/wmo/27/codetables/11031.table\
+	bufr/tables/0/wmo/27/codetables/11037.table\
+	bufr/tables/0/wmo/27/codetables/11038.table\
+	bufr/tables/0/wmo/27/codetables/11039.table\
+	bufr/tables/0/wmo/27/codetables/1150.table\
+	bufr/tables/0/wmo/27/codetables/1151.table\
+	bufr/tables/0/wmo/27/codetables/13038.table\
+	bufr/tables/0/wmo/27/codetables/13039.table\
+	bufr/tables/0/wmo/27/codetables/13040.table\
+	bufr/tables/0/wmo/27/codetables/13041.table\
+	bufr/tables/0/wmo/27/codetables/13051.table\
+	bufr/tables/0/wmo/27/codetables/13056.table\
+	bufr/tables/0/wmo/27/codetables/13057.table\
+	bufr/tables/0/wmo/27/codetables/15025.table\
+	bufr/tables/0/wmo/27/codetables/19001.table\
+	bufr/tables/0/wmo/27/codetables/19008.table\
+	bufr/tables/0/wmo/27/codetables/19010.table\
+	bufr/tables/0/wmo/27/codetables/19100.table\
+	bufr/tables/0/wmo/27/codetables/19101.table\
+	bufr/tables/0/wmo/27/codetables/19102.table\
+	bufr/tables/0/wmo/27/codetables/19103.table\
+	bufr/tables/0/wmo/27/codetables/19104.table\
+	bufr/tables/0/wmo/27/codetables/19105.table\
+	bufr/tables/0/wmo/27/codetables/19107.table\
+	bufr/tables/0/wmo/27/codetables/19108.table\
+	bufr/tables/0/wmo/27/codetables/19109.table\
+	bufr/tables/0/wmo/27/codetables/19110.table\
+	bufr/tables/0/wmo/27/codetables/19113.table\
+	bufr/tables/0/wmo/27/codetables/19117.table\
+	bufr/tables/0/wmo/27/codetables/19119.table\
+	bufr/tables/0/wmo/27/codetables/20003.table\
+	bufr/tables/0/wmo/27/codetables/20004.table\
+	bufr/tables/0/wmo/27/codetables/20005.table\
+	bufr/tables/0/wmo/27/codetables/20006.table\
+	bufr/tables/0/wmo/27/codetables/20008.table\
+	bufr/tables/0/wmo/27/codetables/20009.table\
+	bufr/tables/0/wmo/27/codetables/2001.table\
+	bufr/tables/0/wmo/27/codetables/20011.table\
+	bufr/tables/0/wmo/27/codetables/20012.table\
+	bufr/tables/0/wmo/27/codetables/20017.table\
+	bufr/tables/0/wmo/27/codetables/20018.table\
+	bufr/tables/0/wmo/27/codetables/2002.table\
+	bufr/tables/0/wmo/27/codetables/20021.table\
+	bufr/tables/0/wmo/27/codetables/20022.table\
+	bufr/tables/0/wmo/27/codetables/20023.table\
+	bufr/tables/0/wmo/27/codetables/20024.table\
+	bufr/tables/0/wmo/27/codetables/20025.table\
+	bufr/tables/0/wmo/27/codetables/20026.table\
+	bufr/tables/0/wmo/27/codetables/20027.table\
+	bufr/tables/0/wmo/27/codetables/20028.table\
+	bufr/tables/0/wmo/27/codetables/20029.table\
+	bufr/tables/0/wmo/27/codetables/2003.table\
+	bufr/tables/0/wmo/27/codetables/20032.table\
+	bufr/tables/0/wmo/27/codetables/20033.table\
+	bufr/tables/0/wmo/27/codetables/20034.table\
+	bufr/tables/0/wmo/27/codetables/20035.table\
+	bufr/tables/0/wmo/27/codetables/20036.table\
+	bufr/tables/0/wmo/27/codetables/20037.table\
+	bufr/tables/0/wmo/27/codetables/2004.table\
+	bufr/tables/0/wmo/27/codetables/20040.table\
+	bufr/tables/0/wmo/27/codetables/20041.table\
+	bufr/tables/0/wmo/27/codetables/20042.table\
+	bufr/tables/0/wmo/27/codetables/20045.table\
+	bufr/tables/0/wmo/27/codetables/20048.table\
+	bufr/tables/0/wmo/27/codetables/20050.table\
+	bufr/tables/0/wmo/27/codetables/20055.table\
+	bufr/tables/0/wmo/27/codetables/20056.table\
+	bufr/tables/0/wmo/27/codetables/20062.table\
+	bufr/tables/0/wmo/27/codetables/20063.table\
+	bufr/tables/0/wmo/27/codetables/2007.table\
+	bufr/tables/0/wmo/27/codetables/20071.table\
+	bufr/tables/0/wmo/27/codetables/20085.table\
+	bufr/tables/0/wmo/27/codetables/20086.table\
+	bufr/tables/0/wmo/27/codetables/20087.table\
+	bufr/tables/0/wmo/27/codetables/20089.table\
+	bufr/tables/0/wmo/27/codetables/20090.table\
+	bufr/tables/0/wmo/27/codetables/20101.table\
+	bufr/tables/0/wmo/27/codetables/20102.table\
+	bufr/tables/0/wmo/27/codetables/20103.table\
+	bufr/tables/0/wmo/27/codetables/20104.table\
+	bufr/tables/0/wmo/27/codetables/20105.table\
+	bufr/tables/0/wmo/27/codetables/20106.table\
+	bufr/tables/0/wmo/27/codetables/20107.table\
+	bufr/tables/0/wmo/27/codetables/20108.table\
+	bufr/tables/0/wmo/27/codetables/2011.table\
+	bufr/tables/0/wmo/27/codetables/20119.table\
+	bufr/tables/0/wmo/27/codetables/20124.table\
+	bufr/tables/0/wmo/27/codetables/2013.table\
+	bufr/tables/0/wmo/27/codetables/20136.table\
+	bufr/tables/0/wmo/27/codetables/20137.table\
+	bufr/tables/0/wmo/27/codetables/20138.table\
+	bufr/tables/0/wmo/27/codetables/2014.table\
+	bufr/tables/0/wmo/27/codetables/2015.table\
+	bufr/tables/0/wmo/27/codetables/2016.table\
+	bufr/tables/0/wmo/27/codetables/2017.table\
+	bufr/tables/0/wmo/27/codetables/2019.table\
+	bufr/tables/0/wmo/27/codetables/2020.table\
+	bufr/tables/0/wmo/27/codetables/2021.table\
+	bufr/tables/0/wmo/27/codetables/2022.table\
+	bufr/tables/0/wmo/27/codetables/2023.table\
+	bufr/tables/0/wmo/27/codetables/2024.table\
+	bufr/tables/0/wmo/27/codetables/2025.table\
+	bufr/tables/0/wmo/27/codetables/2030.table\
+	bufr/tables/0/wmo/27/codetables/2031.table\
+	bufr/tables/0/wmo/27/codetables/2032.table\
+	bufr/tables/0/wmo/27/codetables/2033.table\
+	bufr/tables/0/wmo/27/codetables/2034.table\
+	bufr/tables/0/wmo/27/codetables/2036.table\
+	bufr/tables/0/wmo/27/codetables/2037.table\
+	bufr/tables/0/wmo/27/codetables/2038.table\
+	bufr/tables/0/wmo/27/codetables/2039.table\
+	bufr/tables/0/wmo/27/codetables/2040.table\
+	bufr/tables/0/wmo/27/codetables/2041.table\
+	bufr/tables/0/wmo/27/codetables/2042.table\
+	bufr/tables/0/wmo/27/codetables/2044.table\
+	bufr/tables/0/wmo/27/codetables/2045.table\
+	bufr/tables/0/wmo/27/codetables/2046.table\
+	bufr/tables/0/wmo/27/codetables/2047.table\
+	bufr/tables/0/wmo/27/codetables/2048.table\
+	bufr/tables/0/wmo/27/codetables/2049.table\
+	bufr/tables/0/wmo/27/codetables/2050.table\
+	bufr/tables/0/wmo/27/codetables/2051.table\
+	bufr/tables/0/wmo/27/codetables/2052.table\
+	bufr/tables/0/wmo/27/codetables/2053.table\
+	bufr/tables/0/wmo/27/codetables/2054.table\
+	bufr/tables/0/wmo/27/codetables/2055.table\
+	bufr/tables/0/wmo/27/codetables/2056.table\
+	bufr/tables/0/wmo/27/codetables/2057.table\
+	bufr/tables/0/wmo/27/codetables/2058.table\
+	bufr/tables/0/wmo/27/codetables/2059.table\
+	bufr/tables/0/wmo/27/codetables/2060.table\
+	bufr/tables/0/wmo/27/codetables/2061.table\
+	bufr/tables/0/wmo/27/codetables/2062.table\
+	bufr/tables/0/wmo/27/codetables/2064.table\
+	bufr/tables/0/wmo/27/codetables/2066.table\
+	bufr/tables/0/wmo/27/codetables/2070.table\
+	bufr/tables/0/wmo/27/codetables/2080.table\
+	bufr/tables/0/wmo/27/codetables/2081.table\
+	bufr/tables/0/wmo/27/codetables/2083.table\
+	bufr/tables/0/wmo/27/codetables/2084.table\
+	bufr/tables/0/wmo/27/codetables/2095.table\
+	bufr/tables/0/wmo/27/codetables/2096.table\
+	bufr/tables/0/wmo/27/codetables/2097.table\
+	bufr/tables/0/wmo/27/codetables/2099.table\
+	bufr/tables/0/wmo/27/codetables/2101.table\
+	bufr/tables/0/wmo/27/codetables/2103.table\
+	bufr/tables/0/wmo/27/codetables/2104.table\
+	bufr/tables/0/wmo/27/codetables/21066.table\
+	bufr/tables/0/wmo/27/codetables/21067.table\
+	bufr/tables/0/wmo/27/codetables/21068.table\
+	bufr/tables/0/wmo/27/codetables/21069.table\
+	bufr/tables/0/wmo/27/codetables/21070.table\
+	bufr/tables/0/wmo/27/codetables/21072.table\
+	bufr/tables/0/wmo/27/codetables/21073.table\
+	bufr/tables/0/wmo/27/codetables/21076.table\
+	bufr/tables/0/wmo/27/codetables/21109.table\
+	bufr/tables/0/wmo/27/codetables/21115.table\
+	bufr/tables/0/wmo/27/codetables/21116.table\
+	bufr/tables/0/wmo/27/codetables/21119.table\
+	bufr/tables/0/wmo/27/codetables/21144.table\
+	bufr/tables/0/wmo/27/codetables/21148.table\
+	bufr/tables/0/wmo/27/codetables/2115.table\
+	bufr/tables/0/wmo/27/codetables/21150.table\
+	bufr/tables/0/wmo/27/codetables/21155.table\
+	bufr/tables/0/wmo/27/codetables/21158.table\
+	bufr/tables/0/wmo/27/codetables/21159.table\
+	bufr/tables/0/wmo/27/codetables/21169.table\
+	bufr/tables/0/wmo/27/codetables/2119.table\
+	bufr/tables/0/wmo/27/codetables/2131.table\
+	bufr/tables/0/wmo/27/codetables/2137.table\
+	bufr/tables/0/wmo/27/codetables/2138.table\
+	bufr/tables/0/wmo/27/codetables/2139.table\
+	bufr/tables/0/wmo/27/codetables/2143.table\
+	bufr/tables/0/wmo/27/codetables/2144.table\
+	bufr/tables/0/wmo/27/codetables/2145.table\
+	bufr/tables/0/wmo/27/codetables/2146.table\
+	bufr/tables/0/wmo/27/codetables/2147.table\
+	bufr/tables/0/wmo/27/codetables/2148.table\
+	bufr/tables/0/wmo/27/codetables/2149.table\
+	bufr/tables/0/wmo/27/codetables/2150.table\
+	bufr/tables/0/wmo/27/codetables/2151.table\
+	bufr/tables/0/wmo/27/codetables/2152.table\
+	bufr/tables/0/wmo/27/codetables/2158.table\
+	bufr/tables/0/wmo/27/codetables/2159.table\
+	bufr/tables/0/wmo/27/codetables/2160.table\
+	bufr/tables/0/wmo/27/codetables/2163.table\
+	bufr/tables/0/wmo/27/codetables/2164.table\
+	bufr/tables/0/wmo/27/codetables/2165.table\
+	bufr/tables/0/wmo/27/codetables/2166.table\
+	bufr/tables/0/wmo/27/codetables/2167.table\
+	bufr/tables/0/wmo/27/codetables/2169.table\
+	bufr/tables/0/wmo/27/codetables/2170.table\
+	bufr/tables/0/wmo/27/codetables/2172.table\
+	bufr/tables/0/wmo/27/codetables/2175.table\
+	bufr/tables/0/wmo/27/codetables/2176.table\
+	bufr/tables/0/wmo/27/codetables/2177.table\
+	bufr/tables/0/wmo/27/codetables/2178.table\
+	bufr/tables/0/wmo/27/codetables/2179.table\
+	bufr/tables/0/wmo/27/codetables/2180.table\
+	bufr/tables/0/wmo/27/codetables/2181.table\
+	bufr/tables/0/wmo/27/codetables/2182.table\
+	bufr/tables/0/wmo/27/codetables/2183.table\
+	bufr/tables/0/wmo/27/codetables/2184.table\
+	bufr/tables/0/wmo/27/codetables/2185.table\
+	bufr/tables/0/wmo/27/codetables/2186.table\
+	bufr/tables/0/wmo/27/codetables/2187.table\
+	bufr/tables/0/wmo/27/codetables/2188.table\
+	bufr/tables/0/wmo/27/codetables/2189.table\
+	bufr/tables/0/wmo/27/codetables/2191.table\
+	bufr/tables/0/wmo/27/codetables/22056.table\
+	bufr/tables/0/wmo/27/codetables/22060.table\
+	bufr/tables/0/wmo/27/codetables/22061.table\
+	bufr/tables/0/wmo/27/codetables/22067.table\
+	bufr/tables/0/wmo/27/codetables/22068.table\
+	bufr/tables/0/wmo/27/codetables/22120.table\
+	bufr/tables/0/wmo/27/codetables/22121.table\
+	bufr/tables/0/wmo/27/codetables/22122.table\
+	bufr/tables/0/wmo/27/codetables/22123.table\
+	bufr/tables/0/wmo/27/codetables/22178.table\
+	bufr/tables/0/wmo/27/codetables/23001.table\
+	bufr/tables/0/wmo/27/codetables/23002.table\
+	bufr/tables/0/wmo/27/codetables/23003.table\
+	bufr/tables/0/wmo/27/codetables/23004.table\
+	bufr/tables/0/wmo/27/codetables/23005.table\
+	bufr/tables/0/wmo/27/codetables/23006.table\
+	bufr/tables/0/wmo/27/codetables/23007.table\
+	bufr/tables/0/wmo/27/codetables/23008.table\
+	bufr/tables/0/wmo/27/codetables/23009.table\
+	bufr/tables/0/wmo/27/codetables/23016.table\
+	bufr/tables/0/wmo/27/codetables/23018.table\
+	bufr/tables/0/wmo/27/codetables/23031.table\
+	bufr/tables/0/wmo/27/codetables/23032.table\
+	bufr/tables/0/wmo/27/codetables/24003.table\
+	bufr/tables/0/wmo/27/codetables/25004.table\
+	bufr/tables/0/wmo/27/codetables/25005.table\
+	bufr/tables/0/wmo/27/codetables/25006.table\
+	bufr/tables/0/wmo/27/codetables/25009.table\
+	bufr/tables/0/wmo/27/codetables/25010.table\
+	bufr/tables/0/wmo/27/codetables/25011.table\
+	bufr/tables/0/wmo/27/codetables/25012.table\
+	bufr/tables/0/wmo/27/codetables/25013.table\
+	bufr/tables/0/wmo/27/codetables/25015.table\
+	bufr/tables/0/wmo/27/codetables/25017.table\
+	bufr/tables/0/wmo/27/codetables/25020.table\
+	bufr/tables/0/wmo/27/codetables/25021.table\
+	bufr/tables/0/wmo/27/codetables/25022.table\
+	bufr/tables/0/wmo/27/codetables/25023.table\
+	bufr/tables/0/wmo/27/codetables/25024.table\
+	bufr/tables/0/wmo/27/codetables/25029.table\
+	bufr/tables/0/wmo/27/codetables/25030.table\
+	bufr/tables/0/wmo/27/codetables/25031.table\
+	bufr/tables/0/wmo/27/codetables/25032.table\
+	bufr/tables/0/wmo/27/codetables/25033.table\
+	bufr/tables/0/wmo/27/codetables/25034.table\
+	bufr/tables/0/wmo/27/codetables/25035.table\
+	bufr/tables/0/wmo/27/codetables/25036.table\
+	bufr/tables/0/wmo/27/codetables/25040.table\
+	bufr/tables/0/wmo/27/codetables/25041.table\
+	bufr/tables/0/wmo/27/codetables/25042.table\
+	bufr/tables/0/wmo/27/codetables/25053.table\
+	bufr/tables/0/wmo/27/codetables/25063.table\
+	bufr/tables/0/wmo/27/codetables/25069.table\
+	bufr/tables/0/wmo/27/codetables/25086.table\
+	bufr/tables/0/wmo/27/codetables/25090.table\
+	bufr/tables/0/wmo/27/codetables/25093.table\
+	bufr/tables/0/wmo/27/codetables/25095.table\
+	bufr/tables/0/wmo/27/codetables/25096.table\
+	bufr/tables/0/wmo/27/codetables/25097.table\
+	bufr/tables/0/wmo/27/codetables/25098.table\
+	bufr/tables/0/wmo/27/codetables/25099.table\
+	bufr/tables/0/wmo/27/codetables/25110.table\
+	bufr/tables/0/wmo/27/codetables/25112.table\
+	bufr/tables/0/wmo/27/codetables/25113.table\
+	bufr/tables/0/wmo/27/codetables/25120.table\
+	bufr/tables/0/wmo/27/codetables/25122.table\
+	bufr/tables/0/wmo/27/codetables/25123.table\
+	bufr/tables/0/wmo/27/codetables/25124.table\
+	bufr/tables/0/wmo/27/codetables/25150.table\
+	bufr/tables/0/wmo/27/codetables/25174.table\
+	bufr/tables/0/wmo/27/codetables/25181.table\
+	bufr/tables/0/wmo/27/codetables/25182.table\
+	bufr/tables/0/wmo/27/codetables/25184.table\
+	bufr/tables/0/wmo/27/codetables/25185.table\
+	bufr/tables/0/wmo/27/codetables/25187.table\
+	bufr/tables/0/wmo/27/codetables/25188.table\
+	bufr/tables/0/wmo/27/codetables/26010.table\
+	bufr/tables/0/wmo/27/codetables/29001.table\
+	bufr/tables/0/wmo/27/codetables/29002.table\
+	bufr/tables/0/wmo/27/codetables/3001.table\
+	bufr/tables/0/wmo/27/codetables/3003.table\
+	bufr/tables/0/wmo/27/codetables/30031.table\
+	bufr/tables/0/wmo/27/codetables/30032.table\
+	bufr/tables/0/wmo/27/codetables/3004.table\
+	bufr/tables/0/wmo/27/codetables/3008.table\
+	bufr/tables/0/wmo/27/codetables/3010.table\
+	bufr/tables/0/wmo/27/codetables/3011.table\
+	bufr/tables/0/wmo/27/codetables/3012.table\
+	bufr/tables/0/wmo/27/codetables/3016.table\
+	bufr/tables/0/wmo/27/codetables/3017.table\
+	bufr/tables/0/wmo/27/codetables/3018.table\
+	bufr/tables/0/wmo/27/codetables/3019.table\
+	bufr/tables/0/wmo/27/codetables/3020.table\
+	bufr/tables/0/wmo/27/codetables/3021.table\
+	bufr/tables/0/wmo/27/codetables/3022.table\
+	bufr/tables/0/wmo/27/codetables/3023.table\
+	bufr/tables/0/wmo/27/codetables/31021.table\
+	bufr/tables/0/wmo/27/codetables/31031.table\
+	bufr/tables/0/wmo/27/codetables/33002.table\
+	bufr/tables/0/wmo/27/codetables/33003.table\
+	bufr/tables/0/wmo/27/codetables/33005.table\
+	bufr/tables/0/wmo/27/codetables/33006.table\
+	bufr/tables/0/wmo/27/codetables/33015.table\
+	bufr/tables/0/wmo/27/codetables/33020.table\
+	bufr/tables/0/wmo/27/codetables/33021.table\
+	bufr/tables/0/wmo/27/codetables/33022.table\
+	bufr/tables/0/wmo/27/codetables/33023.table\
+	bufr/tables/0/wmo/27/codetables/33024.table\
+	bufr/tables/0/wmo/27/codetables/33025.table\
+	bufr/tables/0/wmo/27/codetables/33026.table\
+	bufr/tables/0/wmo/27/codetables/33027.table\
+	bufr/tables/0/wmo/27/codetables/33028.table\
+	bufr/tables/0/wmo/27/codetables/33030.table\
+	bufr/tables/0/wmo/27/codetables/33031.table\
+	bufr/tables/0/wmo/27/codetables/33032.table\
+	bufr/tables/0/wmo/27/codetables/33033.table\
+	bufr/tables/0/wmo/27/codetables/33035.table\
+	bufr/tables/0/wmo/27/codetables/33037.table\
+	bufr/tables/0/wmo/27/codetables/33038.table\
+	bufr/tables/0/wmo/27/codetables/33039.table\
+	bufr/tables/0/wmo/27/codetables/33041.table\
+	bufr/tables/0/wmo/27/codetables/33042.table\
+	bufr/tables/0/wmo/27/codetables/33043.table\
+	bufr/tables/0/wmo/27/codetables/33044.table\
+	bufr/tables/0/wmo/27/codetables/33047.table\
+	bufr/tables/0/wmo/27/codetables/33048.table\
+	bufr/tables/0/wmo/27/codetables/33049.table\
+	bufr/tables/0/wmo/27/codetables/33050.table\
+	bufr/tables/0/wmo/27/codetables/33060.table\
+	bufr/tables/0/wmo/27/codetables/33070.table\
+	bufr/tables/0/wmo/27/codetables/33071.table\
+	bufr/tables/0/wmo/27/codetables/33072.table\
+	bufr/tables/0/wmo/27/codetables/33075.table\
+	bufr/tables/0/wmo/27/codetables/33076.table\
+	bufr/tables/0/wmo/27/codetables/33077.table\
+	bufr/tables/0/wmo/27/codetables/33078.table\
+	bufr/tables/0/wmo/27/codetables/33079.table\
+	bufr/tables/0/wmo/27/codetables/33080.table\
+	bufr/tables/0/wmo/27/codetables/33081.table\
+	bufr/tables/0/wmo/27/codetables/33082.table\
+	bufr/tables/0/wmo/27/codetables/33083.table\
+	bufr/tables/0/wmo/27/codetables/33084.table\
+	bufr/tables/0/wmo/27/codetables/33085.table\
+	bufr/tables/0/wmo/27/codetables/33086.table\
+	bufr/tables/0/wmo/27/codetables/33087.table\
+	bufr/tables/0/wmo/27/codetables/33088.table\
+	bufr/tables/0/wmo/27/codetables/35000.table\
+	bufr/tables/0/wmo/27/codetables/35001.table\
+	bufr/tables/0/wmo/27/codetables/35030.table\
+	bufr/tables/0/wmo/27/codetables/35031.table\
+	bufr/tables/0/wmo/27/codetables/35032.table\
+	bufr/tables/0/wmo/27/codetables/35033.table\
+	bufr/tables/0/wmo/27/codetables/35034.table\
+	bufr/tables/0/wmo/27/codetables/35035.table\
+	bufr/tables/0/wmo/27/codetables/40005.table\
+	bufr/tables/0/wmo/27/codetables/40006.table\
+	bufr/tables/0/wmo/27/codetables/40011.table\
+	bufr/tables/0/wmo/27/codetables/40012.table\
+	bufr/tables/0/wmo/27/codetables/40013.table\
+	bufr/tables/0/wmo/27/codetables/40020.table\
+	bufr/tables/0/wmo/27/codetables/40023.table\
+	bufr/tables/0/wmo/27/codetables/40024.table\
+	bufr/tables/0/wmo/27/codetables/40025.table\
+	bufr/tables/0/wmo/27/codetables/40028.table\
+	bufr/tables/0/wmo/27/codetables/40036.table\
+	bufr/tables/0/wmo/27/codetables/4059.table\
+	bufr/tables/0/wmo/27/codetables/4080.table\
+	bufr/tables/0/wmo/27/codetables/42004.table\
+	bufr/tables/0/wmo/27/codetables/5069.table\
+	bufr/tables/0/wmo/27/codetables/8001.table\
+	bufr/tables/0/wmo/27/codetables/8002.table\
+	bufr/tables/0/wmo/27/codetables/8003.table\
+	bufr/tables/0/wmo/27/codetables/8004.table\
+	bufr/tables/0/wmo/27/codetables/8005.table\
+	bufr/tables/0/wmo/27/codetables/8006.table\
+	bufr/tables/0/wmo/27/codetables/8007.table\
+	bufr/tables/0/wmo/27/codetables/8008.table\
+	bufr/tables/0/wmo/27/codetables/8009.table\
+	bufr/tables/0/wmo/27/codetables/8010.table\
+	bufr/tables/0/wmo/27/codetables/8011.table\
+	bufr/tables/0/wmo/27/codetables/8012.table\
+	bufr/tables/0/wmo/27/codetables/8013.table\
+	bufr/tables/0/wmo/27/codetables/8014.table\
+	bufr/tables/0/wmo/27/codetables/8015.table\
+	bufr/tables/0/wmo/27/codetables/8016.table\
+	bufr/tables/0/wmo/27/codetables/8017.table\
+	bufr/tables/0/wmo/27/codetables/8018.table\
+	bufr/tables/0/wmo/27/codetables/8019.table\
+	bufr/tables/0/wmo/27/codetables/8021.table\
+	bufr/tables/0/wmo/27/codetables/8023.table\
+	bufr/tables/0/wmo/27/codetables/8024.table\
+	bufr/tables/0/wmo/27/codetables/8025.table\
+	bufr/tables/0/wmo/27/codetables/8026.table\
+	bufr/tables/0/wmo/27/codetables/8029.table\
+	bufr/tables/0/wmo/27/codetables/8032.table\
+	bufr/tables/0/wmo/27/codetables/8033.table\
+	bufr/tables/0/wmo/27/codetables/8034.table\
+	bufr/tables/0/wmo/27/codetables/8035.table\
+	bufr/tables/0/wmo/27/codetables/8036.table\
+	bufr/tables/0/wmo/27/codetables/8039.table\
+	bufr/tables/0/wmo/27/codetables/8040.table\
+	bufr/tables/0/wmo/27/codetables/8041.table\
+	bufr/tables/0/wmo/27/codetables/8042.table\
+	bufr/tables/0/wmo/27/codetables/8043.table\
+	bufr/tables/0/wmo/27/codetables/8050.table\
+	bufr/tables/0/wmo/27/codetables/8051.table\
+	bufr/tables/0/wmo/27/codetables/8052.table\
+	bufr/tables/0/wmo/27/codetables/8053.table\
+	bufr/tables/0/wmo/27/codetables/8054.table\
+	bufr/tables/0/wmo/27/codetables/8060.table\
+	bufr/tables/0/wmo/27/codetables/8065.table\
+	bufr/tables/0/wmo/27/codetables/8066.table\
+	bufr/tables/0/wmo/27/codetables/8070.table\
+	bufr/tables/0/wmo/27/codetables/8072.table\
+	bufr/tables/0/wmo/27/codetables/8074.table\
+	bufr/tables/0/wmo/27/codetables/8075.table\
+	bufr/tables/0/wmo/27/codetables/8076.table\
+	bufr/tables/0/wmo/27/codetables/8077.table\
+	bufr/tables/0/wmo/27/codetables/8079.table\
+	bufr/tables/0/wmo/27/codetables/8080.table\
+	bufr/tables/0/wmo/27/codetables/8081.table\
+	bufr/tables/0/wmo/27/codetables/8082.table\
+	bufr/tables/0/wmo/27/codetables/8083.table\
+	bufr/tables/0/wmo/27/codetables/8085.table\
+	bufr/tables/0/wmo/27/codetables/8086.table\
+	bufr/tables/0/wmo/27/codetables/8087.table\
+	bufr/tables/0/wmo/27/codetables/8088.table\
+	bufr/tables/0/wmo/27/codetables/8091.table
+
 definitionsbufr_tables_0_wmo_6dir = @ECCODES_DEFINITION_PATH@/bufr/tables/0/wmo/6
 dist_definitionsbufr_tables_0_wmo_6_DATA = \
 	bufr/tables/0/wmo/6/element.table\
@@ -8392,6 +8854,7 @@ dist_definitionsgrib1_DATA = \
 	grib1/2.98.201.table\
 	grib1/2.98.210.table\
 	grib1/2.98.211.table\
+	grib1/2.98.213.table\
 	grib1/2.98.220.table\
 	grib1/2.98.228.table\
 	grib1/2.98.230.table\
@@ -8865,6 +9328,7 @@ dist_definitionsgrib2_DATA = \
 	grib2/template.4.46.def\
 	grib2/template.4.47.def\
 	grib2/template.4.48.def\
+	grib2/template.4.49.def\
 	grib2/template.4.5.def\
 	grib2/template.4.51.def\
 	grib2/template.4.53.def\
@@ -8872,10 +9336,15 @@ dist_definitionsgrib2_DATA = \
 	grib2/template.4.55.def\
 	grib2/template.4.56.def\
 	grib2/template.4.57.def\
+	grib2/template.4.59.def\
 	grib2/template.4.6.def\
 	grib2/template.4.60.def\
 	grib2/template.4.61.def\
 	grib2/template.4.7.def\
+	grib2/template.4.70.def\
+	grib2/template.4.71.def\
+	grib2/template.4.72.def\
+	grib2/template.4.73.def\
 	grib2/template.4.8.def\
 	grib2/template.4.9.def\
 	grib2/template.4.91.def\
@@ -8891,6 +9360,7 @@ dist_definitionsgrib2_DATA = \
 	grib2/template.4.parameter_chemical.def\
 	grib2/template.4.parameter_chemical_distribution.def\
 	grib2/template.4.parameter_partition.def\
+	grib2/template.4.parameter_postproc.def\
 	grib2/template.4.parameter_tile.def\
 	grib2/template.4.percentile.def\
 	grib2/template.4.point_in_time.def\
@@ -10272,6 +10742,138 @@ dist_definitionsgrib2_tables_17_DATA = \
 	grib2/tables/17/6.0.table\
 	grib2/tables/17/stepType.table
 
+definitionsgrib2_tables_18dir = @ECCODES_DEFINITION_PATH@/grib2/tables/18
+dist_definitionsgrib2_tables_18_DATA = \
+	grib2/tables/18/0.0.table\
+	grib2/tables/18/1.0.table\
+	grib2/tables/18/1.1.table\
+	grib2/tables/18/1.2.table\
+	grib2/tables/18/1.3.table\
+	grib2/tables/18/1.4.table\
+	grib2/tables/18/1.5.table\
+	grib2/tables/18/1.6.table\
+	grib2/tables/18/3.0.table\
+	grib2/tables/18/3.1.table\
+	grib2/tables/18/3.10.table\
+	grib2/tables/18/3.11.table\
+	grib2/tables/18/3.15.table\
+	grib2/tables/18/3.2.table\
+	grib2/tables/18/3.20.table\
+	grib2/tables/18/3.21.table\
+	grib2/tables/18/3.3.table\
+	grib2/tables/18/3.4.table\
+	grib2/tables/18/3.5.table\
+	grib2/tables/18/3.6.table\
+	grib2/tables/18/3.7.table\
+	grib2/tables/18/3.8.table\
+	grib2/tables/18/3.9.table\
+	grib2/tables/18/4.0.table\
+	grib2/tables/18/4.1.0.table\
+	grib2/tables/18/4.1.1.table\
+	grib2/tables/18/4.1.10.table\
+	grib2/tables/18/4.1.192.table\
+	grib2/tables/18/4.1.2.table\
+	grib2/tables/18/4.1.3.table\
+	grib2/tables/18/4.10.table\
+	grib2/tables/18/4.11.table\
+	grib2/tables/18/4.12.table\
+	grib2/tables/18/4.13.table\
+	grib2/tables/18/4.14.table\
+	grib2/tables/18/4.15.table\
+	grib2/tables/18/4.192.table\
+	grib2/tables/18/4.2.0.0.table\
+	grib2/tables/18/4.2.0.1.table\
+	grib2/tables/18/4.2.0.13.table\
+	grib2/tables/18/4.2.0.14.table\
+	grib2/tables/18/4.2.0.15.table\
+	grib2/tables/18/4.2.0.16.table\
+	grib2/tables/18/4.2.0.17.table\
+	grib2/tables/18/4.2.0.18.table\
+	grib2/tables/18/4.2.0.19.table\
+	grib2/tables/18/4.2.0.190.table\
+	grib2/tables/18/4.2.0.191.table\
+	grib2/tables/18/4.2.0.2.table\
+	grib2/tables/18/4.2.0.20.table\
+	grib2/tables/18/4.2.0.3.table\
+	grib2/tables/18/4.2.0.4.table\
+	grib2/tables/18/4.2.0.5.table\
+	grib2/tables/18/4.2.0.6.table\
+	grib2/tables/18/4.2.0.7.table\
+	grib2/tables/18/4.2.1.0.table\
+	grib2/tables/18/4.2.1.1.table\
+	grib2/tables/18/4.2.1.2.table\
+	grib2/tables/18/4.2.10.0.table\
+	grib2/tables/18/4.2.10.1.table\
+	grib2/tables/18/4.2.10.191.table\
+	grib2/tables/18/4.2.10.2.table\
+	grib2/tables/18/4.2.10.3.table\
+	grib2/tables/18/4.2.10.4.table\
+	grib2/tables/18/4.2.2.0.table\
+	grib2/tables/18/4.2.2.3.table\
+	grib2/tables/18/4.2.2.4.table\
+	grib2/tables/18/4.2.2.5.table\
+	grib2/tables/18/4.2.3.0.table\
+	grib2/tables/18/4.2.3.1.table\
+	grib2/tables/18/4.2.3.2.table\
+	grib2/tables/18/4.2.3.3.table\
+	grib2/tables/18/4.2.3.4.table\
+	grib2/tables/18/4.2.3.5.table\
+	grib2/tables/18/4.2.3.6.table\
+	grib2/tables/18/4.201.table\
+	grib2/tables/18/4.202.table\
+	grib2/tables/18/4.203.table\
+	grib2/tables/18/4.204.table\
+	grib2/tables/18/4.205.table\
+	grib2/tables/18/4.206.table\
+	grib2/tables/18/4.207.table\
+	grib2/tables/18/4.208.table\
+	grib2/tables/18/4.209.table\
+	grib2/tables/18/4.210.table\
+	grib2/tables/18/4.211.table\
+	grib2/tables/18/4.212.table\
+	grib2/tables/18/4.213.table\
+	grib2/tables/18/4.215.table\
+	grib2/tables/18/4.216.table\
+	grib2/tables/18/4.217.table\
+	grib2/tables/18/4.218.table\
+	grib2/tables/18/4.219.table\
+	grib2/tables/18/4.220.table\
+	grib2/tables/18/4.221.table\
+	grib2/tables/18/4.222.table\
+	grib2/tables/18/4.223.table\
+	grib2/tables/18/4.224.table\
+	grib2/tables/18/4.225.table\
+	grib2/tables/18/4.227.table\
+	grib2/tables/18/4.230.table\
+	grib2/tables/18/4.233.table\
+	grib2/tables/18/4.234.table\
+	grib2/tables/18/4.236.table\
+	grib2/tables/18/4.240.table\
+	grib2/tables/18/4.241.table\
+	grib2/tables/18/4.242.table\
+	grib2/tables/18/4.243.table\
+	grib2/tables/18/4.3.table\
+	grib2/tables/18/4.4.table\
+	grib2/tables/18/4.5.table\
+	grib2/tables/18/4.6.table\
+	grib2/tables/18/4.7.table\
+	grib2/tables/18/4.8.table\
+	grib2/tables/18/4.9.table\
+	grib2/tables/18/4.91.table\
+	grib2/tables/18/5.0.table\
+	grib2/tables/18/5.1.table\
+	grib2/tables/18/5.2.table\
+	grib2/tables/18/5.3.table\
+	grib2/tables/18/5.4.table\
+	grib2/tables/18/5.40.table\
+	grib2/tables/18/5.40000.table\
+	grib2/tables/18/5.5.table\
+	grib2/tables/18/5.50002.table\
+	grib2/tables/18/5.6.table\
+	grib2/tables/18/5.7.table\
+	grib2/tables/18/6.0.table\
+	grib2/tables/18/stepType.table
+
 definitionsgrib2_tables_2dir = @ECCODES_DEFINITION_PATH@/grib2/tables/2
 dist_definitionsgrib2_tables_2_DATA = \
 	grib2/tables/2/0.0.table\
@@ -12766,12 +13368,14 @@ dist_definitionsmars_DATA = \
 	mars/grib.dcda.4i.def\
 	mars/grib.dcda.me.def\
 	mars/grib.dcda.sim.def\
+	mars/grib.edmm.4v.def\
 	mars/grib.edmm.an.def\
 	mars/grib.edmm.cl.def\
 	mars/grib.edmm.fc.def\
 	mars/grib.edmm.fg.def\
 	mars/grib.edmm.ia.def\
 	mars/grib.edmm.ssd.def\
+	mars/grib.edmo.4v.def\
 	mars/grib.edmo.an.def\
 	mars/grib.edmo.cl.def\
 	mars/grib.edmo.fc.def\
@@ -12945,12 +13549,14 @@ dist_definitionsmars_DATA = \
 	mars/grib.mnfm.fcstdev.def\
 	mars/grib.mnfw.cf.def\
 	mars/grib.mnfw.fc.def\
+	mars/grib.mnth.4v.def\
 	mars/grib.mnth.an.def\
 	mars/grib.mnth.cl.def\
 	mars/grib.mnth.fc.def\
 	mars/grib.mnth.fg.def\
 	mars/grib.mnth.ia.def\
 	mars/grib.mnth.ssd.def\
+	mars/grib.moda.4v.def\
 	mars/grib.moda.an.def\
 	mars/grib.moda.cl.def\
 	mars/grib.moda.fc.def\
diff --git a/definitions/boot.def b/definitions/boot.def
index 4140a4d..90293f4 100644
--- a/definitions/boot.def
+++ b/definitions/boot.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/budg/boot.def b/definitions/budg/boot.def
index 6ecb862..b5229f6 100644
--- a/definitions/budg/boot.def
+++ b/definitions/budg/boot.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/budg/mars_labeling.def b/definitions/budg/mars_labeling.def
index cb8fbae..82ef6a6 100644
--- a/definitions/budg/mars_labeling.def
+++ b/definitions/budg/mars_labeling.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/budg/section.1.def b/definitions/budg/section.1.def
index dcd03b2..d7d7c85 100644
--- a/definitions/budg/section.1.def
+++ b/definitions/budg/section.1.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/budg/section.4.def b/definitions/budg/section.4.def
index 3260d2e..c9b988e 100644
--- a/definitions/budg/section.4.def
+++ b/definitions/budg/section.4.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/bufr/boot.def b/definitions/bufr/boot.def
index d803ea7..16c5d1d 100644
--- a/definitions/bufr/boot.def
+++ b/definitions/bufr/boot.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/bufr/boot_edition_0.def b/definitions/bufr/boot_edition_0.def
index 13eb1f2..5ffb760 100644
--- a/definitions/bufr/boot_edition_0.def
+++ b/definitions/bufr/boot_edition_0.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/bufr/boot_edition_1.def b/definitions/bufr/boot_edition_1.def
index e268bae..9017489 100644
--- a/definitions/bufr/boot_edition_1.def
+++ b/definitions/bufr/boot_edition_1.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/bufr/boot_edition_2.def b/definitions/bufr/boot_edition_2.def
index 0f5a614..f88b79b 100644
--- a/definitions/bufr/boot_edition_2.def
+++ b/definitions/bufr/boot_edition_2.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/bufr/boot_edition_3.def b/definitions/bufr/boot_edition_3.def
index be7f885..010c90f 100644
--- a/definitions/bufr/boot_edition_3.def
+++ b/definitions/bufr/boot_edition_3.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/bufr/boot_edition_4.def b/definitions/bufr/boot_edition_4.def
index a5eacbb..3745777 100644
--- a/definitions/bufr/boot_edition_4.def
+++ b/definitions/bufr/boot_edition_4.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/bufr/old_section.1.def b/definitions/bufr/old_section.1.def
index ba9a9c6..bb4299c 100644
--- a/definitions/bufr/old_section.1.def
+++ b/definitions/bufr/old_section.1.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/bufr/section.0.def b/definitions/bufr/section.0.def
index f47c8e9..cc545f4 100644
--- a/definitions/bufr/section.0.def
+++ b/definitions/bufr/section.0.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/bufr/section.1.1.def b/definitions/bufr/section.1.1.def
index d05c5a0..82e4842 100644
--- a/definitions/bufr/section.1.1.def
+++ b/definitions/bufr/section.1.1.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/bufr/section.1.2.def b/definitions/bufr/section.1.2.def
index 3777a38..b7a23da 100644
--- a/definitions/bufr/section.1.2.def
+++ b/definitions/bufr/section.1.2.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/bufr/section.1.3.def b/definitions/bufr/section.1.3.def
index 8316aa1..527b028 100644
--- a/definitions/bufr/section.1.3.def
+++ b/definitions/bufr/section.1.3.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/bufr/section.1.4.def b/definitions/bufr/section.1.4.def
index 7fbfbcf..78db20b 100644
--- a/definitions/bufr/section.1.4.def
+++ b/definitions/bufr/section.1.4.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/bufr/section.2.def b/definitions/bufr/section.2.def
index 52909db..2eabfd7 100644
--- a/definitions/bufr/section.2.def
+++ b/definitions/bufr/section.2.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/bufr/section.3.def b/definitions/bufr/section.3.def
index 6eeba63..baf7816 100644
--- a/definitions/bufr/section.3.def
+++ b/definitions/bufr/section.3.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/bufr/section.4.def b/definitions/bufr/section.4.def
index d15d68e..e9a8ea4 100644
--- a/definitions/bufr/section.4.def
+++ b/definitions/bufr/section.4.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -9,18 +9,18 @@
 
 position offsetSection4;
 section_length[3]       section4Length ;
-unsigned[1]     reservedSection4 = 0;
+unsigned[1]     reservedSection4 = 0 : hidden;
 position offsetBeforeData;
 
 meta bufrDataEncoded raw(totalLength,section4Length,4) : hidden;
 
 template dataKeys "bufr/dataKeys.def";
 
-meta numericValues bufr_data_array(bufrDataEncoded, numberOfSubsets,expandedCodes,expandedFlags, elementsDescriptorsIndex,compressedData,dataKeys) : no_copy;
-meta stringValues bufr_string_values(numericValues) : no_copy;
+meta numericValues bufr_data_array(bufrDataEncoded, numberOfSubsets,expandedCodes,expandedFlags, elementsDescriptorsIndex,compressedData,dataKeys) : no_copy,hidden;
+meta stringValues bufr_string_values(numericValues) : no_copy,hidden;
 
-meta unpack unpack_bufr_values(numericValues)  : no_copy;
-meta pack pack_bufr_values(numericValues)  : no_copy;
+meta unpack unpack_bufr_values(numericValues)  : no_copy,hidden;
+meta pack pack_bufr_values(numericValues)  : no_copy,hidden;
 
 section_padding section4Padding;
 position offsetEndSection4;
diff --git a/definitions/bufr/section.5.def b/definitions/bufr/section.5.def
index c043a0a..cd8ffee 100644
--- a/definitions/bufr/section.5.def
+++ b/definitions/bufr/section.5.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/1003.table b/definitions/bufr/tables/0/wmo/27/codetables/1003.table
new file mode 100644
index 0000000..a0c90ee
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/1003.table
@@ -0,0 +1,8 @@
+0 0 ANTARCTICA
+1 1 REGION I
+2 2 REGION II
+3 3 REGION III
+4 4 REGION IV
+5 5 REGION V
+6 6 REGION VI
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/10063.table b/definitions/bufr/tables/0/wmo/27/codetables/10063.table
new file mode 100644
index 0000000..5097874
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/10063.table
@@ -0,0 +1,10 @@
+0 0 INCREASING, THEN DECREASING; ATMOSPHERIC PRESSURE THE SAME OR HIGHER THAN THREE HOURS AGO
+1 1 INCREASING, THEN STEADY; OR INCREASING, THEN INCREASING MORE SLOWLY
+2 2 INCREASING (STEADILY OR UNSTEADILY)
+3 3 DECREASING OR STEADY, THEN INCREASING; OR INCREASING, THEN INCREASING MORE RAPIDLY
+4 4 STEADY; ATMOSPHERIC PRESSURE THE SAME AS THREE HOURS AGO
+5 5 DECREASING, THEN INCREASING; ATMOSPHERIC PRESSURE THE SAME OR LOWER THAN THREE HOURS AGO
+6 6 DECREASING, THEN STEADY; OR DECREASING, THEN DECREASING MORE SLOWLY
+7 7 DECREASING (STEADILY OR UNSTEADILY)
+8 8 STEADY OR INCREASING, THEN DECREASING; OR DECREASING, THEN DECREASING MORE RAPIDLY
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/10064.table b/definitions/bufr/tables/0/wmo/27/codetables/10064.table
new file mode 100644
index 0000000..88ba38a
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/10064.table
@@ -0,0 +1,4 @@
+0 0 SUBSONIC
+1 1 TRANSONIC
+2 2 SUPERSONIC
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/1007.table b/definitions/bufr/tables/0/wmo/27/codetables/1007.table
new file mode 100644
index 0000000..7b15c1d
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/1007.table
@@ -0,0 +1,200 @@
+0 0 RESERVED
+1 1 ERS 1
+2 2 ERS 2
+3 3 METOP-1 (METOP-B)
+4 4 METOP-2 (METOP-A)
+5 5 METOP-3 (METOP-C)
+20 20 SPOT1
+21 21 SPOT2
+22 22 SPOT3
+23 23 SPOT4
+40 40 OERSTED
+41 41 CHAMP
+42 42 TERRASAR-X
+43 43 TANDEM-X
+44 44 PAZ
+46 46 SMOS
+47 47 CRYOSAT-2
+48 48 AEOLUS
+50 50 METEOSAT 3
+51 51 METEOSAT 4
+52 52 METEOSAT 5
+53 53 METEOSAT 6
+54 54 METEOSAT 7
+55 55 METEOSAT 8
+56 56 METEOSAT 9
+57 57 METEOSAT 10
+58 58 METEOSAT 1
+59 59 METEOSAT 2
+60 60 ENVISAT
+61 61 SENTINEL 3A
+62 62 SENTINEL 1A
+63 63 SENTINEL 1B
+64 64 SENTINEL 5P
+70 70 METEOSAT 11
+120 120 ADEOS
+121 121 ADEOS II
+122 122 GCOM-W1
+140 140 GOSAT
+150 150 GMS 3
+151 151 GMS 4
+152 152 GMS 5
+153 153 GMS
+154 154 GMS 2
+171 171 MTSAT-1R
+172 172 MTSAT-2
+173 173 HIMAWARI-8
+174 174 HIMAWARI-9
+200 200 NOAA 8
+201 201 NOAA 9
+202 202 NOAA 10
+203 203 NOAA 11
+204 204 NOAA 12
+205 205 NOAA 14
+206 206 NOAA 15
+207 207 NOAA 16
+208 208 NOAA 17
+209 209 NOAA 18
+220 220 LANDSAT 5
+221 221 LANDSAT 4
+222 222 LANDSAT 7
+223 223 NOAA 19
+224 224 NPP
+225 225 NOAA 20
+226 226 NOAA 21
+240 240 DMSP 7
+241 241 DMSP 8
+242 242 DMSP 9
+243 243 DMSP 10
+244 244 DMSP 11
+245 245 DMSP 12
+246 246 DMSP 13
+247 247 DMSP 14
+248 248 DMSP 15
+249 249 DMSP 16
+250 250 GOES 6
+251 251 GOES 7
+252 252 GOES 8
+253 253 GOES 9
+254 254 GOES 10
+255 255 GOES 11
+256 256 GOES 12
+257 257 GOES 13
+258 258 GOES 14
+259 259 GOES 15
+260 260 JASON 1
+261 261 JASON 2
+262 262 JASON 3
+270 270 GOES 16
+271 271 GOES 17
+272 272 GOES 18
+273 273 GOES 19
+281 281 QUIKSCAT
+282 282 TRMM
+283 283 CORIOLIS
+285 285 DMSP 17
+286 286 DMSP 18
+287 287 DMSP 19
+288 288 GPM-CORE
+289 289 ORBITING CARBON OBSERVATORY - 2 (OCO-2, NASA)
+310 310 GOMS 1
+311 311 GOMS 2
+320 320 METEOR 2-21
+321 321 METEOR 3-5
+322 322 METEOR 3M-1
+323 323 METEOR 3M-2
+341 341 RESURS 01-4
+410 410 KALPANA-1
+421 421 OCEANSAT-2
+430 430 INSAT 1B
+431 431 INSAT 1C
+432 432 INSAT 1D
+440 440 MEGHA-TROPIQUES
+441 441 SARAL
+450 450 INSAT 2A
+451 451 INSAT 2B
+452 452 INSAT 2E
+470 470 INSAT 3A
+471 471 INSAT 3D
+472 472 INSAT 3E
+500 500 FY-1C
+501 501 FY-1D
+502 502 HAI YANG 2A (HY-2A, SOA/NSOAS CHINA)
+510 510 FY-2
+512 512 FY-2B
+513 513 FY-2C
+514 514 FY-2D
+515 515 FY-2E
+516 516 FY-2F
+517 517 FY-2G
+520 520 FY-3A
+521 521 FY-3B
+522 522 FY-3C
+523 523 FY-3D
+700 700 TIROS M (ITOS 1)
+701 701 NOAA 1
+702 702 NOAA 2
+703 703 NOAA 3
+704 704 NOAA 4
+705 705 NOAA 5
+706 706 NOAA 6
+707 707 NOAA 7
+708 708 TIROS-N
+710 710 GOES (SMS 1)
+711 711 GOES (SMS 2)
+720 720 TOPEX
+721 721 GFO (GEOSAT FOLLOW ON)
+722 722 GRACE A
+723 723 GRACE B
+724 724 COSMIC-2 P1
+725 725 COSMIC-2 P2
+726 726 COSMIC-2 P3
+727 727 COSMIC-2 P4
+728 728 COSMIC-2 P5
+729 729 COSMIC-2 P6
+731 731 GOES 1
+732 732 GOES 2
+733 733 GOES 3
+734 734 GOES 4
+735 735 GOES 5
+740 740 COSMIC-1
+741 741 COSMIC-2
+742 742 COSMIC-3
+743 743 COSMIC-4
+744 744 COSMIC-5
+745 745 COSMIC-6
+750 750 COSMIC-2 E1
+751 751 COSMIC-2 E2
+752 752 COSMIC-2 E3
+753 753 COSMIC-2 E4
+754 754 COSMIC-2 E5
+755 755 COSMIC-2 E6
+763 763 NIMBUS 3
+764 764 NIMBUS 4
+765 765 NIMBUS 5
+766 766 NIMBUS 6
+767 767 NIMBUS 7
+780 780 ERBS
+781 781 UARS
+782 782 EARTH PROBE
+783 783 TERRA
+784 784 AQUA
+785 785 AURA
+786 786 C/NOFS
+787 787 CALIPSO
+788 788 CLOUDSAT
+800 800 SUNSAT
+801 801 INTERNATIONAL SPACE STATION (ISS)
+810 810 COMS-1
+811 811 COMS-2
+812 812 SCISAT-1
+813 813 ODIN
+820 820 SAC-C
+821 821 SAC-D
+825 825 KOMPSAT-5
+850 850 COMBINATION OF TERRA AND AQUA
+851 851 COMBINATION OF NOAA 16 TO NOAA 19
+852 852 COMBINATION OF METOP-1 TO METOP-3
+853 853 COMBINATION OF METEOSAT AND DMSP
+854 854 NON-SPECIFIC MIXTURE OF GEOSTATIONARY AND LOW EARTH-ORBITING SATELLITES
+1023 1023 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/1024.table b/definitions/bufr/tables/0/wmo/27/codetables/1024.table
new file mode 100644
index 0000000..cdc9e24
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/1024.table
@@ -0,0 +1,9 @@
+0 0 NO WIND SPEED DATA AVAILABLE
+1 1 AMSR-E DATA
+2 2 TMI DATA
+3 3 NWP: ECMWF
+4 4 NWP: UK MET OFFICE
+5 5 NWP: NCEP
+6 6 REFERENCE CLIMATOLOGY
+7 7 ERS_SCATTEROMETER
+31 31 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/1028.table b/definitions/bufr/tables/0/wmo/27/codetables/1028.table
new file mode 100644
index 0000000..18f8206
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/1028.table
@@ -0,0 +1,7 @@
+0 0 NO AOD DATA AVAILABLE
+1 1 NESDIS
+2 2 NAVOCEANO
+3 3 NAAPS
+4 4 MERIS
+5 5 AATSR
+31 31 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/1029.table b/definitions/bufr/tables/0/wmo/27/codetables/1029.table
new file mode 100644
index 0000000..d63d07e
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/1029.table
@@ -0,0 +1,8 @@
+0 0 NO SSI DATA AVAILABLE
+1 1 MSG_SEVIRI
+2 2 GOES EAST
+3 3 GOES WEST
+4 4 ECMWF
+5 5 NCEP
+6 6 UK MET OFFICE
+31 31 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/1033.table b/definitions/bufr/tables/0/wmo/27/codetables/1033.table
new file mode 100644
index 0000000..6006582
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/1033.table
@@ -0,0 +1,234 @@
+0 0 WMO SECRETARIAT
+1 1 MELBOURNE
+2 2 MELBOURNE
+3 3 )
+4 4 MOSCOW
+5 5 MOSCOW
+6 6 )
+7 7 US NATIONAL WEATHER SERVICE - NATIONAL CENTRES FOR ENVIRONMENTAL PREDICTION (NCEP)
+8 8 US NATIONAL WEATHER SERVICE TELECOMMUNICATIONS GATEWAY (NWSTG)
+9 9 US NATIONAL WEATHER SERVICE - OTHER
+10 10 CAIRO (RSMC)
+11 11 )
+12 12 DAKAR (RSMC)
+13 13 )
+14 14 NAIROBI (RSMC)
+15 15 )
+16 16 CASABLANCA (RSMC)
+17 17 TUNIS (RSMC)
+18 18 TUNIS - CASABLANCA (RSMC)
+19 19 )
+20 20 LAS PALMAS
+21 21 ALGIERS (RSMC)
+22 22 ACMAD
+23 23 MOZAMBIQUE (NMC)
+24 24 PRETORIA (RSMC)
+25 25 LA RéUNION (RSMC)
+26 26 KHABAROVSK (RSMC)
+27 27 )
+28 28 NEW DELHI (RSMC)
+29 29 )
+30 30 NOVOSIBIRSK (RSMC)
+31 31 )
+32 32 TASHKENT (RSMC)
+33 33 JEDDAH (RSMC)
+34 34 TOKYO (RSMC), JAPAN METEOROLOGICAL AGENCY
+35 35 )
+36 36 BANGKOK
+37 37 ULAANBAATAR
+38 38 BEIJING (RSMC)
+39 39 )
+40 40 SEOUL
+41 41 BUENOS AIRES (RSMC)
+42 42 )
+43 43 BRASILIA (RSMC)
+44 44 )
+45 45 SANTIAGO
+46 46 BRAZILIAN SPACE AGENCY ­ INPE
+47 47 COLOMBIA (NMC)
+48 48 ECUADOR (NMC)
+49 49 PERU (NMC)
+50 50 VENEZUELA (BOLIVARIAN REPUBLIC OF) (NMC)
+51 51 MIAMI (RSMC)
+52 52 MIAMI (RSMC), NATIONAL HURRICANE CENTRE
+53 53 MSC MONITORING
+54 54 MONTREAL (RSMC)
+55 55 SAN FRANCISCO
+56 56 ARINC CENTRE
+57 57 US AIR FORCE - AIR FORCE GLOBAL WEATHER CENTRAL
+58 58 FLEET NUMERICAL METEOROLOGY AND OCEANOGRAPHY CENTER, MONTEREY, CA, UNITED STATES
+59 59 THE NOAA FORECAST SYSTEMS LABORATORY, BOULDER, CO, UNITED STATES
+60 60 UNITED STATES NATIONAL CENTER FOR ATMOSPHERIC RESEARCH (NCAR)
+61 61 SERVICE ARGOS - LANDOVER
+62 62 US NAVAL OCEANOGRAPHIC OFFICE
+63 63 INTERNATIONAL RESEARCH INSTITUTE FOR CLIMATE AND SOCIETY (IRI)
+64 64 HONOLULU (RSMC)
+65 65 DARWIN (RSMC)
+66 66 )
+67 67 MELBOURNE (RSMC)
+68 68 RESERVED
+69 69 WELLINGTON (RSMC)
+70 70 )
+71 71 NADI (RSMC)
+72 72 SINGAPORE
+73 73 MALAYSIA (NMC)
+74 74 UK METEOROLOGICAL OFFICE ­ EXETER (RSMC)
+75 75 )
+76 76 MOSCOW (RSMC)
+77 77 RESERVED
+78 78 OFFENBACH (RSMC)
+79 79 )
+80 80 ROME (RSMC)
+81 81 )
+82 82 NORRKöPING
+83 83 )
+84 84 TOULOUSE (RSMC)
+85 85 TOULOUSE (RSMC)
+86 86 HELSINKI
+87 87 BELGRADE
+88 88 OSLO
+89 89 PRAGUE
+90 90 EPISKOPI
+91 91 ANKARA
+92 92 FRANKFURT/MAIN
+93 93 LONDON (WAFC)
+94 94 COPENHAGEN
+95 95 ROTA
+96 96 ATHENS
+97 97 EUROPEAN SPACE AGENCY (ESA)
+98 98 EUROPEAN CENTRE FOR MEDIUM-RANGE WEATHER FORECASTS (ECMWF) (RSMC)
+99 99 DE BILT
+100 100 BRAZZAVILLE
+101 101 ABIDJAN
+102 102 LIBYA (NMC)
+103 103 MADAGASCAR (NMC)
+104 104 MAURITIUS (NMC)
+105 105 NIGER (NMC)
+106 106 SEYCHELLES (NMC)
+107 107 UGANDA (NMC)
+108 108 UNITED REPUBLIC OF TANZANIA (NMC)
+109 109 ZIMBABWE (NMC)
+110 110 HONG-KONG, CHINA
+111 111 AFGHANISTAN (NMC)
+112 112 BAHRAIN (NMC)
+113 113 BANGLADESH (NMC)
+114 114 BHUTAN (NMC)
+115 115 CAMBODIA (NMC)
+116 116 DEMOCRATIC PEOPLE'S REPUBLIC OF KOREA (NMC)
+117 117 ISLAMIC REPUBLIC OF IRAN (NMC)
+118 118 IRAQ (NMC)
+119 119 KAZAKHSTAN (NMC)
+120 120 KUWAIT (NMC)
+121 121 KYRGYZSTAN (NMC)
+122 122 LAO PEOPLE'S DEMOCRATIC REPUBLIC (NMC)
+123 123 MACAO, CHINA
+124 124 MALDIVES (NMC)
+125 125 MYANMAR (NMC)
+126 126 NEPAL (NMC)
+127 127 OMAN (NMC)
+128 128 PAKISTAN (NMC)
+129 129 QATAR (NMC)
+130 130 YEMEN (NMC)
+131 131 SRI LANKA (NMC)
+132 132 TAJIKISTAN (NMC)
+133 133 TURKMENISTAN (NMC)
+134 134 UNITED ARAB EMIRATES (NMC)
+135 135 UZBEKISTAN (NMC)
+136 136 VIET NAM (NMC)
+140 140 BOLIVIA (PLURINATIONAL STATE OF) (NMC)
+141 141 GUYANA (NMC)
+142 142 PARAGUAY (NMC)
+143 143 SURINAME (NMC)
+144 144 URUGUAY (NMC)
+145 145 FRENCH GUIANA
+146 146 BRAZILIAN NAVY HYDROGRAPHIC CENTRE
+147 147 NATIONAL COMMISSION ON SPACE ACTIVITIES (CONAE) - ARGENTINA
+150 150 ANTIGUA AND BARBUDA (NMC)
+151 151 BAHAMAS (NMC)
+152 152 BARBADOS (NMC)
+153 153 BELIZE (NMC)
+154 154 BRITISH CARIBBEAN TERRITORIES CENTRE
+155 155 SAN JOSé
+156 156 CUBA (NMC)
+157 157 DOMINICA (NMC)
+158 158 DOMINICAN REPUBLIC (NMC)
+159 159 EL SALVADOR (NMC)
+160 160 US NOAA/NESDIS
+161 161 US NOAA OFFICE OF OCEANIC AND ATMOSPHERIC RESEARCH
+162 162 GUATEMALA (NMC)
+163 163 HAITI (NMC)
+164 164 HONDURAS (NMC)
+165 165 JAMAICA (NMC)
+166 166 MEXICO CITY
+167 167 CURAçAO AND SINT MAARTEN (NMC)
+168 168 NICARAGUA (NMC)
+169 169 PANAMA (NMC)
+170 170 SAINT LUCIA (NMC)
+171 171 TRINIDAD AND TOBAGO (NMC)
+172 172 FRENCH DEPARTMENTS IN RA IV
+173 173 US NATIONAL AERONAUTICS AND SPACE ADMINISTRATION (NASA)
+174 174 INTEGRATED SCIENCE DATA MANAGEMENT/MARINE ENVIRONMENTAL DATA SERVICE (ISDM/MEDS) - CANADA
+175 175 UNIVERSITY CORPORATION FOR ATMOSPHERIC RESEARCH (UCAR) - UNITED STATES
+176 176 COOPERATIVE INSTITUTE FOR METEOROLOGICAL SATELLITE STUDIES (CIMSS) - UNITED STATES
+177 177 NOAA NATIONAL OCEAN SERVICE - UNITED STATES
+190 190 COOK ISLANDS (NMC)
+191 191 FRENCH POLYNESIA (NMC)
+192 192 TONGA (NMC)
+193 193 VANUATU (NMC)
+194 194 BRUNEI DARUSSALAM (NMC)
+195 195 INDONESIA (NMC)
+196 196 KIRIBATI (NMC)
+197 197 FEDERATED STATES OF MICRONESIA (NMC)
+198 198 NEW CALEDONIA (NMC)
+199 199 NIUE
+200 200 PAPUA NEW GUINEA (NMC)
+201 201 PHILIPPINES (NMC)
+202 202 SAMOA (NMC)
+203 203 SOLOMON ISLANDS (NMC)
+204 204 NATIONAL INSTITUTE OF WATER AND ATMOSPHERIC RESEARCH (NIWA - NEW ZEALAND)
+210 210 FRASCATI (ESA/ESRIN)
+211 211 LANNION
+212 212 LISBON
+213 213 REYKJAVIK
+214 214 MADRID
+215 215 ZURICH
+216 216 SERVICE ARGOS - TOULOUSE
+217 217 BRATISLAVA
+218 218 BUDAPEST
+219 219 LJUBLJANA
+220 220 WARSAW
+221 221 ZAGREB
+222 222 ALBANIA (NMC)
+223 223 ARMENIA (NMC)
+224 224 AUSTRIA (NMC)
+225 225 AZERBAIJAN (NMC)
+226 226 BELARUS (NMC)
+227 227 BELGIUM (NMC)
+228 228 BOSNIA AND HERZEGOVINA (NMC)
+229 229 BULGARIA (NMC)
+230 230 CYPRUS (NMC)
+231 231 ESTONIA (NMC)
+232 232 GEORGIA (NMC)
+233 233 DUBLIN
+234 234 ISRAEL (NMC)
+235 235 JORDAN (NMC)
+236 236 LATVIA (NMC)
+237 237 LEBANON (NMC)
+238 238 LITHUANIA (NMC)
+239 239 LUXEMBOURG
+240 240 MALTA (NMC)
+241 241 MONACO
+242 242 ROMANIA (NMC)
+243 243 SYRIAN ARAB REPUBLIC (NMC)
+244 244 THE FORMER YUGOSLAV REPUBLIC OF MACEDONIA (NMC)
+245 245 UKRAINE (NMC)
+246 246 REPUBLIC OF MOLDOVA (NMC)
+247 247 OPERATIONAL PROGRAMME FOR THE EXCHANGE OF WEATHER RADAR INFORMATION (OPERA) - EUMETNET
+248 248 MONTENEGRO (NMC)
+249 249 BARCELONA DUST FORECAST CENTER
+250 250 CONSORTIUM FOR SMALL SCALE MODELLING  (COSMO)
+251 251 METEOROLOGICAL COOPERATION ON OPERATIONAL NWP (METCOOP)
+252 252 MAX PLANCK INSTITUTE FOR METEOROLOGY (MPI-M)
+253 253 RESERVED FOR OTHER CENTRES
+254 254 EUMETSAT OPERATION CENTRE
+255 255 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/1034.table b/definitions/bufr/tables/0/wmo/27/codetables/1034.table
new file mode 100644
index 0000000..fface93
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/1034.table
@@ -0,0 +1,100 @@
+0 0 NO SUB-CENTRE
+1 1 LUXEMBOURG (NMC)
+2 2 FUCINO
+3 3 GATINEAU
+4 4 MASPALOMAS (SPAIN)
+5 5 ESA ERS CENTRAL FACILITY
+6 6 PRINCE ALBERT
+7 7 WEST FREUGH
+8 8 LANGLEY RESEARCH CENTER
+9 9 MARSHALL SPACE FLIGHT CENTER
+10 10 TROMSO (NORWAY)
+11 11 MCMURDO (ANTARCTICA)
+12 12 SODANKYLA (FINLAND)
+13 13 TROMSO
+14 14 BARROW (UNITED STATES)
+15 15 ROTHERA (ANTARCTICA)
+16 16 SPACE WEATHER PREDICTION CENTER
+17 17 ESRL GLOBAL SYSTEMS DIVISION
+20 20 MASPALOMAS (SPAIN)
+21 21 AGENZIA SPAZIALE ITALIANA (ITALY)
+22 22 CENTRE NATIONAL DE LA RECHERCHE SCIENTIFIQUE (FRANCE)
+23 23 GEOFORSCHUNGS ZENTRUM (GERMANY)
+24 24 GEODETIC OBSERVATORY PECNY (CZECH REPUBLIC)
+25 25 INSTITUT D'ESTUDIS ESPACIALS DE CATALUNYA (SPAIN)
+26 26 FEDERAL OFFICE OF TOPOGRAPHY (SWITZERLAND)
+27 27 NORDIC COMMISSION OF GEODESY (NORWAY)
+28 28 NORDIC COMMISSION OF GEODESY (SWEDEN)
+29 29 INSTITUTE GéOGRAPHIQUE NATIONAL (FRANCE) - SERVICE DE GéODéSIE
+30 30 KANGERLUSSUAQ (GREENLAND)
+31 31 INSTITUTE OF ENGINEERING SATELLITE SURVEYING AND GEODESY (UNITED KINGDOM)
+32 32 JOINT OPERATIONAL METEOROLOGY AND OCEANOGRAPHY CENTRE (JOMOC)
+33 33 KONINKLIJK NEDERLANDS METEOROLOGISCH INSTITUT (NETHERLANDS)
+34 34 NORDIC GPS ATMOSPHERIC ANALYSIS CENTRE (SWEDEN)
+35 35 INSTITUTO GEOGRAFICO NACIONAL DE ESPAñA (SPAIN)
+36 36 MET ÉIREANN (IRELAND)
+37 37 ROYAL OBSERVATORY OF BELGIUM (BELGIUM)
+40 40 EDMONTON (CANADA)
+50 50 BEDFORD (CANADA)
+60 60 GANDER (CANADA)
+64 64 BUNDESWEHR GEOINFORMATION OFFICE (BGIO)
+70 70 MONTEREY (UNITED STATES)
+76 76 ROSHYDROMET (RUSSIAN FEDERATION)
+78 78 DEUTSCHER WETTERDIENST (GERMANY)
+80 80 WALLOPS ISLAND (UNITED STATES)
+90 90 GILMOR CREEK (UNITED STATES)
+96 96 HELLENIC NATIONAL METEOROLOGICAL SERVICE (GREECE)
+100 100 ATHENS (GREECE)
+101 101 ALBANIA (NMC)
+102 102 NATIONAL RESEARCH COUNCIL/INSTITUTE OF ATMOSPHERIC SCIENCES AND CLIMATE (CNR-ISAC)
+110 110 NOWCAST MOBILE (LIGHTNING DATA)
+120 120 EWA BEACH, HAWAII
+130 130 MIAMI, FLORIDA
+140 140 LANNION (FRANCE)
+150 150 SVALBARD (NORWAY)
+170 170 ST DENIS (LA RéUNION)
+180 180 MOSCOW
+190 190 MUSCAT
+200 200 KHABAROVSK
+201 201 RHEINISCHES INSTITUT FüR UMWELTFORSCHUNG AN DER UNIVERSITäT ZU KöLN E.V. (GERMANY)
+203 203 DAVIS
+204 204 NATIONAL INSTITUTE OF WATER AND ATMOSPHERIC RESEARCH (NIWA - NEW ZEALAND)
+205 205 NIUE
+206 206 RAROTONGA (COOK ISLANDS)
+207 207 APIA (SAMOA)
+208 208 TONGA
+209 209 TUVALU
+210 210 NOVOSIBIRSK
+211 211 TOKELAU
+214 214 DARWIN
+215 215 METEOSWISS (SWITZERLAND)
+217 217 PERTH
+219 219 TOWNSVILLE
+220 220 INSTITUTE OF METEOROLOGY AND WATER MANAGEMENT (POLAND)
+221 221 SCHLESWIG-HOLSTEIN, TRAFFIC OPERATIONS COMPUTING CENTRE (TOCC) KIEL/NEUMüNSTER
+222 222 HAMBURG, TOCC HAMBURG
+223 223 NIEDERSACHSEN, TOCC HANNOVER
+224 224 AUSTRIA (NMC)
+225 225 NORDRHEIN-WESTFALEN, TOCC KAMEN LEVERKUSEN
+226 226 HESSEN, TOCC RüSSELSHEIM
+227 227 RHEINLAND-PFALZ, TOCC KOBLENZ
+228 228 BADEN-WüRTTEMBERG, TOCC LUDWIGSBURG
+229 229 BAYERN, TOCC FREIMANN
+230 230 SAARLAND, TOCC ROHRBACH
+231 231 BAYERN, AUTOBAHN DIRECTORATE NORDBAYERN
+232 232 BRANDENBURG, TOCC STOLPE
+233 233 MECKLENBURG-VORPOMMERN, TOCC MALCHOW
+234 234 SACHSEN, TOCC DRESDEN
+235 235 SACHSEN-ANHALT, TOCC HALLE
+236 236 THüRINGEN, TOCC ERFURT
+237 237 EASYWAY - METEOTRANS
+240 240 KIYOSE
+241 241 REANALYSIS PROJECT
+242 242 NATIONAL METEOROLOGICAL ADMINISTRATION (ROMANIA)
+243 243 KELBURN
+245 245 JINCHEON
+249 249 SINGAPORE
+250 250 VLADIVOSTOCK
+251 251 GUAM
+252 252 HONOLULU
+254 254 EUMETSAT
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/1036.table b/definitions/bufr/tables/0/wmo/27/codetables/1036.table
new file mode 100644
index 0000000..e7e4045
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/1036.table
@@ -0,0 +1,38 @@
+36001 36001 AUSTRALIA, BUREAU OF METEOROLOGY (BOM)
+36002 36002 AUSTRALIA, JOINT AUSTRALIAN FACILITY FOR OCEAN OBSERVING SYSTEMS (JAFOOS)
+36003 36003 AUSTRALIA, THE COMMONWEALTH SCIENTIFIC AND INDUSTRIAL RESEARCH ORGANIZATION (CSIRO)
+124001 124001 CANADA, MARINE ENVIRONMENTAL DATA SERVICE (MEDS)
+124002 124002 CANADA, INSTITUTE OF OCEAN SCIENCES (IOS)
+124173 124173 CANADA, ENVIRONMENT CANADA
+124174 124174 CANADA, DEPARTMENT OF NATIONAL DEFENCE
+124175 124175 CANADA, NAV CANADA
+156001 156001 CHINA, THE STATE OCEANIC ADMINISTRATION
+156002 156002 CHINA, SECOND INSTITUTE OF OCEANOGRAPHY, STATE OCEANIC ADMINISTRATION
+156003 156003 CHINA, INSTITUTE OF OCEAN TECHNOLOGY
+250001 250001 FRANCE, INSTITUT DE RECHERCHE POUR LE DéVELOPPEMENT (IRD)
+250002 250002 FRANCE, INSTITUT FRANçAIS DE RECHERCHE POUR L'EXPLOITATION DE LA MER (IFREMER)
+276001 276001 GERMANY, BUNDESAMT FUER SEESCHIFFAHRT UND HYDROGRAPHIE (BSH)
+276002 276002 GERMANY, INSTITUT FUER MEERESKUNDE, KIEL
+356001 356001 INDIA, NATIONAL INSTITUTE OF OCEANOGRAPHY (NIO)
+356002 356002 INDIA, NATIONAL INSTITUTE FOR OCEAN TECHNOLOGY (NIOT)
+356003 356003 INDIA, NATIONAL CENTRE FOR OCEAN INFORMATION SERVICE
+392001 392001 JAPAN, JAPAN METEOROLOGICAL AGENCY (JMA)
+392002 392002 JAPAN, FRONTIER OBSERVATIONAL RESEARCH SYSTEM FOR GLOBAL CHANGE
+392003 392003 JAPAN, JAPAN MARINE SCIENCE AND TECHNOLOGY CENTRE (JAMSTEC)
+410001 410001 REPUBLIC OF KOREA, SEOUL NATIONAL UNIVERSITY
+410002 410002 REPUBLIC OF KOREA, KOREA OCEAN RESEARCH AND DEVELOPMENT INSTITUTE  (KORDI)
+410003 410003 REPUBLIC OF KOREA, METEOROLOGICAL RESEARCH INSTITUTE
+540001 540001 NEW CALEDONIA, INSTITUT DE RECHERCHE POUR LE DéVELOPPEMENT (IRD)
+554001 554001 NEW ZEALAND, NATIONAL INSTITUTE OF WATER AND ATMOSPHERIC RESEARCH (NIWA)
+643001 643001 RUSSIAN FEDERATION, STATE OCEANOGRAPHIC INSTITUTE OF ROSHYDROMET
+643002 643002 RUSSIAN FEDERATION, FEDERAL SERVICE FOR HYDROMETEOROLOGY AND ENVIRONMENTAL MONITORING
+724001 724001 SPAIN, INSTITUTO ESPAñOL DE OCEANOGRAFIA
+826001 826001 UNITED KINGDOM, HYDROGRAPHIC OFFICE
+826002 826002 UNITED KINGDOM, SOUTHAMPTON OCEANOGRAPHY CENTRE (SOC)
+840001 840001 USA, NOAA ATLANTIC OCEANOGRAPHIC AND METEOROLOGICAL LABORATORIES (AOML)
+840002 840002 USA, NOAA PACIFIC MARINE ENVIRONMENTAL LABORATORIES (PMEL)
+840003 840003 USA, SCRIPPS INSTITUTION OF OCEANOGRAPHY (SIO)
+840004 840004 USA, WOODS HOLE OCEANOGRAPHIC INSTITUTION (WHOI)
+840005 840005 USA, UNIVERSITY OF WASHINGTON
+840006 840006 USA, NAVAL OCEANOGRAPHIC OFFICE
+1048575 1048575 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/1038.table b/definitions/bufr/tables/0/wmo/27/codetables/1038.table
new file mode 100644
index 0000000..2eee38b
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/1038.table
@@ -0,0 +1,7 @@
+0 0 NO SEA ICE SET
+1 1 NSIDC SSM/I CAVALIERI ET AL (1992)
+2 2 AMSR-E
+3 3 ECMWF
+4 4 CMS (FRANCE) CLOUD MASK USED BY MEDSPIRATION
+5 5 EUMETSAT OSI-SAF
+31 31 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/1052.table b/definitions/bufr/tables/0/wmo/27/codetables/1052.table
new file mode 100644
index 0000000..b8e14ed
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/1052.table
@@ -0,0 +1,4 @@
+0 0 PRIMARY
+1 1 SECONDARY
+2 2 RESERVED
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/1090.table b/definitions/bufr/tables/0/wmo/27/codetables/1090.table
new file mode 100644
index 0000000..55f7ca2
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/1090.table
@@ -0,0 +1,5 @@
+0 0 LAGGED-AVERAGE FORECASTING (LAF)
+1 1 BREEDING
+2 2 SINGULAR VECTORS
+3 3 MULTIPLE ANALYSIS CYCLES
+255 255 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/1092.table b/definitions/bufr/tables/0/wmo/27/codetables/1092.table
new file mode 100644
index 0000000..dc9bf1c
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/1092.table
@@ -0,0 +1,5 @@
+0 0 UNPERTURBED HIGH-RESOLUTION CONTROL FORECAST
+1 1 UNPERTURBED LOW-RESOLUTION CONTROL FORECAST
+2 2 NEGATIVELY PERTURBED FORECAST
+3 3 POSITIVELY PERTURBED FORECAST
+255 255 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/1101.table b/definitions/bufr/tables/0/wmo/27/codetables/1101.table
new file mode 100644
index 0000000..21e0cf5
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/1101.table
@@ -0,0 +1,202 @@
+100 100 ALGERIA
+101 101 ANGOLA
+102 102 BENIN
+103 103 BOTSWANA
+104 104 BURKINA FASO
+105 105 BURUNDI
+106 106 CAMEROON
+107 107 CABO VERDE
+108 108 CENTRAL AFRICAN REPUBLIC
+109 109 CHAD
+110 110 COMOROS
+111 111 CONGO
+112 112 CôTE D'IVOIRE
+113 113 DEMOCRATIC REPUBLIC OF THE CONGO
+114 114 DJIBOUTI
+115 115 EGYPT
+116 116 ERITREA
+117 117 ETHIOPIA
+118 118 FRANCE (RA I)
+119 119 GABON
+120 120 GAMBIA
+121 121 GHANA
+122 122 GUINEA
+123 123 GUINEA-BISSAU
+124 124 KENYA
+125 125 LESOTHO
+126 126 LIBERIA
+127 127 LIBYA
+128 128 MADAGASCAR
+129 129 MALAWI
+130 130 MALI
+131 131 MAURITANIA
+132 132 MAURITIUS
+133 133 MOROCCO
+134 134 MOZAMBIQUE
+135 135 NAMIBIA
+136 136 NIGER
+137 137 NIGERIA
+138 138 PORTUGAL (RA I)
+139 139 RWANDA
+140 140 SAO TOME AND PRINCIPE
+141 141 SENEGAL
+142 142 SEYCHELLES
+143 143 SIERRA LEONE
+144 144 SOMALIA
+145 145 SOUTH AFRICA
+146 146 SPAIN (RA I)
+147 147 SUDAN
+148 148 SWAZILAND
+149 149 TOGO
+150 150 TUNISIA
+151 151 UGANDA
+152 152 UNITED KINGDOM OF GREAT BRITAIN AND NORTHERN IRELAND (RA I)
+153 153 UNITED REPUBLIC OF TANZANIA
+154 154 ZAMBIA
+155 155 ZIMBABWE
+200 200 AFGHANISTAN
+201 201 BAHRAIN
+202 202 BANGLADESH
+203 203 BHUTAN
+204 204 CAMBODIA
+205 205 CHINA
+206 206 DEMOCRATIC PEOPLE'S REPUBLIC OF KOREA
+207 207 HONG KONG, CHINA
+208 208 INDIA
+209 209 IRAN, ISLAMIC REPUBLIC OF
+210 210 IRAQ
+211 211 JAPAN
+212 212 KAZAKHSTAN
+213 213 KUWAIT
+214 214 KYRGYZSTAN
+215 215 LAO PEOPLE'S DEMOCRATIC REPUBLIC
+216 216 MACAO, CHINA
+217 217 MALDIVES
+218 218 MONGOLIA
+219 219 MYANMAR
+220 220 NEPAL
+221 221 OMAN
+222 222 PAKISTAN
+223 223 QATAR
+224 224 REPUBLIC OF KOREA
+225 225 YEMEN
+226 226 RUSSIAN FEDERATION (RA II)
+227 227 SAUDI ARABIA
+228 228 SRI LANKA
+229 229 TAJIKISTAN
+230 230 THAILAND
+231 231 TURKMENISTAN
+232 232 UNITED ARAB EMIRATES
+233 233 UZBEKISTAN
+234 234 VIET NAM
+300 300 ARGENTINA
+301 301 BOLIVIA (PLURINATIONAL STATE OF)
+302 302 BRAZIL
+303 303 CHILE
+304 304 COLOMBIA
+305 305 ECUADOR
+306 306 FRANCE (RA III)
+307 307 GUYANA
+308 308 PARAGUAY
+309 309 PERU
+310 310 SURINAME
+311 311 URUGUAY
+312 312 VENEZUELA (BOLIVARIAN REPUBLIC OF)
+400 400 ANTIGUA AND BARBUDA
+401 401 BAHAMAS
+402 402 BARBADOS
+403 403 BELIZE
+404 404 BRITISH CARIBBEAN TERRITORIES
+405 405 CANADA
+406 406 COLOMBIA
+407 407 COSTA RICA
+408 408 CUBA
+409 409 DOMINICA
+410 410 DOMINICAN REPUBLIC
+411 411 EL SALVADOR
+412 412 FRANCE (RA IV)
+413 413 GUATEMALA
+414 414 HAITI
+415 415 HONDURAS
+416 416 JAMAICA
+417 417 MEXICO
+418 418 CURAçAO AND SINT MAARTEN
+419 419 NICARAGUA
+420 420 PANAMA
+421 421 SAINT LUCIA
+422 422 TRINIDAD AND TOBAGO
+423 423 UNITED KINGDOM OF GREAT BRITAIN AND NORTHERN IRELAND (RA IV)
+424 424 UNITED STATES OF AMERICA (RA IV)
+425 425 VENEZUELA (BOLIVARIAN REPUBLIC OF)
+500 500 AUSTRALIA
+501 501 BRUNEI DARUSSALAM
+502 502 COOK ISLANDS
+503 503 FIJI
+504 504 FRENCH POLYNESIA
+505 505 INDONESIA
+506 506 KIRIBATI
+507 507 MALAYSIA
+508 508 MICRONESIA, FEDERATED STATES OF
+509 509 NEW CALEDONIA
+510 510 NEW ZEALAND
+511 511 NIUE
+512 512 PAPUA NEW GUINEA
+513 513 PHILIPPINES
+514 514 SAMOA
+515 515 SINGAPORE
+516 516 SOLOMON ISLANDS
+517 517 TONGA
+518 518 UNITED KINGDOM OF GREAT BRITAIN AND NORTHERN IRELAND (RA V)
+519 519 UNITED STATES OF AMERICA (RA V)
+520 520 VANUATU
+600 600 ALBANIA
+601 601 ARMENIA
+602 602 AUSTRIA
+603 603 AZERBAIJAN
+604 604 BELARUS
+605 605 BELGIUM
+606 606 BOSNIA AND HERZEGOVINA
+607 607 BULGARIA
+608 608 CROATIA
+609 609 CYPRUS
+610 610 CZECH REPUBLIC
+611 611 DENMARK
+612 612 ESTONIA
+613 613 FINLAND
+614 614 FRANCE (RA VI)
+615 615 GEORGIA
+616 616 GERMANY
+617 617 GREECE
+618 618 HUNGARY
+619 619 ICELAND
+620 620 IRELAND
+621 621 ISRAEL
+622 622 ITALY
+623 623 JORDAN
+624 624 KAZAKHSTAN
+625 625 LATVIA
+626 626 LEBANON
+627 627 LITHUANIA
+628 628 LUXEMBOURG
+629 629 MALTA
+630 630 MONACO
+631 631 MONTENEGRO
+632 632 NETHERLANDS
+633 633 NORWAY
+634 634 POLAND
+635 635 PORTUGAL (RA VI)
+636 636 REPUBLIC OF MOLDOVA
+637 637 ROMANIA
+638 638 RUSSIAN FEDERATION (RA VI)
+639 639 SERBIA
+640 640 SLOVAKIA
+641 641 SLOVENIA
+642 642 SPAIN (RA VI)
+643 643 SWEDEN
+644 644 SWITZERLAND
+645 645 SYRIAN ARAB REPUBLIC
+646 646 THE FORMER YUGOSLAV REPUBLIC OF MACEDONIA
+647 647 TURKEY
+648 648 UKRAINE
+649 649 UNITED KINGDOM OF GREAT BRITAIN AND NORTHERN IRELAND (RA VI)
+1023 1023 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/11030.table b/definitions/bufr/tables/0/wmo/27/codetables/11030.table
new file mode 100644
index 0000000..253b8fc
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/11030.table
@@ -0,0 +1,25 @@
+0 0 NIL
+1 1 LIGHT
+2 2 MODERATE
+3 3 SEVERE
+4 4 NIL
+5 5 LIGHT
+6 6 MODERATE
+7 7 SEVERE
+8 8 NIL
+9 9 LIGHT
+10 10 MODERATE
+11 11 SEVERE
+12 12 EXTREME, IN CLEAR AIR
+13 13 EXTREME, IN CLOUD
+14 14 EXTREME, CLOUD/CLEAR AIR NOT SPECIFIED
+15 15 LIGHT, ISOLATED MODERATE
+16 16 LIGHT, OCCASIONAL MODERATE
+17 17 LIGHT, FREQUENTLY MODERATE
+18 18 MODERATE, ISOLATED SEVERE
+19 19 MODERATE, OCCASIONAL SEVERE
+20 20 MODERATE, FREQUENTLY SEVERE
+21 21 SEVERE, ISOLATED EXTREME
+22 22 SEVERE, OCCASIONAL EXTREME
+23 23 SEVERE, FREQUENTLY EXTREME
+63 63 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/11031.table b/definitions/bufr/tables/0/wmo/27/codetables/11031.table
new file mode 100644
index 0000000..7bece1c
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/11031.table
@@ -0,0 +1,16 @@
+0 0 NIL
+1 1 LIGHT
+2 2 MODERATE
+3 3 SEVERE
+4 4 NIL
+5 5 LIGHT
+6 6 MODERATE
+7 7 SEVERE
+8 8 NIL
+9 9 LIGHT
+10 10 MODERATE
+11 11 SEVERE
+12 12 EXTREME, IN CLEAR AIR
+13 13 EXTREME, IN CLOUD
+14 14 EXTREME, CLOUD/CLEAR AIR NOT SPECIFIED
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/11037.table b/definitions/bufr/tables/0/wmo/27/codetables/11037.table
new file mode 100644
index 0000000..423eef7
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/11037.table
@@ -0,0 +1,30 @@
+0 0 AVE < 0.1
+1 1 AVE < 0.1
+2 2 0.1 <= AVE < 0.2
+3 3 AVE <0.1
+4 4 0.1 <= AVE < 0.2
+5 5 0.2 <= AVE < 0.3
+6 6 AVE < 0.1
+7 7 0.1 <= AVE < 0.2
+8 8 0.2 <= AVE < 0.3
+9 9 0.3 <= AVE < 0.4
+10 10 AVE < 0.1
+11 11 0.1 <= AVE < 0.2
+12 12 0.2 <= AVE < 0.3
+13 13 0.3 <= AVE < 0.4
+14 14 0.4 <= AVE < 0.5
+15 15 AVE < 0.1
+16 16 0.1 <= AVE < 0.2
+17 17 0.2 <= AVE < 0.3
+18 18 0.3 <= AVE < 0.4
+19 19 0.4 <= AVE < 0.5
+20 20 0.5 <= AVE < 0.8
+21 21 AVE < 0.1
+22 22 0.1 <= AVE < 0.2
+23 23 0.2 <= AVE < 0.3
+24 24 0.3 <= AVE < 0.4
+25 25 0.4 <= AVE < 0.5
+26 26 0.5 <= AVE < 0.8
+27 27 0.8 <= AVE
+28 28 NIL
+63 63 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/11038.table b/definitions/bufr/tables/0/wmo/27/codetables/11038.table
new file mode 100644
index 0000000..f0c5cce
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/11038.table
@@ -0,0 +1,17 @@
+0 0 MIN < 1
+1 1 1 <= MIN < 2
+2 2 2 <= MIN < 3
+3 3 3 <= MIN < 4
+4 4 4 <= MIN < 5
+5 5 5 <= MIN < 6
+6 6 6 <= MIN < 7
+7 7 7 <= MIN < 8
+8 8 8 <= MIN < 9
+9 9 9 <= MIN < 10
+10 10 10 <= MIN < 11
+11 11 11 <= MIN < 12
+12 12 12 <= MIN < 13
+13 13 13 <= MIN < 14
+14 14 14 <= MIN < 15
+15 15 NO TIMING INFORMATION AVAILABLE
+31 31 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/11039.table b/definitions/bufr/tables/0/wmo/27/codetables/11039.table
new file mode 100644
index 0000000..c2abbda
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/11039.table
@@ -0,0 +1,17 @@
+0 0 MIN < 1
+1 1 1 <= MIN < 2
+2 2 2 <= MIN < 3
+3 3 3 <= MIN < 4
+4 4 4 <= MIN < 5
+5 5 5 <= MIN < 6
+6 6 6 <= MIN < 7
+7 7 7 <= MIN < 8
+8 8 8 <= MIN < 9
+9 9 9 <= MIN < 10
+10 10 10 <= MIN < 11
+11 11 11 <= MIN < 12
+12 12 12 <= MIN < 13
+13 13 13 <= MIN < 14
+14 14 14 <= MIN < 15
+60 60 NO TIMING INFORMATION AVAILABLE
+63 63 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/1150.table b/definitions/bufr/tables/0/wmo/27/codetables/1150.table
new file mode 100644
index 0000000..05fe4b3
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/1150.table
@@ -0,0 +1,6 @@
+0 0 WGS84, AS USED BY ICAO SINCE 1998
+1 1 ETRS89, AS DEFINED BY EPSG::4258
+2 2 NAD83, AS DEFINED BY EPSG::4269
+3 3 DHDN, AS DEFINED BY EPSG::4314
+4 4 ELLIPSOIDAL DATUM USING THE INTERNATIONAL REFERENCE MERIDIAN MAINTAINED BY THE INTERNATIONAL EARTH ROTATION AND REFERENCE SYSTEMS SERVICE (IERS)
+65535 65535 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/1151.table b/definitions/bufr/tables/0/wmo/27/codetables/1151.table
new file mode 100644
index 0000000..8907f23
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/1151.table
@@ -0,0 +1,3 @@
+0 0 EARTH GRAVITATIONAL MODEL 1996
+1 1 BALTIC HEIGHT SYSTEM 1977
+4095 4095 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/13038.table b/definitions/bufr/tables/0/wmo/27/codetables/13038.table
new file mode 100644
index 0000000..19bc422
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/13038.table
@@ -0,0 +1,4 @@
+0 0 NOT SUPERADIABATIC
+1 1 SUPERADIABATIC
+2 2 RESERVED
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/13039.table b/definitions/bufr/tables/0/wmo/27/codetables/13039.table
new file mode 100644
index 0000000..c070b1d
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/13039.table
@@ -0,0 +1,3 @@
+0 0 SEA ICE
+1 1 SNOW ON LAND
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/13040.table b/definitions/bufr/tables/0/wmo/27/codetables/13040.table
new file mode 100644
index 0000000..30c08bd
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/13040.table
@@ -0,0 +1,8 @@
+0 0 LAND
+1 1 RESERVED
+2 2 NEAR COAST
+3 3 ICE
+4 4 POSSIBLE ICE
+5 5 OCEAN
+6 6 COAST
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/13041.table b/definitions/bufr/tables/0/wmo/27/codetables/13041.table
new file mode 100644
index 0000000..9e77b64
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/13041.table
@@ -0,0 +1,10 @@
+1 1 A
+2 2 A - B
+3 3 B
+4 4 B - C
+5 5 C
+6 6 D
+7 7 E
+8 8 F
+9 9 G
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/13051.table b/definitions/bufr/tables/0/wmo/27/codetables/13051.table
new file mode 100644
index 0000000..4bdb73e
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/13051.table
@@ -0,0 +1,8 @@
+0 0 SMALLER THAN ANY VALUE IN THE 30-YEAR PERIOD
+1 1 IN THE FIRST QUINTILE
+2 2 IN THE SECOND QUINTILE
+3 3 IN THE THIRD QUINTILE
+4 4 IN THE FOURTH QUINTILE
+5 5 IN THE FIFTH QUINTILE
+6 6 GREATER THAN ANY VALUE IN THE 30-YEAR PERIOD
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/13056.table b/definitions/bufr/tables/0/wmo/27/codetables/13056.table
new file mode 100644
index 0000000..448c269
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/13056.table
@@ -0,0 +1,11 @@
+0 0 NO PRECIPITATION
+1 1 LIGHT INTERMITTENT
+2 2 MODERATE INTERMITTENT
+3 3 HEAVY INTERMITTENT
+4 4 VERY HEAVY INTERMITTENT
+5 5 LIGHT CONTINUOUS
+6 6 MODERATE CONTINUOUS
+7 7 HEAVY CONTINUOUS
+8 8 VERY HEAVY CONTINUOUS
+9 9 VARIABLE - ALTERNATIVELY LIGHT AND HEAVY
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/13057.table b/definitions/bufr/tables/0/wmo/27/codetables/13057.table
new file mode 100644
index 0000000..6dfa18d
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/13057.table
@@ -0,0 +1,11 @@
+0 0 NO PRECIPITATION
+1 1 WITHIN THE LAST HOUR
+2 2 1 TO 2 HOURS AGO
+3 3 2 TO 3 HOURS AGO
+4 4 3 TO 4 HOURS AGO
+5 5 4 TO 5 HOURS AGO
+6 6 5 TO 6 HOURS AGO
+7 7 6 TO 8 HOURS AGO
+8 8 8 TO 10 HOURS AGO
+9 9 MORE THAN 10 HOURS AGO
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/15025.table b/definitions/bufr/tables/0/wmo/27/codetables/15025.table
new file mode 100644
index 0000000..6bb6ed5
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/15025.table
@@ -0,0 +1,4 @@
+0 0 OZONE
+11 11 FINE PARTICULATE MATTER (DIAMETER < 2.5 MICRONS)
+12 12 FINE PARTICULATE MATTER (DIAMETER < 10 MICRONS)
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/19001.table b/definitions/bufr/tables/0/wmo/27/codetables/19001.table
new file mode 100644
index 0000000..af893eb
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/19001.table
@@ -0,0 +1,7 @@
+0 0 DEPRESSION OR LOW (EXTRATROPLCAL)
+1 1 TROPICAL DEPRESSION
+2 2 TROPICAL STORM
+3 3 SEVERE TROPICAL STORM
+4 4 TYPHOON
+10 10 DUST/SANDSTORM
+63 63 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/19008.table b/definitions/bufr/tables/0/wmo/27/codetables/19008.table
new file mode 100644
index 0000000..3bcb519
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/19008.table
@@ -0,0 +1,5 @@
+0 0 RESERVED
+1 1 SHALLOW (TOP OF CIRCULATION BELOW 700-HPA LEVEL)
+2 2 MEDIUM (TOP BETWEEN 700-HPA AND 400-HPA LEVEL)
+3 3 DEEP (TOP ABOVE 400-HPA LEVEL)
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/19010.table b/definitions/bufr/tables/0/wmo/27/codetables/19010.table
new file mode 100644
index 0000000..b091d96
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/19010.table
@@ -0,0 +1,3 @@
+1 1 MINIMUM VALUE OF SEA LEVEL PRESSURE
+2 2 MAXIMUM VALUE OF 850 HPA RELATIVE VORTICITY
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/19100.table b/definitions/bufr/tables/0/wmo/27/codetables/19100.table
new file mode 100644
index 0000000..1f03a6f
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/19100.table
@@ -0,0 +1,9 @@
+3 3 DURING THE PRECEDING 15 MINUTES
+4 4 DURING THE PRECEDING 30 MINUTES
+5 5 DURING THE PRECEDING 1 HOUR
+6 6 DURING THE PRECEDING 2 HOURS
+7 7 DURING THE PRECEDING 3 HOURS
+8 8 DURING THE PRECEDING 6 HOURS
+9 9 DURING A PERIOD OF MORE THAN 6 HOURS
+10 10 UNDETERMINED
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/19101.table b/definitions/bufr/tables/0/wmo/27/codetables/19101.table
new file mode 100644
index 0000000..0cd1ff4
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/19101.table
@@ -0,0 +1,10 @@
+0 0 RESERVED
+1 1 EYE VISIBLE ON RADAR SCOPE, ACCURACY GOOD (WITHIN 10 KM)
+2 2 EYE VISIBLE ON RADAR SCOPE, ACCURACY FAIR (WITHIN 30 KM)
+3 3 EYE VISIBLE ON RADAR SCOPE, ACCURACY POOR (WITHIN 50 KM)
+4 4 POSITION OF THE CENTRE WITHIN THE AREA COVERED BY THE RADAR SCOPE, DETERMINATION BY MEANS OF THE SPIRAL-BAND OVERLAY, ACCURACY GOOD (WITHIN 10 KM)
+5 5 POSITION OF THE CENTRE WITHIN THE AREA COVERED BY THE RADAR SCOPE, DETERMINATION BY MEANS OF THE SPIRAL-BAND OVERLAY, ACCURACY FAIR (WITHIN 30 KM)
+6 6 POSITION OF THE CENTRE WITHIN THE AREA COVERED BY THE RADAR SCOPE, DETERMINATION BY MEANS OF THE SPIRAL-BAND OVERLAY, ACCURACY POOR (WITHIN 50 KM)
+7 7 POSITION OF THE CENTRE OUTSIDE THE AREA COVERED BY THE RADAR SCOPE, EXTRAPOLATION BY MEANS OF THE SPIRAL-BAND OVERLAY
+10 10 ACCURACY UNDETERMINED
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/19102.table b/definitions/bufr/tables/0/wmo/27/codetables/19102.table
new file mode 100644
index 0000000..21ab775
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/19102.table
@@ -0,0 +1,8 @@
+0 0 CIRCULAR
+1 1 ELLIPTICAL - THE MINOR AXIS IS AT LEAST 3/4 THE LENGTH OF THE MAJOR AXIS
+2 2 ELLIPTICAL - THE MINOR AXIS IS LESS THAN 3/4 THE LENGTH OF THE MAJOR AXIS
+3 3 APPARENT DOUBLE EYE
+4 4 OTHER SHAPE
+5 5 ILL DEFINED
+6 6 UNDETERMINED
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/19103.table b/definitions/bufr/tables/0/wmo/27/codetables/19103.table
new file mode 100644
index 0000000..3abb184
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/19103.table
@@ -0,0 +1,12 @@
+0 0 LESS THAN 5 KM
+1 1 5 TO LESS THAN 10 KM
+2 2 10 TO LESS THAN 15 KM
+3 3 15 TO LESS THAN 20 KM
+4 4 20 TO LESS THAN 25 KM
+5 5 25 TO LESS THAN 30 KM
+6 6 30 TO LESS THAN 35 KM
+7 7 35 TO LESS THAN 40 KM
+8 8 40 TO LESS THAN 50 KM
+9 9 50 KM AND GREATER
+10 10 UNDETERMINED
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/19104.table b/definitions/bufr/tables/0/wmo/27/codetables/19104.table
new file mode 100644
index 0000000..67ae474
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/19104.table
@@ -0,0 +1,12 @@
+0 0 EYE HAS FIRST BECOME VISIBLE DURING THE PAST 30 MINUTES
+1 1 NO SIGNIFICANT CHANGE IN THE CHARACTERISTICS OR SIZE OF THE EYE
+2 2 EYE HAS BECOME SMALLER WITH NO OTHER SIGNIFICANT CHANGE IN CHARACTERISTICS
+3 3 EYE HAS BECOME LARGER WITH NO OTHER SIGNIFICANT CHANGE IN CHARACTERISTICS
+4 4 EYE HAS BECOME LESS DISTINCT WITH NO SIGNIFICANT CHANGE IN SIZE
+5 5 EYE HAS BECOME LESS DISTINCT AND DECREASED IN SIZE
+6 6 EYE HAS BECOME LESS DISTINCT AND INCREASED IN SIZE
+7 7 EYE HAS BECOME MORE DISTINCT WITH NO SIGNIFICANT CHANGE IN SIZE
+8 8 EYE HAS BECOME MORE DISTINCT AND DECREASED IN SIZE
+9 9 EYE HAS BECOME MORE DISTINCT AND INCREASED IN SIZE
+10 10 CHANGE IN CHARACTER AND SIZE OF EYE CANNOT BE DETERMINED
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/19105.table b/definitions/bufr/tables/0/wmo/27/codetables/19105.table
new file mode 100644
index 0000000..becfcee
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/19105.table
@@ -0,0 +1,10 @@
+0 0 0 TO LESS THAN 100 KM
+1 1 100 TO LESS THAN 200 KM
+2 2 200 TO LESS THAN 300 KM
+3 3 300 TO LESS THAN 400 KM
+4 4 400 TO LESS THAN 500 KM
+5 5 500 TO LESS THAN 600 KM
+6 6 600 TO LESS THAN 800 KM
+7 7 800 KM OR MORE
+10 10 DOUBTFUL OR UNDETERMINED
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/19107.table b/definitions/bufr/tables/0/wmo/27/codetables/19107.table
new file mode 100644
index 0000000..ed6b79c
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/19107.table
@@ -0,0 +1,11 @@
+0 0 LESS THAN 1 HOUR
+1 1 1 TO LESS THAN 2 HOURS
+2 2 2 TO LESS THAN 3 HOURS
+3 3 3 TO LESS THAN 6 HOURS
+4 4 6 TO LESS THAN 9 HOURS
+5 5 9 TO LESS THAN 12 HOURS
+6 6 12 TO LESS THAN 15 HOURS
+7 7 15 TO LESS THAN 18 HOURS
+8 8 18 TO LESS THAN 21 HOURS
+9 9 21 TO LESS THAN 30 HOURS
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/19108.table b/definitions/bufr/tables/0/wmo/27/codetables/19108.table
new file mode 100644
index 0000000..9350bc2
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/19108.table
@@ -0,0 +1,8 @@
+0 0 CYCLONE CENTRE WITHIN 10 KM OF THE TRANSMITTED POSITION
+1 1 CYCLONE CENTRE WITHIN 20 KM OF THE TRANSMITTED POSITION
+2 2 CYCLONE CENTRE WITHIN 50 KM OF THE TRANSMITTED POSITION
+3 3 CYCLONE CENTRE WITHIN 100 KM OF THE TRANSMITTED POSITION
+4 4 CYCLONE CENTRE WITHIN 200 KM OF THE TRANSMITTED POSITION
+5 5 CYCLONE CENTRE WITHIN 300 KM OF THE TRANSMITTED POSITION
+6 6 CYCLONE CENTRE UNDETERMINED
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/19109.table b/definitions/bufr/tables/0/wmo/27/codetables/19109.table
new file mode 100644
index 0000000..e3c9c05
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/19109.table
@@ -0,0 +1,12 @@
+0 0 LESS THAN 1° OF LATITUDE
+1 1 1° TO LESS THAN 2° OF LATITUDE
+2 2 2° TO LESS THAN 3° OF LATITUDE
+3 3 3° TO LESS THAN 4° OF LATITUDE
+4 4 4° TO LESS THAN 5° OF LATITUDE
+5 5 5° TO LESS THAN 6° OF LATITUDE
+6 6 6° TO LESS THAN 7° OF LATITUDE
+7 7 7° TO LESS THAN 8° OF LATITUDE
+8 8 8° TO LESS THAN 9° OF LATITUDE
+9 9 9° OF LATITUDE OR MORE
+10 10 UNDETERMINED
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/19110.table b/definitions/bufr/tables/0/wmo/27/codetables/19110.table
new file mode 100644
index 0000000..81f4f59
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/19110.table
@@ -0,0 +1,8 @@
+0 0 MUCH WEAKENING
+1 1 WEAKENING
+2 2 NO CHANGE
+3 3 INTENSIFICATION
+4 4 STRONG INTENSIFICATION
+9 9 NOT OBSERVED PREVIOUSLY
+10 10 UNDETERMINED
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/19113.table b/definitions/bufr/tables/0/wmo/27/codetables/19113.table
new file mode 100644
index 0000000..ba46dca
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/19113.table
@@ -0,0 +1,8 @@
+1 1 CURVED BAND
+2 2 SHEAR
+3 3 EYE
+4 4 BANDING EYE
+5 5 CENTRAL DENSE OVERCAST (CDO)
+6 6 EMBEDDED CENTRE
+7 7 CENTRE COLD COVER (CCC)
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/19117.table b/definitions/bufr/tables/0/wmo/27/codetables/19117.table
new file mode 100644
index 0000000..b623197
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/19117.table
@@ -0,0 +1,4 @@
+1 1 A (CURVED BAND)
+2 2 B (CDO)
+3 3 C (SHEAR)
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/19119.table b/definitions/bufr/tables/0/wmo/27/codetables/19119.table
new file mode 100644
index 0000000..8329a8a
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/19119.table
@@ -0,0 +1,4 @@
+1 1 DT-NUMBER
+2 2 PT-NUMBER
+3 3 MET-NUMBER
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20003.table b/definitions/bufr/tables/0/wmo/27/codetables/20003.table
new file mode 100644
index 0000000..0ebc7c7
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20003.table
@@ -0,0 +1,266 @@
+0 0 CLOUD DEVELOPMENT NOT OBSERVED OR NOT OBSERVABLE
+1 1 CLOUDS GENERALLY DISSOLVING OR BECOMING LESS DEVELOPED
+2 2 STATE OF SKY ON THE WHOLE UNCHANGED
+3 3 CLOUDS GENERALLY FORMING OR DEVELOPING
+4 4 VISIBILITY REDUCED BY SMOKE, E.G. VELDT OR FOREST FIRES, INDUSTRIAL SMOKE OR VOLCANIC ASHES
+5 5 HAZE
+6 6 WIDESPREAD DUST IN SUSPENSION IN THE AIR, NOT RAISED BY WIND AT OR NEAR THE STATION AT THE TIME OF OBSERVATION
+7 7 DUST OR SAND RAISED BY WIND AT OR NEAR THE STATION AT THE TIME OF OBSERVATION, BUT NO WELL-DEVELOPED DUST WHIRL(S) OR SAND WHIRL(S), AND NO DUSTSTORM OR SANDSTORM SEEN; OR, IN THE CASE OF SEA STATIONS AND COASTAL STATIONS, BLOWING SPRAY AT THE STATION
+8 8 WELL-DEVELOPED DUST WHIRL(S) OR SAND WHIRL(S) SEEN AT OR NEAR THE STATION DURING THE PRECEDING HOUR OR AT THE SAME TIME OF OBSERVATION, BUT NO DUSTSTORM OR SANDSTORM
+9 9 DUSTSTORM OR SANDSTORM WITHIN SIGHT AT THE TIME OF OBSERVATION, OR AT THE STATION DURING THE PRECEDING HOUR
+10 10 MIST
+11 11 PATCHES
+12 12 MORE OR LESS CONTINUOUS
+13 13 LIGHTNING VISIBLE, NO THUNDER HEARD
+14 14 PRECIPITATION WITHIN SIGHT, NOT REACHING THE GROUND OR THE SURFACE OF THE SEA
+15 15 PRECIPITATION WITHIN SIGHT, REACHING THE GROUND OR THE SURFACE OF THE SEA, BUT DISTANT, I.E. ESTIMATED TO BE MORE THAN 5 KM FROM THE STATION
+16 16 PRECIPITATION WITHIN SIGHT, REACHING THE GROUND OR THE SURFACE OF THE SEA, NEAR TO, BUT NOT AT THE STATION
+17 17 THUNDERSTORM, BUT NO PRECIPITATION AT THE TIME OF OBSERVATION
+18 18 SQUALLS
+19 19 FUNNEL CLOUD(S)
+20 20 DRIZZLE (NOT FREEZING) OR SNOW GRAINS
+21 21 RAIN (NOT FREEZING)
+22 22 SNOW
+23 23 RAIN AND SNOW OR ICE PELLETS
+24 24 FREEZING DRIZZLE OR FREEZING RAIN
+25 25 SHOWER(S) OF RAIN
+26 26 SHOWER(S) OF SNOW, OR OF RAIN AND SNOW
+27 27 SHOWER(S) OF HAIL*, OR OF RAIN AND HAIL*
+28 28 FOG OR ICE FOG
+29 29 THUNDERSTORM (WITH OR WITHOUT PRECIPITATION)
+30 30 SLIGHT OR MODERATE DUSTSTORM OR SANDSTORM
+31 31 SLIGHT OR MODERATE DUSTSTORM OR SANDSTORM
+32 32 SLIGHT OR MODERATE DUSTSTORM OR SANDSTORM
+33 33 SEVERE DUSTSTORM OR SANDSTORM
+34 34 SEVERE DUSTSTORM OR SANDSTORM
+35 35 SEVERE DUSTSTORM OR SANDSTORM
+36 36 SLIGHT OR MODERATE DRIFTING SNOW
+37 37 HEAVY DRIFTING SNOW
+38 38 SLIGHT OR MODERATE BLOWING SNOW
+39 39 HEAVY BLOWING SNOW
+40 40 FOG OR ICE FOG AT A DISTANCE AT THE TIME OF OBSERVATION, BUT NOT AT THE STATION DURING THE PRECEDING HOUR, THE FOG OR ICE FOG EXTENDING TO A LEVEL ABOVE THAT OF THE OBSERVER
+41 41 FOG OR ICE FOG IN PATCHES
+42 42 FOG OR ICE FOG, SKY VISIBLE
+43 43 FOG OR ICE FOG, SKY INVISIBLE
+44 44 FOG OR ICE FOG, SKY VISIBLE
+45 45 FOG OR ICE FOG, SKY INVISIBLE
+46 46 FOG OR ICE FOG, SKY VISIBLE
+47 47 FOG OR ICE FOG, SKY INVISIBLE
+48 48 FOG, DEPOSITING RIME, SKY VISIBLE
+49 49 FOG, DEPOSITING RIME, SKY INVISIBLE
+50 50 DRIZZLE, NOT FREEZING, INTERMITTENT
+51 51 DRIZZLE, NOT FREEZING, CONTINUOUS
+52 52 DRIZZLE, NOT FREEZING, INTERMITTENT
+53 53 DRIZZLE, NOT FREEZING, CONTINUOUS
+54 54 DRIZZLE, NOT FREEZING, INTERMITTENT
+55 55 DRIZZLE, NOT FREEZING, CONTINUOUS
+56 56 DRIZZLE, FREEZING, SLIGHT
+57 57 DRIZZLE, FREEZING, MODERATE OR HEAVY (DENSE)
+58 58 DRIZZLE AND RAIN, SLIGHT
+59 59 DRIZZLE AND RAIN, MODERATE OR HEAVY
+60 60 RAIN, NOT FREEZING, INTERMITTENT
+61 61 RAIN, NOT FREEZING, CONTINUOUS
+62 62 RAIN, NOT FREEZING, INTERMITTENT
+63 63 RAIN, NOT FREEZING, CONTINUOUS
+64 64 RAIN, NOT FREEZING, INTERMITTENT
+65 65 RAIN, NOT FREEZING, CONTINUOUS
+66 66 RAIN, FREEZING, SLIGHT
+67 67 RAIN, FREEZING, MODERATE OR HEAVY
+68 68 RAIN OR DRIZZLE AND SNOW, SLIGHT
+69 69 RAIN OR DRIZZLE AND SNOW, MODERATE OR HEAVY
+70 70 INTERMITTENT FALL OF SNOWFLAKES
+71 71 CONTINUOUS FALL OF SNOWFLAKES
+72 72 INTERMITTENT FALL OF SNOWFLAKES
+73 73 CONTINUOUS FALL OF SNOWFLAKES
+74 74 INTERMITTENT FALL OF SNOWFLAKES
+75 75 CONTINUOUS FALL OF SNOWFLAKES
+76 76 DIAMOND DUST (WITH OR WITHOUT FOG)
+77 77 SNOW GRAINS (WITH OR WITHOUT FOG)
+78 78 ISOLATED STAR-LIKE SNOW CRYSTALS (WITH OR WITHOUT FOG)
+79 79 ICE PELLETS
+80 80 RAIN SHOWER(S), SLIGHT
+81 81 RAIN SHOWER(S), MODERATE OR HEAVY
+82 82 RAIN SHOWER(S), VIOLENT
+83 83 SHOWER(S) OF RAIN AND SNOW MIXED, SLIGHT
+84 84 SHOWER(S) OF RAIN AND SNOW MIXED, MODERATE OR HEAVY
+85 85 SNOW SHOWER(S), SLIGHT
+86 86 SNOW SHOWER(S), MODERATE OR HEAVY
+87 87 SHOWER(S) OF SNOW PELLETS OR SMALL HAIL, WITH OR WITHOUT RAIN OR RAIN AND SNOW MIXED
+88 88 SHOWER(S) OF SNOW PELLETS OR SMALL HAIL, WITH OR WITHOUT RAIN OR RAIN AND SNOW MIXED
+89 89 SHOWER(S) OF HAIL, WITH OR WITHOUT RAIN OR RAIN AND SNOW MIXED, NOT ASSOCIATED WITH THUNDER
+90 90 SHOWER(S) OF HAIL, WITH OR WITHOUT RAIN OR RAIN AND SNOW MIXED, NOT ASSOCIATED WITH THUNDER
+91 91 SLIGHT RAIN AT TIME OF OBSERVATION
+92 92 MODERATE OR HEAVY RAIN AT TIME OF OBSERVATION
+93 93 SLIGHT SNOW, OR RAIN AND SNOW MIXED OR HAIL* AT TIME OF OBSERVATION
+94 94 MODERATE OR HEAVY SNOW, OR RAIN AND SNOW MIXED OR HAIL* AT TIME OF OBSERVATION
+95 95 THUNDERSTORM, SLIGHT OR MODERATE, WITHOUT HAIL*, BUT WITH RAIN AND/OR SNOW AT TIME OF OBSERVATION
+96 96 THUNDERSTORM, SLIGHT OR MODERATE, WITH HAIL* AT TIME OF OBSERVATION
+97 97 THUNDERSTORM, HEAVY, WITHOUT HAIL*, BUT WITH RAIN AND/OR SNOW AT TIME OF OBSERVATION
+98 98 THUNDERSTORM COMBINED WITH DUSTSTORM OR SANDSTORM AT TIME OF OBSERVATION
+99 99 THUNDERSTORM, HEAVY, WITH HAIL* AT TIME OF OBSERVATION
+100 100 NO SIGNIFICANT WEATHER OBSERVED
+101 101 CLOUDS GENERALLY DISSOLVING OR BECOMING LESS DEVELOPED DURING THE PAST HOUR
+102 102 STATE OF SKY ON THE WHOLE UNCHANGED DURING THE PAST HOUR
+103 103 CLOUDS GENERALLY FORMING OR DEVELOPING DURING THE PAST HOUR
+104 104 HAZE OR SMOKE, OR DUST IN SUSPENSION IN THE AIR, VISIBILITY EQUAL TO, OR GREATER THAN, 1 KM
+105 105 HAZE OR SMOKE, OR DUST IN SUSPENSION IN THE AIR, VISIBILITY LESS THAN 1 KM
+110 110 MIST
+111 111 DIAMOND DUST
+112 112 DISTANT LIGHTNING
+118 118 SQUALLS
+119 119 RESERVED
+120 120 FOG
+121 121 PRECIPITATION
+122 122 DRIZZLE (NOT FREEZING) OR SNOW GRAINS
+123 123 RAIN (NOT FREEZING)
+124 124 SNOW
+125 125 FREEZING DRIZZLE OR FREEZING RAIN
+126 126 THUNDERSTORM (WITH OR WITHOUT PRECIPITATION)
+127 127 BLOWING OR DRIFTING SNOW OR SAND
+128 128 BLOWING OR DRIFTING SNOW OR SAND, VISIBILITY EQUAL TO, OR GREATER THAN, 1 KM
+129 129 BLOWING OR DRIFTING SNOW OR SAND, VISIBILITY LESS THAN 1 KM
+130 130 FOG
+131 131 FOG OR ICE FOG IN PATCHES
+132 132 FOG OR ICE FOG, HAS BECOME THINNER DURING THE PAST HOUR
+133 133 FOG OR ICE FOG, NO APPRECIABLE CHANGE DURING THE PAST HOUR
+134 134 FOG OR ICE FOG, HAS BEGUN OR BECOME THICKER DURING THE PAST HOUR
+135 135 FOG, DEPOSITING RIME
+140 140 PRECIPITATION
+141 141 PRECIPITATION, SLIGHT OR MODERATE
+142 142 PRECIPITATION, HEAVY
+143 143 LIQUID PRECIPITATION, SLIGHT OR MODERATE
+144 144 LIQUID PRECIPITATION, HEAVY
+145 145 SOLID PRECIPITATION, SLIGHT OR MODERATE
+146 146 SOLID PRECIPITATION, HEAVY
+147 147 FREEZING PRECIPITATION, SLIGHT OR MODERATE
+148 148 FREEZING PRECIPITATION, HEAVY
+149 149 RESERVED
+150 150 DRIZZLE
+151 151 DRIZZLE, NOT FREEZING, SLIGHT
+152 152 DRIZZLE, NOT FREEZING, MODERATE
+153 153 DRIZZLE, NOT FREEZING, HEAVY
+154 154 DRIZZLE, FREEZING, SLIGHT
+155 155 DRIZZLE, FREEZING, MODERATE
+156 156 DRIZZLE, FREEZING, HEAVY
+157 157 DRIZZLE AND RAIN, SLIGHT
+158 158 DRIZZLE AND RAIN, MODERATE OR HEAVY
+159 159 RESERVED
+160 160 RAIN
+161 161 RAIN, NOT FREEZING, SLIGHT
+162 162 RAIN, NOT FREEZING, MODERATE
+163 163 RAIN, NOT FREEZING, HEAVY
+164 164 RAIN, FREEZING, SLIGHT
+165 165 RAIN, FREEZING, MODERATE
+166 166 RAIN, FREEZING, HEAVY
+167 167 RAIN (OR DRIZZLE) AND SNOW, SLIGHT
+168 168 RAIN (OR DRIZZLE) AND SNOW, MODERATE OR HEAVY
+169 169 RESERVED
+170 170 SNOW
+171 171 SNOW, SLIGHT
+172 172 SNOW, MODERATE
+173 173 SNOW, HEAVY
+174 174 ICE PELLETS, SLIGHT
+175 175 ICE PELLETS, MODERATE
+176 176 ICE PELLETS, HEAVY
+177 177 SNOW GRAINS
+178 178 ICE CRYSTALS
+179 179 RESERVED
+180 180 SHOWER(S) OR INTERMITTENT PRECIPITATION
+181 181 RAIN SHOWER(S) OR INTERMITTENT RAIN, SLIGHT
+182 182 RAIN SHOWER(S) OR INTERMITTENT RAIN, MODERATE
+183 183 RAIN SHOWER(S) OR INTERMITTENT RAIN, HEAVY
+184 184 RAIN SHOWER(S) OR INTERMITTENT RAIN, VIOLENT
+185 185 SNOW SHOWER(S) OR INTERMITTENT SNOW, SLIGHT
+186 186 SNOW SHOWER(S) OR INTERMITTENT SNOW, MODERATE
+187 187 SNOW SHOWER(S) OR INTERMITTENT SNOW, HEAVY
+188 188 RESERVED
+189 189 HAIL
+190 190 THUNDERSTORM
+191 191 THUNDERSTORM, SLIGHT OR MODERATE, WITH NO PRECIPITATION
+192 192 THUNDERSTORM, SLIGHT OR MODERATE, WITH RAIN SHOWERS AND/OR SNOW SHOWERS
+193 193 THUNDERSTORM, SLIGHT OR MODERATE, WITH HAIL
+194 194 THUNDERSTORM, HEAVY, WITH NO PRECIPITATION
+195 195 THUNDERSTORM, HEAVY, WITH RAIN SHOWERS AND/OR SNOW SHOWERS
+196 196 THUNDERSTORM, HEAVY, WITH HAIL
+199 199 TORNADO
+204 204 VOLCANIC ASH SUSPENDED IN THE AIR ALOFT
+205 205 NOT USED
+206 206 THICK DUST HAZE, VISIBILITY LESS THAN 1 KM
+207 207 BLOWING SPRAY AT THE STATION
+208 208 DRIFTING DUST (SAND)
+209 209 WALL OF DUST OR SAND IN DISTANCE (LIKE HABOOB)
+210 210 SNOW HAZE
+211 211 WHITEOUT
+212 212 NOT USED
+213 213 LIGHTNING, CLOUD TO SURFACE
+217 217 DRY THUNDERSTORM
+218 218 NOT USED
+219 219 TORNADO CLOUD (DESTRUCTIVE) AT OR WITHIN SIGHT OF THE STATION DURING PRECEDING HOUR OR AT THE TIME OF OBSERVATION
+220 220 DEPOSITION OF VOLCANIC ASH
+221 221 DEPOSITION OF DUST OR SAND
+222 222 DEPOSITION OF DEW
+223 223 DEPOSITION OF WET SNOW
+224 224 DEPOSITION OF SOFT RIME
+225 225 DEPOSITION OF HARD RIME
+226 226 DEPOSITION OF HOAR FROST
+227 227 DEPOSITION OF GLAZE
+228 228 DEPOSITION OF ICE CRUST (ICE SLICK)
+229 229 NOT USED
+230 230 DUSTSTORM OR SANDSTORM WITH TEMPERATURE BELOW 0 °C
+239 239 BLOWING SNOW, IMPOSSIBLE TO DETERMINE WHETHER SNOW IS FALLING OR NOT
+240 240 NOT USED
+241 241 FOG ON SEA
+242 242 FOG IN VALLEYS
+243 243 ARCTIC OR ANTARCTIC SEA SMOKE
+244 244 STEAM FOG (SEA, LAKE OR RIVER)
+245 245 STEAM LOG (LAND)
+246 246 FOG OVER ICE OR SNOW COVER
+247 247 DENSE FOG, VISIBILITY 60-90 M
+248 248 DENSE FOG, VISIBILITY 30-60 M
+249 249 DENSE FOG, VISIBILITY LESS THAN 30 M
+250 250 DRIZZLE, RATE OF FALL - LESS THAN 0.10 MM H-1
+251 251 DRIZZLE, RATE OF FALL - 0.10-0.19 MM H-1
+252 252 DRIZZLE, RATE OF FALL - 0.20-0.39 MM H-1
+253 253 DRIZZLE, RATE OF FALL - 0.40-0.79 MM H-1
+254 254 DRIZZLE, RATE OF FALL - 0.80-1.59 MM H-1
+255 255 DRIZZLE, RATE OF FALL - 1.60-3.19 MM H-1
+256 256 DRIZZLE, RATE OF FALL - 3.20-6.39 MM H-1
+257 257 DRIZZLE, RATE OF FALL - 6.4 MM H-1 OR MORE
+258 258 NOT USED
+259 259 DRIZZLE AND SNOW
+260 260 RAIN, RATE OF FALL - LESS THAN 1.0 MM H-1
+261 261 RAIN, RATE OF FALL - 1.0-1.9 MM H-1
+262 262 RAIN, RATE OF FALL - 2.0-3.9 MM H-1
+263 263 RAIN, RATE OF FALL - 4.0-7.9 MM H-1
+264 264 RAIN, RATE OF FALL - 8.0-15.9 MM H-1
+265 265 RAIN, RATE OF FALL - 16.0-31.9 MM H-1
+266 266 RAIN, RATE OF FALL - 32.0-63.9 MM H-1
+267 267 RAIN, RATE OF FALL - 64.0 MM H-1 OR MORE
+270 270 SNOW, RATE OF FALL - LESS THAN 1.0 CM H-1
+271 271 SNOW, RATE OF FALL - 1.0-1.9 CM H-1
+272 272 SNOW, RATE OF FALL - 2.0-3.9 CM H-1
+273 273 SNOW, RATE OF FALL - 4.0-7.9 CM H-1
+274 274 SNOW, RATE OF FALL - 8.0-15.9 CM H-1
+275 275 SNOW, RATE OF FALL - 16.0-31.9 CM H-1
+276 276 SNOW, RATE OF FALL - 32.0-63.9 CM H-1
+277 277 SNOW, RATE OF FALL - 64.0 CM H-1 OR MORE
+278 278 SNOW OR ICE CRYSTAL PRECIPITATION FROM A CLEAR SKY
+279 279 WET SNOW, FREEZING ON CONTACT
+280 280 PRECIPITATION OF RAIN
+281 281 PRECIPITATION OF RAIN, FREEZING
+282 282 PRECIPITATION OF RAIN AND SNOW MIXED
+283 283 PRECIPITATION OF SNOW
+284 284 PRECIPITATION OF SNOW PELLETS OR SMALL HALL
+285 285 PRECIPITATION OF SNOW PELLETS OR SMALL HAIL, WITH RAIN
+286 286 PRECIPITATION OF SNOW PELLETS OR SMALL HAIL, WITH RAIN AND SNOW MIXED
+287 287 PRECIPITATION OF SNOW PELLETS OR SMALL HAIL, WITH SNOW
+288 288 PRECIPITATION OF HAIL
+289 289 PRECIPITATION OF HAIL, WITH RAIN
+290 290 PRECIPITATION OF HALL, WITH RAIN AND SNOW MIXED
+291 291 PRECIPITATION OF HAIL, WITH SNOW
+292 292 SHOWER(S) OR THUNDERSTORM OVER SEA
+293 293 SHOWER(S) OR THUNDERSTORM OVER MOUNTAINS
+508 508 NO SIGNIFICANT PHENOMENON TO REPORT, PRESENT AND PAST WEATHER OMITTED
+509 509 NO OBSERVATION, DATA NOT AVAILABLE, PRESENT AND PAST WEATHER OMITTED
+510 510 PRESENT AND PAST WEATHER MISSING, BUT EXPECTED
+511 511 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20004.table b/definitions/bufr/tables/0/wmo/27/codetables/20004.table
new file mode 100644
index 0000000..6d6e7da
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20004.table
@@ -0,0 +1,21 @@
+0 0 CLOUD COVERING 1/2 OR LESS OF THE SKY THROUGHOUT THE APPROPRIATE PERIOD
+1 1 CLOUD COVERING MORE THAN 1/2 OF THE SKY DURING PART OF THE APPROPRIATE PERIOD AND COVERING 1/2 OR LESS DURING PART OF THE PERIOD
+2 2 CLOUD COVERING MORE THAN 1/2 OF THE SKY THROUGHOUT THE APPROPRIATE PERIOD
+3 3 SANDSTORM, DUSTSTORM OR BLOWING SNOW
+4 4 FOG OR ICE FOG OR THICK HAZE
+5 5 DRIZZLE
+6 6 RAIN
+7 7 SNOW, OR RAIN AND SNOW MIXED
+8 8 SHOWER(S)
+9 9 THUNDERSTORM(S) WITH OR WITHOUT PRECIPITATION
+10 10 NO SIGNIFICANT WEATHER OBSERVED
+11 11 VISIBILITY REDUCED (SEE NOTE)
+12 12 BLOWING PHENOMENA, VISIBILITY REDUCED
+13 13 FOG (SEE NOTE)
+14 14 PRECIPITATION (SEE NOTE)
+15 15 DRIZZLE
+16 16 RAIN
+17 17 SNOW OR ICE PELLETS
+18 18 SHOWERS OR INTERMITTENT PRECIPITATION
+19 19 THUNDERSTORM
+31 31 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20005.table b/definitions/bufr/tables/0/wmo/27/codetables/20005.table
new file mode 100644
index 0000000..6d6e7da
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20005.table
@@ -0,0 +1,21 @@
+0 0 CLOUD COVERING 1/2 OR LESS OF THE SKY THROUGHOUT THE APPROPRIATE PERIOD
+1 1 CLOUD COVERING MORE THAN 1/2 OF THE SKY DURING PART OF THE APPROPRIATE PERIOD AND COVERING 1/2 OR LESS DURING PART OF THE PERIOD
+2 2 CLOUD COVERING MORE THAN 1/2 OF THE SKY THROUGHOUT THE APPROPRIATE PERIOD
+3 3 SANDSTORM, DUSTSTORM OR BLOWING SNOW
+4 4 FOG OR ICE FOG OR THICK HAZE
+5 5 DRIZZLE
+6 6 RAIN
+7 7 SNOW, OR RAIN AND SNOW MIXED
+8 8 SHOWER(S)
+9 9 THUNDERSTORM(S) WITH OR WITHOUT PRECIPITATION
+10 10 NO SIGNIFICANT WEATHER OBSERVED
+11 11 VISIBILITY REDUCED (SEE NOTE)
+12 12 BLOWING PHENOMENA, VISIBILITY REDUCED
+13 13 FOG (SEE NOTE)
+14 14 PRECIPITATION (SEE NOTE)
+15 15 DRIZZLE
+16 16 RAIN
+17 17 SNOW OR ICE PELLETS
+18 18 SHOWERS OR INTERMITTENT PRECIPITATION
+19 19 THUNDERSTORM
+31 31 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20006.table b/definitions/bufr/tables/0/wmo/27/codetables/20006.table
new file mode 100644
index 0000000..a250af9
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20006.table
@@ -0,0 +1,5 @@
+0 0 LOW INSTRUMENT FLIGHT RULES - CEILING < 500 FEET AND/OR VISIBILITY < 1 MILE
+1 1 INSTRUMENT FLIGHT RULES - CEILING < 1000 FEET AND/OR VISIBILITY < 3 MILES
+2 2 MARGINAL VISUAL FLIGHT RULES - 1000 FEET <= CEILING < 3000 FEET AND/OR 3 MILES <= VISIBILITY < 5 MILES
+3 3 VISUAL FLIGHT RULES - CEILING => 3000 FEET AND/OR VISIBILITY => 5 MILES
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20008.table b/definitions/bufr/tables/0/wmo/27/codetables/20008.table
new file mode 100644
index 0000000..966bcc2
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20008.table
@@ -0,0 +1,19 @@
+0 0 SKY CLEAR
+1 1 FEW
+2 2 SCATTERED
+3 3 BROKEN
+4 4 OVERCAST
+5 5 RESERVED
+6 6 SCATTERED/BROKEN
+7 7 BROKEN/OVERCAST
+8 8 ISOLATED
+9 9 ISOLATED EMBEDDED
+10 10 OCCASIONAL
+11 11 OCCASIONAL EMBEDDED
+12 12 FREQUENT
+13 13 DENSE
+14 14 LAYERS
+15 15 OBSCURED (OBSC)
+16 16 EMBEDDED (EMBD)
+17 17 FREQUENT EMBEDDED
+31 31 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20009.table b/definitions/bufr/tables/0/wmo/27/codetables/20009.table
new file mode 100644
index 0000000..f0119eb
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20009.table
@@ -0,0 +1,6 @@
+0 0 RESERVED
+1 1 NSC NIL SIGNIFICANT CLOUD
+2 2 CAVOK
+3 3 SKC SKY CLEAR
+4 4 NSW NIL SIGNIFICANT WEATHER
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2001.table b/definitions/bufr/tables/0/wmo/27/codetables/2001.table
new file mode 100644
index 0000000..470fccc
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2001.table
@@ -0,0 +1,4 @@
+0 0 AUTOMATIC
+1 1 MANNED
+2 2 HYBRID: BOTH MANNED AND AUTOMATIC
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20011.table b/definitions/bufr/tables/0/wmo/27/codetables/20011.table
new file mode 100644
index 0000000..06c6e10
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20011.table
@@ -0,0 +1,16 @@
+0 0 0
+1 1 1 OKTA OR LESS, BUT NOT ZERO
+2 2 2 OKTAS
+3 3 3 OKTAS
+4 4 4 OKTAS
+5 5 5 OKTAS
+6 6 6 OKTAS
+7 7 7 OKTAS OR MORE, BUT NOT 8 OKTAS
+8 8 8 OKTAS
+9 9 SKY OBSCURED BY FOG AND/OR OTHER METEOROLOGICAL PHENOMENA
+10 10 SKY PARTIALLY OBSCURED BY FOG AND/OR OTHER METEOROLOGICAL PHENOMENA
+11 11 SCATTERED
+12 12 BROKEN
+13 13 FEW
+14 14 RESERVED
+15 15 CLOUD COVER IS INDISCERNIBLE FOR REASONS OTHER THAN FOG OR OTHER METEOROLOGICAL PHENOMENA, OR OBSERVATION IS NOT MADE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20012.table b/definitions/bufr/tables/0/wmo/27/codetables/20012.table
new file mode 100644
index 0000000..99bdc17
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20012.table
@@ -0,0 +1,48 @@
+0 0 CIRRUS (CI)
+1 1 CIRROCUMULUS (CC)
+2 2 CIRROSTRATUS (CS)
+3 3 ALTOCUMULUS (AC)
+4 4 ALTOSTRATUS (AS)
+5 5 NIMBOSTRATUS (NS)
+6 6 STRATOCUMULUS (SC)
+7 7 STRATUS (ST)
+8 8 CUMULUS (CU)
+9 9 CUMULONIMBUS (CB)
+10 10 NO CH CLOUDS
+11 11 CIRRUS FIBRATUS, SOMETIMES UNCINUS, NOT PROGRESSIVELY INVADING THE SKY
+12 12 CIRRUS SPISSATUS, IN PATCHES OR ENTANGLED SHEAVES, WHICH USUALLY DO NOT INCREASE AND SOMETIMES SEEM TO BE THE REMAINS OF THE UPPER PART OF A CUMULONIMBUS; OR CIRRUS CASTELLANUS OR FLOCCUS
+13 13 CIRRUS SPISSATUS CUMULONIMBOGENITUS
+14 14 CIRRUS UNCINUS OR FIBRATUS, OR BOTH, PROGRESSIVELY INVADING THE SKY; THEY GENERALLY THICKEN AS A WHOLE
+15 15 CIRRUS (OFTEN IN BANDS) AND CIRROSTRATUS, OR CIRROSTRATUS ALONE, PROGRESSIVELY INVADING THE SKY; THEY GENERALLY THICKEN AS A WHOLE, BUT THE CONTINUOUS VEIL DOES NOT REACH 45 DEGREES ABOVE THE HORIZON
+16 16 CIRRUS (OFTEN IN BANDS) AND CIRROSTRATUS, OR CIRROSTRATUS ALONE, PROGRESSIVELY INVADING THE SKY; THEY GENERALLY THICKEN AS A WHOLE; THE CONTINUOUS VEIL EXTENDS MORE THAN 45 DEGREES ABOVE THE HORIZON, WITHOUT THE SKY BEING TOTALLY COVERED
+17 17 CIRROSTRATUS COVERING THE WHOLE SKY
+18 18 CIRROSTRATUS NOT PROGRESSIVELY INVADING THE SKY AND NOT ENTIRELY COVERING IT
+19 19 CIRROCUMULUS ALONE, OR CIRROCUMULUS PREDOMINANT AMONG THE CH CLOUDS
+20 20 NO CM CLOUDS
+21 21 ALTOSTRATUS TRANSLUCIDUS
+22 22 ALTOSTRATUS OPACUS OR NIMBOSTRATUS
+23 23 ALTOCUMULUS TRANSLUCIDUS AT A SINGLE LEVEL
+24 24 PATCHES (OFTEN LENTICULAR) OF ALTOCUMULUS TRANSLUCIDUS, CONTINUALLY CHANGING AND OCCURRING AT ONE OR MORE LEVELS
+25 25 ALTOCUMULUS TRANSLUCIDUS IN BANDS, OR ONE OR MORE LAYERS OF ALTOCUMULUS TRANSLUCIDUS OR OPACUS, PROGRESSIVELY INVADING THE SKY; THESE ALTOCUMULUS CLOUDS GENERALLY THICKEN AS A WHOLE
+26 26 ALTOCUMULUS CUMULOGENITUS (OR CUMULONIMBOGENITUS)
+27 27 ALTOCUMULUS TRANSLUCIDUS OR OPACUS IN TWO OR MORE LAYERS, OR ALTOCUMULUS OPACUS IN A SINGLE LAYER, NOT PROGRESSIVELY INVADING THE SKY, OR ALTOCUMULUS WITH ALTOSTRATUS OR NIMBOSTRATUS
+28 28 ALTOCUMULUS CASTELLANUS OR FLOCCUS
+29 29 ALTOCUMULUS OF A CHAOTIC SKY, GENERALLY AT SEVERAL LEVELS
+30 30 NO CL CLOUDS
+31 31 CUMULUS HUMILIS OR CUMULUS FRACTUS OTHER THAN OF BAD WEATHER,* OR BOTH
+32 32 CUMULUS MEDIOCRIS OR CONGESTUS, TOWERING CUMULUS (TCU), WITH OR WITHOUT CUMULUS OF SPECIES FRACTUS OR HUMILIS OR STRATOCUMULUS, ALL HAVING THEIR BASES AT THE SAME LEVEL
+33 33 CUMULONIMBUS CALVUS, WITH OR WITHOUT CUMULUS, STRATOCUMULUS OR STRATUS
+34 34 STRATOCUMULUS CUMULOGENITUS
+35 35 STRATOCUMULUS OTHER THAN STRATOCUMULUS CUMULOGENITUS
+36 36 STRATUS NEBULOSUS OR STRATUS FRACTUS OTHER THAN OF BAD WEATHER,* OR BOTH
+37 37 STRATUS FRACTUS OR CUMULUS FRACTUS OF BAD WEATHER,* OR BOTH (PANNUS), USUALLY BELOW ALTOSTRATUS OR NIMBOSTRATUS
+38 38 CUMULUS AND STRATOCUMULUS OTHER THAN STRATOCUMULUS CUMULOGENITUS, WITH BASES AT DIFFERENT LEVELS
+39 39 CUMULONIMBUS CAPILLATUS (OFTEN WITH AN ANVIL), WITH OR WITHOUT CUMULONIMBUS CALVUS, CUMULUS, STRATOCUMULUS, STRATUS OR PANNUS
+40 40 CH
+41 41 CM
+42 42 CL
+59 59 CLOUD NOT VISIBLE OWING TO DARKNESS, FOG, DUSTSTORM, SANDSTORM, OR OTHER ANALOGOUS PHENOMENA
+60 60 CH CLOUDS INVISIBLE OWING TO DARKNESS, FOG, BLOWING DUST OR SAND, OR OTHER SIMILAR PHENOMENA, OR BECAUSE OF A CONTINUOUS LAYER OF LOWER CLOUDS
+61 61 CM CLOUDS INVISIBLE OWING TO DARKNESS, FOG, BLOWING DUST OR SAND, OR OTHER SIMILAR PHENOMENA, OR BECAUSE OF CONTINUOUS LAYER OF LOWER CLOUDS
+62 62 CL CLOUDS INVISIBLE OWING TO DARKNESS, FOG, BLOWING DUST OR SAND, OR OTHER SIMILAR PHENOMENA
+63 63 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20017.table b/definitions/bufr/tables/0/wmo/27/codetables/20017.table
new file mode 100644
index 0000000..5ec10bd
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20017.table
@@ -0,0 +1,11 @@
+0 0 ISOLATED CLOUD FRAGMENTS OF CLOUDS
+1 1 CONTINUOUS CLOUD
+2 2 BROKEN CLOUD - SMALL BREAKS
+3 3 BROKEN CLOUD - LARGE BREAKS
+4 4 CONTINUOUS CLOUD
+5 5 BROKEN CLOUD - SMALL BREAKS
+6 6 BROKEN CLOUD - LARGE BREAKS
+7 7 CONTINUOUS OR ALMOST CONTINUOUS WAVES WITH TOWERING CLOUDS ABOVE THE TOP OF THE LAYER
+8 8 GROUPS OF WAVES WITH TOWERING CLOUDS ABOVE THE TOP OF THE LAYER
+9 9 TWO OR MORE LAYERS AT DIFFERENT LEVELS
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20018.table b/definitions/bufr/tables/0/wmo/27/codetables/20018.table
new file mode 100644
index 0000000..c0ffc36
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20018.table
@@ -0,0 +1,4 @@
+0 0 INCREASING (U)
+1 1 DECREASING (D)
+2 2 NO DISTINCT CHANGE (N)
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2002.table b/definitions/bufr/tables/0/wmo/27/codetables/2002.table
new file mode 100644
index 0000000..a701e1e
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2002.table
@@ -0,0 +1,3 @@
+1 1 CERTIFIED INSTRUMENTS
+2 2 ORIGINALLY MEASURED IN KNOTS
+3 3 ORIGINALLY MEASURED IN KM H-1
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20021.table b/definitions/bufr/tables/0/wmo/27/codetables/20021.table
new file mode 100644
index 0000000..747a759
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20021.table
@@ -0,0 +1,23 @@
+1 1 PRECIPITATION - UNKNOWN TYPE
+2 2 LIQUID PRECIPITATION NOT FREEZING
+3 3 LIQUID FREEZING PRECIPITATION
+4 4 DRIZZLE
+5 5 RAIN
+6 6 SOLID PRECIPITATION
+7 7 SNOW
+8 8 SNOW GRAINS
+9 9 SNOW PELLETS
+10 10 ICE PELLETS
+11 11 ICE CRYSTALS
+12 12 DIAMOND DUST
+13 13 SMALL HAIL
+14 14 HAIL
+15 15 GLAZE
+16 16 RIME
+17 17 SOFT RIME
+18 18 HARD RIME
+19 19 CLEAR ICE
+20 20 WET SNOW
+21 21 HOAR FROST
+22 22 DEW
+23 23 WHITE DEW
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20022.table b/definitions/bufr/tables/0/wmo/27/codetables/20022.table
new file mode 100644
index 0000000..a551aac
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20022.table
@@ -0,0 +1,7 @@
+0 0 NO PRECIPITATION
+1 1 CONTINUOUS
+2 2 INTERMITTENT
+3 3 SHOWER
+4 4 NOT REACHING GROUND
+5 5 DEPOSITION
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20023.table b/definitions/bufr/tables/0/wmo/27/codetables/20023.table
new file mode 100644
index 0000000..97670df
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20023.table
@@ -0,0 +1,14 @@
+1 1 DUST/SAND WHIRL
+2 2 SQUALLS
+3 3 SANDSTORM
+4 4 DUSTSTORM
+5 5 LIGHTNING - CLOUD TO SURFACE
+6 6 LIGHTNING - CLOUD TO CLOUD
+7 7 LIGHTNING - DISTANT
+8 8 THUNDERSTORM
+9 9 FUNNEL CLOUD NOT TOUCHING SURFACE
+10 10 FUNNEL CLOUD TOUCHING SURFACE
+11 11 SPRAY
+12 12 WATERSPOUT
+13 13 WIND SHEAR
+14 14 DUST DEVILS
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20024.table b/definitions/bufr/tables/0/wmo/27/codetables/20024.table
new file mode 100644
index 0000000..13aba87
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20024.table
@@ -0,0 +1,8 @@
+0 0 NO PHENOMENA
+1 1 LIGHT
+2 2 MODERATE
+3 3 HEAVY
+4 4 VIOLENT
+5 5 SEVERE
+6 6 VERY SEVERE
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20025.table b/definitions/bufr/tables/0/wmo/27/codetables/20025.table
new file mode 100644
index 0000000..4d70e33
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20025.table
@@ -0,0 +1,13 @@
+1 1 FOG
+2 2 ICE FOG
+3 3 STEAM FOG
+7 7 MIST
+8 8 HAZE
+9 9 SMOKE
+10 10 VOLCANIC ASH
+11 11 DUST
+12 12 SAND
+13 13 SNOW
+14 14 CLOUD
+15 15 PRECIPITATION
+16 16 IMPOSSIBLE TO DETERMINE WHETHER SNOW IS FALLING OR NOT
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20026.table b/definitions/bufr/tables/0/wmo/27/codetables/20026.table
new file mode 100644
index 0000000..2852094
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20026.table
@@ -0,0 +1,16 @@
+0 0 NO CHANGE
+1 1 SHALLOW
+2 2 PATCHES
+3 3 PARTIAL
+4 4 FREEZING
+5 5 LOW DRIFTING
+6 6 BLOWING
+7 7 INCREASING
+8 8 DECREASING
+9 9 IN SUSPENSION IN THE AIR
+10 10 WALL
+11 11 DENSE
+12 12 WHITEOUT
+13 13 DRIFTING AND BLOWING
+14 14 RESERVED
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20027.table b/definitions/bufr/tables/0/wmo/27/codetables/20027.table
new file mode 100644
index 0000000..c337f16
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20027.table
@@ -0,0 +1,8 @@
+1 1 AT TIME OF OBSERVATION
+2 2 IN PAST HOUR
+3 3 IN TIME PERIOD FOR PAST WEATHER W1W2
+4 4 IN TIME PERIOD SPECIFIED
+5 5 RESERVED
+6 6 BELOW STATION LEVEL
+7 7 AT THE STATION
+8 8 IN THE VICINITY
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20028.table b/definitions/bufr/tables/0/wmo/27/codetables/20028.table
new file mode 100644
index 0000000..6b701a2
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20028.table
@@ -0,0 +1,4 @@
+0 0 NO CHANGE (NC)
+1 1 FORECAST TO WEAKEN (WKN)
+2 2 FORECAST TO INTENSIFY (INTSF)
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20029.table b/definitions/bufr/tables/0/wmo/27/codetables/20029.table
new file mode 100644
index 0000000..8b46da8
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20029.table
@@ -0,0 +1,4 @@
+0 0 NO RAIN
+1 1 RAIN
+2 2 RESERVED
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2003.table b/definitions/bufr/tables/0/wmo/27/codetables/2003.table
new file mode 100644
index 0000000..e0aa923
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2003.table
@@ -0,0 +1,12 @@
+0 0 PRESSURE INSTRUMENT ASSOCIATED WITH WIND MEASURING EQUIPMENT
+1 1 OPTICAL THEODOLITE
+2 2 RADIO THEODOLITE
+3 3 RADAR
+4 4 VLF-OMEGA
+5 5 LORAN C
+6 6 WIND PROFILER
+7 7 SATELLITE NAVIGATION
+8 8 RADIO-ACOUSTIC SOUNDING SYSTEM (RASS)
+9 9 SODAR
+14 14 PRESSURE INSTRUMENT ASSOCIATED WITH WIND MEASURING EQUIPMENT BUT PRESSURE ELEMENT FAILED DURING ASCENT
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20032.table b/definitions/bufr/tables/0/wmo/27/codetables/20032.table
new file mode 100644
index 0000000..fd37c1e
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20032.table
@@ -0,0 +1,6 @@
+0 0 ICE NOT BUILDING UP
+1 1 ICE BUILDING UP SLOWLY
+2 2 ICE BUILDING UP RAPIDLY
+3 3 ICE MELTING OR BREAKING UP SLOWLY
+4 4 ICE MELTING OR BREAKING UP RAPIDLY
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20033.table b/definitions/bufr/tables/0/wmo/27/codetables/20033.table
new file mode 100644
index 0000000..8178733
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20033.table
@@ -0,0 +1,3 @@
+1 1 ICING FROM OCEAN SPRAY
+2 2 ICING FROM FOG
+3 3 ICING FROM RAIN
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20034.table b/definitions/bufr/tables/0/wmo/27/codetables/20034.table
new file mode 100644
index 0000000..668e916
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20034.table
@@ -0,0 +1,12 @@
+0 0 NO SEA ICE IN SIGHT
+1 1 SHIP IN OPEN LEAD MORE THAN 1.0 NAUTICAL MILE WIDE, OR SHIP IN FAST ICE WITH BOUNDARY BEYOND LIMIT OF VISIBILITY
+2 2 SEA ICE PRESENT IN CONCENTRATIONS LESS THAN 3/10 (3/8), OPEN WATER OR VERY OPEN PACK ICE
+3 3 4/10 TO 6/10 (3/8 TO LESS THAN 6/8), OPEN PACK ICE
+4 4 7/10 TO 8/10 (6/8 TO LESS THAN 7/8), CLOSE PACK ICE
+5 5 9/10 OR MORE, BUT NOT 10/10 (7/8 TO LESS THAN 8/8), VERY CLOSE PACK ICE
+6 6 STRIPS AND PATCHES OF PACK ICE WITH OPEN WATER BETWEEN
+7 7 STRIPS AND PATCHES OF CLOSE OR VERY CLOSE PACK ICE WITH AREAS OF LESSER CONCENTRATION BETWEEN
+8 8 FAST ICE WITH OPEN WATER, VERY OPEN OR OPEN PACK ICE TO SEAWARD OF THE ICE BOUNDARY
+9 9 FAST ICE WITH CLOSE OR VERY CLOSE PACK ICE TO SEAWARD OF THE BOUNDARY
+14 14 UNABLE TO REPORT, BECAUSE OF DARKNESS, LACK OF VISIBILITY, OR BECAUSE SHIP IS MORE THAN 0.5 NAUTICAL MILE AWAY FROM ICE EDGE
+31 31 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20035.table b/definitions/bufr/tables/0/wmo/27/codetables/20035.table
new file mode 100644
index 0000000..07a4a02
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20035.table
@@ -0,0 +1,12 @@
+0 0 NO ICE OF LAND ORIGIN
+1 1 1-5 ICEBERGS, NO GROWLERS OR BERGY BITS
+2 2 6-10 ICEBERGS, NO GROWLERS OR BERGY BITS
+3 3 11-20 ICEBERGS, NO GROWLERS OR BERGY BITS
+4 4 UP TO AND INCLUDING 10 GROWLERS AND BERGY BITS - NO ICEBERGS
+5 5 MORE THAN 10 GROWLERS AND BERGY BITS - NO ICEBERGS
+6 6 1-5 ICEBERGS, WITH GROWLERS AND BERGY BITS
+7 7 6-10 ICEBERGS, WITH GROWLERS AND BERGY BITS
+8 8 11-20 ICEBERGS, WITH GROWLERS AND BERGY BITS
+9 9 MORE THAN 20 ICEBERGS, WITH GROWLERS AND BERGY BITS - A MAJOR HAZARD TO NAVIGATION
+14 14 UNABLE TO REPORT, BECAUSE OF DARKNESS, LACK OF VISIBILITY OR BECAUSE ONLY SEA ICE IS VISIBLE
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20036.table b/definitions/bufr/tables/0/wmo/27/codetables/20036.table
new file mode 100644
index 0000000..b4cc874
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20036.table
@@ -0,0 +1,12 @@
+0 0 SHIP IN OPEN WATER WITH FLOATING ICE IN SIGHT
+1 1 SHIP IN EASILY PENETRABLE ICE; CONDITIONS IMPROVING
+2 2 SHIP IN EASILY PENETRABLE ICE; CONDITIONS NOT CHANGING
+3 3 SHIP IN EASILY PENETRABLE ICE; CONDITIONS WORSENING
+4 4 SHIP IN ICE DIFFICULT TO PENETRATE; CONDITIONS IMPROVING
+5 5 SHIP IN ICE DIFFICULT TO PENETRATE; CONDITIONS NOT CHANGING
+6 6 SHIP IN ICE DIFFICULT TO PENETRATE AND CONDITIONS WORSENING. ICE FORMING AND FLOES FREEZING TOGETHER
+7 7 SHIP IN ICE DIFFICULT TO PENETRATE AND CONDITIONS WORSENING. ICE UNDER SLIGHT PRESSURE
+8 8 SHIP IN ICE DIFFICULT TO PENETRATE AND CONDITIONS WORSENING. ICE UNDER MODERATE OR SEVERE PRESSURE
+9 9 SHIP IN ICE DIFFICULT TO PENETRATE AND CONDITIONS WORSENING. SHIP BESET
+30 30 UNABLE TO REPORT, BECAUSE OF DARKNESS OR LACK OF VISIBILITY
+31 31 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20037.table b/definitions/bufr/tables/0/wmo/27/codetables/20037.table
new file mode 100644
index 0000000..474eeaa
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20037.table
@@ -0,0 +1,12 @@
+0 0 NEW ICE ONLY (FRAZIL ICE, GREASE ICE, SLUSH, SHUGA)
+1 1 NILAS OR ICE RIND, LESS THAN 10 CM THICK
+2 2 YOUNG ICE (GREY ICE, GREY-WHITE ICE), 10-30 CM THICK
+3 3 PREDOMINANTLY NEW AND/OR YOUNG ICE WITH SOME FIRST-YEAR ICE
+4 4 PREDOMINANTLY THIN FIRST-YEAR ICE WITH SOME NEW AND/OR YOUNG ICE
+5 5 ALL THIN FIRST-YEAR ICE (30-70 CM THICK)
+6 6 PREDOMINANTLY MEDIUM FIRST-YEAR ICE (70-120 CM THICK) AND THICK FIRST-YEAR ICE (>120 CM THICK) WITH SOME THINNER (YOUNGER) FIRST-YEAR ICE
+7 7 ALL MEDIUM AND THICK FIRST-YEAR ICE
+8 8 PREDOMINANTLY MEDIUM AND THICK FIRST-YEAR ICE WITH SOME OLD ICE (USUALLY MORE THAN 2 METRES THICK)
+9 9 PREDOMINANTLY OLD ICE
+30 30 UNABLE TO REPORT, BECAUSE OF DARKNESS, LACK OF VISIBILITY OR BECAUSE ONLY ICE OF LAND ORIGIN IS VISIBLE OR BECAUSE SHIP IS MORE THAN 0.5 NAUTICAL MILE AWAY FROM ICE EDGE
+31 31 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2004.table b/definitions/bufr/tables/0/wmo/27/codetables/2004.table
new file mode 100644
index 0000000..a55de6c
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2004.table
@@ -0,0 +1,11 @@
+0 0 USA OPEN PAN EVAPORIMETER (WITHOUT COVER)
+1 1 USA OPEN PAN EVAPORIMETER (MESH COVERED)
+2 2 GGI-3000 EVAPORIMETER (SUNKEN)
+3 3 20 M2 TANK
+4 4 OTHERS
+5 5 RICE
+6 6 WHEAT
+7 7 MAIZE
+8 8 SORGHUM
+9 9 OTHER CROPS
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20040.table b/definitions/bufr/tables/0/wmo/27/codetables/20040.table
new file mode 100644
index 0000000..889393b
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20040.table
@@ -0,0 +1,9 @@
+0 0 DRIFT SNOW ENDED BEFORE THE HOUR OF OBSERVATION
+1 1 INTENSITY DIMINISHING
+2 2 NO CHANGE
+3 3 INTENSITY INCREASING
+4 4 CONTINUES, APART FROM INTERRUPTION LASTING LESS THAN 30 MINUTES
+5 5 GENERAL DRIFT SNOW HAS BECOME DRIFT SNOW NEAR THE GROUND
+6 6 DRIFT SNOW NEAR THE GROUND HAS BECOME GENERAL DRIFT SNOW
+7 7 DRIFT SNOW HAS STARTED AGAIN AFTER AN INTERRUPTION OF MORE THAN 30 MINUTES
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20041.table b/definitions/bufr/tables/0/wmo/27/codetables/20041.table
new file mode 100644
index 0000000..fc57120
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20041.table
@@ -0,0 +1,14 @@
+0 0 NO ICING
+1 1 LIGHT ICING
+2 2 LIGHT ICING IN CLOUD
+3 3 LIGHT ICING IN PRECIPITATION
+4 4 MODERATE ICING
+5 5 MODERATE ICING IN CLOUD
+6 6 MODERATE ICING IN PRECIPITATION
+7 7 SEVERE ICING
+8 8 SEVERE ICING IN CLOUD
+9 9 SEVERE ICING IN PRECIPITATION
+10 10 TRACE OF ICING
+11 11 TRACE OF ICING IN CLOUD
+12 12 TRACE OF ICING IN PRECIPITATION
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20042.table b/definitions/bufr/tables/0/wmo/27/codetables/20042.table
new file mode 100644
index 0000000..2493af7
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20042.table
@@ -0,0 +1,4 @@
+0 0 NO ICING
+1 1 ICING PRESENT
+2 2 RESERVED
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20045.table b/definitions/bufr/tables/0/wmo/27/codetables/20045.table
new file mode 100644
index 0000000..91ae63f
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20045.table
@@ -0,0 +1,4 @@
+0 0 NO SLD CONDITIONS PRESENT
+1 1 SLD CONDITIONS PRESENT
+2 2 RESERVED
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20048.table b/definitions/bufr/tables/0/wmo/27/codetables/20048.table
new file mode 100644
index 0000000..4a54882
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20048.table
@@ -0,0 +1,5 @@
+0 0 STABILITY
+1 1 DIMINUTION
+2 2 INTENSIFICATION
+3 3 UNKNOWN
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20050.table b/definitions/bufr/tables/0/wmo/27/codetables/20050.table
new file mode 100644
index 0000000..3f8654e
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20050.table
@@ -0,0 +1,10 @@
+0 0 RESERVED
+1 1 1ST LOW CLOUD
+2 2 2ND LOW CLOUD
+3 3 3RD LOW CLOUD
+4 4 1ST MEDIUM CLOUD
+5 5 2ND MEDIUM CLOUD
+6 6 3RD MEDIUM CLOUD
+7 7 1ST HIGH CLOUD
+8 8 2ND HIGH CLOUD
+255 255 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20055.table b/definitions/bufr/tables/0/wmo/27/codetables/20055.table
new file mode 100644
index 0000000..ea06427
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20055.table
@@ -0,0 +1,12 @@
+0 0 CUMULUS, IF ANY, ARE QUITE SMALL; GENERALLY LESS THAN 2/8 COVERAGE, EXCEPT ON WINDWARD SLOPES OF ELEVATED TERRAIN; AVERAGE WIDTH OF CLOUD IS AT LEAST AS GREAT AS ITS VERTICAL THICKNESS
+1 1 CUMULUS OF INTERMEDIATE SIZE WITH CLOUD COVER LESS THAN 5/8; AVERAGE CLOUD WIDTH IS MORE THAN ITS VERTICAL THICKNESS; TOWERS ARE VERTICAL WITH LITTLE OR NO EVIDENCE OF PRECIPITATION, EXCEPT ALONG SLOPES OF ELEVATED TERRAIN; A GENERAL ABSENCE OF MIDDLE AND UPPER CLOUDS
+2 2 SWELLING CUMULUS WITH RAPIDLY GROWING TALL TURRETS WHICH DECREASE IN SIZE WITH HEIGHT AND WHOSE TOPS TEND TO SEPARATE FROM THE LONGER CLOUD BODY AND EVAPORATE WITHIN MINUTES OF THE SEPARATION
+3 3 SWELLING CUMULUS WITH TOWERS HAVING A PRONOUNCED TILT IN A DOWNWIND DIRECTION; VERTICAL CLOUD THICKNESS IS MORE THAN ONE AND A HALF TIMES THAT OF ITS AVERAGE WIDTH
+4 4 SWELLING CUMULUS WITH TOWERS HAVING A PRONOUNCED TILT IN AN UPWIND DIRECTION; VERTICAL CLOUD THICKNESS IS MORE THAN ONE AND A HALF TIMES THAT OF ITS AVERAGE WIDTH
+5 5 TALL CUMULUS CONGESTUS WITH VERTICAL THICKNESS MORE THAN TWICE THE AVERAGE WIDTH; NOT ORGANIZED IN CLUSTERS OR LINES; ONE OR MORE LAYERS OF CLOUDS EXTEND OUT FROM THE CLOUD TOWERS, ALTHOUGH NO CONTINUOUS CLOUD LAYERS EXIST
+6 6 ISOLATED CUMULONIMBUS OR LARGE CLUSTERS OF CUMULUS TURRETS SEPARATED BY WIDE AREAS IN WHICH CLOUDS ARE ABSENT; CLOUD BASES ARE GENERALLY DARK WITH SHOWERS OBSERVED IN MOST CELLS; SOME SCATTERED MIDDLE AND UPPER CLOUDS MAY BE PRESENT; INDIVIDUAL CUMULUS CELLS ARE ONE TO TWO TIMES HIGHER THAN THEY ARE WIDE
+7 7 NUMEROUS CUMULUS EXTENDING THROUGH THE MIDDLE TROPOSPHERE WITH BROKEN TO OVERCAST SHEETS OF MIDDLE CLOUDS AND/OR CIRROSTRATUS; CUMULUS TOWERS DO NOT DECREASE GENERALLY IN SIZE WITH HEIGHT; RAGGED DARK CLOUD BASES WITH SOME SHOWERS PRESENT
+8 8 CONTINUOUS DENSE MIDDLE CLOUDS AND/OR CIRROSTRATUS CLOUD SHEETS WITH SOME LARGE ISOLATED CUMULONIMBUS OR CUMULUS CONGESTUS CLOUDS PENETRATING THESE SHEETS; LIGHT RAIN OCCASIONALLY OBSERVED FROM THE ALTOSTRATUS; CUMULONIMBUS BASES RAGGED AND DARK WITH SHOWERS VISIBLE
+9 9 CONTINUOUS SHEETS OF MIDDLE CLOUDS AND/OR CIRROSTRATUS WITH CUMULONIMBUS AND CUMULUS CONGESTUS IN ORGANIZED LINES OR CLOUD BANDS; RAIN IS GENERALLY OBSERVED FROM ALTOSTRATUS SHEETS AND HEAVY SHOWERS FROM CUMULONIMBUS; WIND HAS A SQUALLY CHARACTER
+10 10 STATE OF SKY UNKNOWN OR NOT DESCRIBED BY ANY OF THE ABOVE
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20056.table b/definitions/bufr/tables/0/wmo/27/codetables/20056.table
new file mode 100644
index 0000000..d493792
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20056.table
@@ -0,0 +1,6 @@
+0 0 UNKNOWN
+1 1 WATER
+2 2 ICE
+3 3 MIXED
+4 4 CLEAR
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20062.table b/definitions/bufr/tables/0/wmo/27/codetables/20062.table
new file mode 100644
index 0000000..24d96c4
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20062.table
@@ -0,0 +1,21 @@
+0 0 SURFACE OF GROUND DRY (WITHOUT CRACKS AND NO APPRECIABLE AMOUNT OF DUST OR LOOSE SAND)
+1 1 SURFACE OF GROUND MOIST
+2 2 SURFACE OF GROUND WET (STANDING WATER IN SMALL OR LARGE POOLS ON SURFACE)
+3 3 FLOODED
+4 4 SURFACE OF GROUND FROZEN
+5 5 GLAZE ON GROUND
+6 6 LOOSE DRY DUST OR SAND NOT COVERING GROUND COMPLETELY
+7 7 THIN COVER OF LOOSE DRY DUST OR SAND COVERING GROUND COMPLETELY
+8 8 MODERATE OR THICK COVER OF LOOSE DRY DUST OR SAND COVERING GROUND COMPLETELY
+9 9 EXTREMELY DRY WITH CRACKS
+10 10 GROUND PREDOMINANTLY COVERED BY ICE
+11 11 COMPACT OR WET SNOW (WITH OR WITHOUT ICE) COVERING LESS THAN ONE HALF OF THE GROUND
+12 12 COMPACT OR WET SNOW (WITH OR WITHOUT ICE) COVERING AT LEAST ONE HALF OF THE GROUND BUT GROUND NOT COMPLETELY COVERED
+13 13 EVEN LAYER OF COMPACT OR WET SNOW COVERING GROUND COMPLETELY
+14 14 UNEVEN LAYER OF COMPACT OR WET SNOW COVERING GROUND COMPLETELY
+15 15 LOOSE DRY SNOW COVERING LESS THAN ONE HALF OF THE GROUND
+16 16 LOOSE DRY SNOW COVERING AT LEAST ONE HALF OF THE GROUND BUT GROUND NOT COMPLETELY COVERED
+17 17 EVEN LAYER OF LOOSE DRY SNOW COVERING GROUND COMPLETELY
+18 18 UNEVEN LAYER OF LOOSE DRY SNOW COVERING GROUND COMPLETELY
+19 19 SNOW COVERING GROUND COMPLETELY; DEEP DRIFTS
+31 31 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20063.table b/definitions/bufr/tables/0/wmo/27/codetables/20063.table
new file mode 100644
index 0000000..90ce1c0
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20063.table
@@ -0,0 +1,71 @@
+0 0 RESERVED
+1 1 HIGHEST WIND SPEED GUSTS GREATER THAN 11.5 M/S
+2 2 HIGHEST MEAN WIND SPEED GREATER THAN 17.5 M/S
+7 7 VISIBILITY GREATER THAN 100 000 M
+10 10 MIRAGE - NO SPECIFICATION
+11 11 MIRAGE - IMAGE OF DISTANT OBJECT RAISED (LOOMING)
+13 13 MIRAGE - INVERTED IMAGE OF DISTANT OBJECT
+14 14 MIRAGE - COMPLEX, MULTIPLE IMAGES OF DISTANT OBJECT (IMAGES NOT INVERTED)
+15 15 MIRAGE - COMPLEX, MULTIPLE IMAGES OF DISTANT OBJECT (SOME IMAGES BEING INVERTED)
+16 16 MIRAGE - SUN OR MOON SEEN APPRECIABLY DISTORTED
+17 17 MIRAGE - SUN VISIBLE, ALTHOUGH ASTRONOMICALLY BELOW THE HORIZON
+18 18 MIRAGE - MOON VISIBLE, ALTHOUGH ASTRONOMICALLY BELOW THE HORIZON
+19 19 RESERVED
+20 20 DAY DARKNESS, BAD, WORST IN DIRECTION SPECIFIED
+21 21 DAY DARKNESS, VERY BAD, WORST IN DIRECTION SPECIFIED
+22 22 DAY DARKNESS, BLACK, WORST IN DIRECTION SPECIFIED
+31 31 SLIGHT COLORATION OF CLOUDS AT SUNRISE ASSOCIATED WITH A TROPICAL DISTURBANCE
+32 32 DEEP-RED COLORATION OF CLOUDS AT SUNRISE ASSOCIATED WITH A TROPICAL DISTURBANCE
+33 33 SLIGHT COLORATION OF CLOUDS AT SUNSET ASSOCIATED WITH A TROPICAL DISTURBANCE
+34 34 DEEP-RED COLORATION OF CLOUDS AT SUNSET ASSOCIATED WITH A TROPICAL DISTURBANCE
+35 35 CONVERGENCE OF CH CLOUDS AT A POINT BELOW 45° FORMING OR INCREASING AND ASSOCIATED WITH A TROPICAL DISTURBANCE
+36 36 CONVERGENCE OF CH CLOUDS AT A POINT ABOVE 45° ASSOCIATED WITH A TROPICAL DISTURBANCE
+37 37 CONVERGENCE OF CH CLOUDS AT A POINT BELOW 45° DISSOLVING OR DIMINISHING AND ASSOCIATED WITH A TROPICAL DISTURBANCE
+38 38 CONVERGENCE OF CH CLOUDS AT A POINT ABOVE 45° ASSOCIATED WITH A TROPICAL DISTURBANCE
+39 39 RESERVED
+40 40 HOAR FROST ON HORIZONTAL SURFACES
+41 41 HOAR FROST ON HORIZONTAL AND VERTICAL SURFACES
+42 42 PRECIPITATION CONTAINING SAND OR DESERT DUST
+43 43 PRECIPITATION CONTAINING VOLCANIC ASH
+50 50 CALM OR LIGHT WIND FOLLOWED BY A SQUALL
+51 51 CALM OR LIGHT WIND FOLLOWED BY A SUCCESSION OF SQUALLS
+52 52 GUSTY WEATHER FOLLOWED BY A SQUALL
+53 53 GUSTY WEATHER FOLLOWED BY A SUCCESSION OF SQUALLS
+54 54 SQUALL FOLLOWED BY GUSTY WEATHER
+55 55 GENERAL GUSTY WEATHER WITH SQUALL AT INTERVALS
+56 56 SQUALL APPROACHING STATION
+57 57 LINE SQUALL
+58 58 SQUALL WITH DRIFTING OR BLOWING DUST OR SAND
+59 59 LINE SQUALL WITH DRIFTING OR BLOWING DUST OR SAND
+60 60 TEMPERATURE STEADY
+61 61 TEMPERATURE FALLING, WITHOUT GOING BELOW 0°C
+62 62 TEMPERATURE RISING, WITHOUT GOING ABOVE 0°C
+63 63 TEMPERATURE FALLING TO A VALUE BELOW 0°C
+64 64 TEMPERATURE RISING TO A VALUE ABOVE 0°C
+65 65 IRREGULAR VARIATION, OSCILLATIONS OF TEMPERATURE PASSING THROUGH 0°C
+66 66 IRREGULAR VARIATION, OSCILLATIONS OF TEMPERATURE NOT PASSING THROUGH 0°C
+67 67 VARIATION OF TEMPERATURE NOT OBSERVED
+68 68 NOT ALLOCATED
+69 69 VARIATION OF TEMPERATURE UNKNOWN OWING TO LACK OF THERMOGRAPH
+70 70 VISIBILITY HAS NOT VARIED (SUN* VISIBLE) TOWARDS DIRECTION SPECIFIED
+71 71 VISIBILITY HAS NOT VARIED (SUN* INVISIBLE) TOWARDS DIRECTION SPECIFIED
+72 72 VISIBILITY HAS INCREASED (SUN* VISIBLE) TOWARDS DIRECTION SPECIFIED
+73 73 VISIBILITY HAS INCREASED (SUN* INVISIBLE) TOWARDS DIRECTION SPECIFIED
+74 74 VISIBILITY HAS DECREASED (SUN* VISIBLE) TOWARDS DIRECTION SPECIFIED
+75 75 VISIBILITY HAS DECREASED (SUN* INVISIBLE) TOWARDS DIRECTION SPECIFIED
+76 76 FOG COMING FROM DIRECTION SPECIFIED
+77 77 FOG HAS LIFTED, WITHOUT DISSIPATING
+78 78 FOG HAS DISPERSED WITHOUT REGARD TO DIRECTION
+79 79 MOVING PATCHES OR BANKS OF FOG
+80 80 BROCKEN SPECTRE
+81 81 RAINBOW
+82 82 SOLAR OR LUNAR HALO
+83 83 PARHELIA OR ANTHELIA
+84 84 SUN PILLAR
+85 85 CORONA
+86 86 TWILIGHT GLOW
+87 87 TWILIGHT GLOW ON THE MOUNTAINS (ALPENGLüHEN)
+88 88 MIRAGE
+89 89 ZODIACAL LIGHT
+90 90 ST ELMO'S FIRE
+1023 1023 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2007.table b/definitions/bufr/tables/0/wmo/27/codetables/2007.table
new file mode 100644
index 0000000..05b4c6b
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2007.table
@@ -0,0 +1,11 @@
+0 0 RESERVED
+1 1 SHAFT ENCODER FLOAT SYSTEM
+2 2 ULTRASONIC
+3 3 RADAR
+4 4 PRESSURE (SINGLE TRANSDUCER)
+5 5 PRESSURE (MULTIPLE TRANSDUCER)
+6 6 PRESSURE (IN STILLING WELL)
+7 7 BUBBLER PRESSURE
+8 8 ACOUSTIC (WITH SOUNDING TUBE)
+9 9 ACOUSTIC (IN OPEN AIR)
+63 63 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20071.table b/definitions/bufr/tables/0/wmo/27/codetables/20071.table
new file mode 100644
index 0000000..72367bf
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20071.table
@@ -0,0 +1,11 @@
+0 0 NO ASSESSMENT
+1 1 LESS THAN 50 KM
+2 2 BETWEEN 50 AND 200 KM
+3 3 MORE THAN 200 KM
+4 4 LESS THAN 50 KM
+5 5 BETWEEN 50 AND 200 KM
+6 6 MORE THAN 200 KM
+7 7 LESS THAN 50 KM
+8 8 BETWEEN 50 AND 200 KM
+9 9 MORE THAN 200 KM
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20085.table b/definitions/bufr/tables/0/wmo/27/codetables/20085.table
new file mode 100644
index 0000000..f929e87
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20085.table
@@ -0,0 +1,3 @@
+0 0 CLEARED (CLRD//)
+1 1 ALL RUNWAYS CLOSED (SNOCLO)
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20086.table b/definitions/bufr/tables/0/wmo/27/codetables/20086.table
new file mode 100644
index 0000000..b543330
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20086.table
@@ -0,0 +1,11 @@
+0 0 CLEAR AND DRY
+1 1 DAMP
+2 2 WET WITH WATER PATCHES
+3 3 RIME AND FROST COVERED (DEPTH NORMALLY LESS THAN 1 MM)
+4 4 DRY SNOW
+5 5 WET SNOW
+6 6 SLUSH
+7 7 ICE
+8 8 COMPACTED OR ROLLED SNOW
+9 9 FROZEN RUTS OR RIDGES
+15 15 MISSING OR NOT REPORTED (E.G. DUE TO RUNWAY CLEARANCE IN PROGRESS)
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20087.table b/definitions/bufr/tables/0/wmo/27/codetables/20087.table
new file mode 100644
index 0000000..ee7971a
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20087.table
@@ -0,0 +1,6 @@
+0 0 RESERVED
+1 1 LESS THAN 10% OF RUNWAY COVERED
+2 2 11% TO 25% OF RUNWAY COVERED
+5 5 26% TO 50% OF RUNWAY COVERED
+9 9 51% TO 100% OF RUNWAY COVERED
+15 15 MISSING OR NOT REPORTED (E.G. DUE TO RUNWAY CLEARANCE IN PROGRESS)
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20089.table b/definitions/bufr/tables/0/wmo/27/codetables/20089.table
new file mode 100644
index 0000000..f616c62
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20089.table
@@ -0,0 +1,11 @@
+0 0 0.00
+1 1 0.01
+89 89 0.89
+90 90 0.90
+91 91 BRAKING ACTION POOR
+92 92 BRAKING ACTION MEDIUM TO POOR
+93 93 BRAKING ACTION MEDIUM
+94 94 BRAKING ACTION MEDIUM TO GOOD
+95 95 BRAKING ACTION GOOD
+99 99 UNRELIABLE
+127 127 MISSING, NOT REPORTED AND/OR RUNWAY NOT OPERATIONAL
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20090.table b/definitions/bufr/tables/0/wmo/27/codetables/20090.table
new file mode 100644
index 0000000..d13502e
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20090.table
@@ -0,0 +1,7 @@
+0 0 RESERVED
+1 1 NACREOUS CLOUDS
+2 2 NOCTILUCENT CLOUDS
+3 3 CLOUDS FROM WATERFALLS
+4 4 CLOUDS FROM FIRES
+5 5 CLOUDS FROM VOLCANIC ERUPTIONS
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20101.table b/definitions/bufr/tables/0/wmo/27/codetables/20101.table
new file mode 100644
index 0000000..abe89f5
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20101.table
@@ -0,0 +1,11 @@
+0 0 RESERVED
+1 1 SCHISTOCERCA GREGARIA
+2 2 LOCUSTA MIGRATORIA
+3 3 NOMADACRIS SEPTEMFASCIATA
+4 4 OEDALEUS SENEGALENSIS
+5 5 ANRACRIDIUM SPP
+6 6 OTHER LOCUSTS
+7 7 OTHER GRASSHOPPERS
+8 8 OTHER CRICKETS
+9 9 SPODOPTERA EXEMPTA
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20102.table b/definitions/bufr/tables/0/wmo/27/codetables/20102.table
new file mode 100644
index 0000000..6a53039
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20102.table
@@ -0,0 +1,11 @@
+0 0 GREEN
+1 1 GREEN OR BLACK
+2 2 BLACK
+3 3 YELLOW AND BLACK
+4 4 STRAW/GREY
+5 5 PINK
+6 6 DARK RED/BROWN
+7 7 MIXED RED AND YELLOW
+8 8 YELLOW
+9 9 OTHER
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20103.table b/definitions/bufr/tables/0/wmo/27/codetables/20103.table
new file mode 100644
index 0000000..9c4f689
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20103.table
@@ -0,0 +1,11 @@
+0 0 HOPPERS (NYMPHS, LARVAE), STAGE 1
+1 1 HOPPERS (NYMPHS, LARVAE), STAGE 2 OR MIXED 1, 2 INSTARS (STAGES)
+2 2 HOPPERS (NYMPHS, LARVAE), STAGE 3 OR MIXED 2, 3 INSTARS
+3 3 HOPPERS (NYMPHS, LARVAE), STAGE 4 OR MIXED 3, 4 INSTARS
+4 4 HOPPERS (NYMPHS, LARVAE), STAGE 5 OR MIXED 4, 5 INSTARS
+5 5 HOPPERS (NYMPHS, LARVAE), STAGE MIXED, ALL OR MANY INSTARS
+6 6 FLEDGLINGS (WINGS TOO SOFT FOR SUSTAINED FLIGHT)
+7 7 IMMATURE ADULTS
+8 8 MIXED MATURITY ADULTS
+9 9 MATURE ADULTS
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20104.table b/definitions/bufr/tables/0/wmo/27/codetables/20104.table
new file mode 100644
index 0000000..15ca8ac
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20104.table
@@ -0,0 +1,11 @@
+0 0 HOPPERS ONLY, MAINLY IN BANDS OR CLUSTERS
+1 1 WINGED ADULTS IN THE VICINITY MORE THAN 10 KILOMETRES FROM POINT OF OBSERVATION
+2 2 LOCUSTS IN FLIGHT, A FEW SEEN AT THE STATION
+3 3 LOCUSTS AT THE STATION, MOST OF THEM ON THE GROUND
+4 4 LOCUSTS, SOME ON GROUND AND OTHERS IN FLIGHT AT A HEIGHT LESS THAN 10 METRES
+5 5 LOCUSTS, SOME ON GROUND AND OTHERS IN FLIGHT AT A HEIGHT GREATER THAN 10 METRES
+6 6 LOCUSTS, MOST IN FLIGHT AT A HEIGHT LESS THAN 10 METRES
+7 7 LOCUSTS, MOST IN FLIGHT AT A HEIGHT GREATER THAN 10 METRES
+8 8 LOCUSTS, ALL OVER INFLICTING SEVERE DAMAGE TO VEGETATION, NO EXTERMINATION OPERATION
+9 9 LOCUSTS, ALL OVER INFLICTING SEVERE DAMAGE TO VEGETATION, EXTERMINATION OPERATION IN PROGRESS
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20105.table b/definitions/bufr/tables/0/wmo/27/codetables/20105.table
new file mode 100644
index 0000000..b7406c0
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20105.table
@@ -0,0 +1,12 @@
+0 0 SMALL SWARM LESS THAN 1 KM2 OR ADULTS IN GROUND, TENS OR HUNDREDS OF INDIVIDUALS VISIBLE SIMULTANEOUSLY, DURATION OF PASSAGE LESS THAN 1 HOUR AGO
+1 1 SMALL SWARM LESS THAN 1 KM2 OR ADULTS IN GROUND, TENS OR HUNDREDS OF INDIVIDUALS VISIBLE SIMULTANEOUSLY, DURATION OF PASSAGE 1 TO 6 HOURS AGO
+2 2 SMALL SWARM LESS THAN 1 KM2 OR ADULTS IN GROUND, TENS OR HUNDREDS OF INDIVIDUALS VISIBLE SIMULTANEOUSLY, DURATION OF PASSAGE OVER 6 HOURS AGO
+3 3 MEDIUM SWARM OR SCATTERED ADULTS, SEVERAL VISIBLE SIMULTANEOUSLY, DURATION OF PASSAGE LESS THAN 1 HOUR AGO
+4 4 MEDIUM SWARM OR SCATTERED ADULTS, SEVERAL VISIBLE SIMULTANEOUSLY, DURATION OF PASSAGE 1 TO 6 HOURS AGO
+5 5 MEDIUM SWARM OR SCATTERED ADULTS, SEVERAL VISIBLE SIMULTANEOUSLY, DURATION OF PASSAGE OVER 6 HOURS AGO
+6 6 LARGE SWARM OR ISOLATED ADULTS, SEEN SINGLY, DURATION OF PASSAGE LESS THAN 1 HOUR AGO
+7 7 LARGE SWARM OR ISOLATED ADULTS, SEEN SINGLY, DURATION OF PASSAGE 1 TO 6 HOURS AGO
+8 8 LARGE SWARM OR ISOLATED ADULTS, SEEN SINGLY, DURATION OF PASSAGE OVER 6 HOURS AGO
+9 9 MORE THAN ONE SWARM OF LOCUSTS
+10 10 SIZE OF SWARM AND/OR DURATION OF PASSAGE NOT DETERMINED OWING TO DARKNESS OR SIMILAR PHENOMENA
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20106.table b/definitions/bufr/tables/0/wmo/27/codetables/20106.table
new file mode 100644
index 0000000..2a8c4a0
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20106.table
@@ -0,0 +1,7 @@
+0 0 RESERVED
+1 1 THIN DENSITY SWARM (SWARM VISIBLE ONLY WHEN NEAR ENOUGH FOR INDIVIDUAL LOCUSTS TO BE DISCERNED)
+2 2 MEDIUM DENSITY SWARM
+3 3 DENSE SWARM (OBSCURING NEARBY FEATURES, E.G. TREES)
+4 4 ISOLATED HOPPERS SEEN SINGLY
+5 5 SCATTERED HOPPERS, SEVERAL VISIBLE SIMULTANEOUSLY
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20107.table b/definitions/bufr/tables/0/wmo/27/codetables/20107.table
new file mode 100644
index 0000000..0bea30a
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20107.table
@@ -0,0 +1,11 @@
+0 0 RESERVED
+1 1 GENERALLY IN THE DIRECTION NE
+2 2 GENERALLY IN THE DIRECTION E
+3 3 GENERALLY IN THE DIRECTION SE
+4 4 GENERALLY IN THE DIRECTION S
+5 5 GENERALLY IN THE DIRECTION SW
+6 6 GENERALLY IN THE DIRECTION W
+7 7 GENERALLY IN THE DIRECTION NW
+8 8 GENERALLY IN THE DIRECTION N
+9 9 SPECIFIC DIRECTION INDETERMINABLE
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20108.table b/definitions/bufr/tables/0/wmo/27/codetables/20108.table
new file mode 100644
index 0000000..4404614
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20108.table
@@ -0,0 +1,9 @@
+0 0 BARE GROUND
+1 1 DRY, PRESENCE OF FEW AND ISOLATED SHRUBS
+2 2 SPARSE VEGETATION (SPROUTING)
+3 3 DENSE VEGETATION (SPROUTING)
+4 4 SPARSE VEGETATION (GROWING)
+5 5 DENSE VEGETATION (GROWING)
+6 6 SPARSE VEGETATION IN FLOWER
+7 7 DENSE VEGETATION IN FLOWER
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2011.table b/definitions/bufr/tables/0/wmo/27/codetables/2011.table
new file mode 100644
index 0000000..7eeb67d
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2011.table
@@ -0,0 +1,100 @@
+0 0 RESERVED
+1 1 NOT VACANT
+2 2 NO RADIOSONDE - PASSIVE TARGET (E.G. REFLECTOR)
+3 3 NO RADIOSONDE - ACTIVE TARGET (E.G. TRANSPONDER)
+4 4 NO RADIOSONDE - PASSIVE TEMPERATURE-HUMIDITY PROFILER
+5 5 NO RADIOSONDE - ACTIVE TEMPERATURE-HUMIDITY PROFILER
+6 6 NO RADIOSONDE - RADIO-ACOUSTIC SOUNDER
+7 7 NOT VACANT
+8 8 NO RADIOSONDE -... (RESERVED)
+9 9 NO RADIOSONDE - SYSTEM UNKNOWN OR NOT SPECIFIED
+10 10 SIPPICAN LMS5 W/CHIP THERMISTOR, DUCT MOUNTED CAPACITANCE RELATIVE HUMIDITY SENSOR AND DERIVED PRESSURE FROM GPS HEIGHT
+11 11 SIPPICAN LMS6 W/CHIP THERMISTOR, EXTERNAL BOOM MOUNTED CAPACITANCE RELATIVE HUMIDITY SENSOR, AND DERIVED PRESSURE FROM GPS HEIGHT
+12 12 JIN YANG RSG-20A WITH DERIVED PRESSURE FROM GPS HEIGHT/GL-5000P (REPUBLIC OF KOREA)
+13 13 VAISALA RS92/MARWIN MW32 (FINLAND)
+14 14 VAISALA RS92/DIGICORA MW41 (FINLAND)
+15 15 PAZA-12M/RADIOTHEODOLITE-UL (UKRAINE)
+16 16 PAZA-22/AVK-1 (UKRAINE)
+17 17 GRAW DFM-09 (GERMANY)
+18 18 NOT VACANT
+19 19 VACANT
+20 20 NOT VACANT
+21 21 JIN YANG 1524LA LORAN-C/GL5000 (REPUBLIC OF KOREA)
+22 22 MEISEI RS-11G GPS RADIOSONDE W/THERMISTOR, CAPACITANCE RELATIVE HUMIDITY SENSOR, AND DERIVED PRESSURE FROM GPS HEIGHT (JAPAN)
+23 23 VAISALA RS41/DIGICORA MW41 (FINLAND)
+24 24 VAISALA RS41/AUTOSONDE (FINLAND)
+25 25 VAISALA RS41/MARWIN MW32 (FINLAND)
+26 26 METEOLABOR SRS-C34/ARGUS 37 (SWITZERLAND)
+27 27 NOT VACANT
+28 28 AVK - AK2-02 (RUSSIAN FEDERATION)
+29 29 MARL-A OR VEKTOR-M - AK2-02 (RUSSIAN FEDERATION)
+30 30 MEISEI RS-06G (JAPAN)
+31 31 TAIYUAN GTS1-1/GFE(L) (CHINA )
+32 32 SHANGHAI GTS1/GFE(L) (CHINA)
+33 33 NANJING GTS1-2/GFE(L) (CHINA)
+34 34 VACANT
+35 35 MEISEI IMS-100 GPS RADIOSONDE W/THERMISTOR SENSOR, CAPACITANCE RELATIVE HUMIDITY SENSOR, AND DERIVED PRESSURE FROM GPS HEIGHT (JAPAN)
+36 36 VACANT
+37 37 NOT VACANT
+38 38 VIZ LOCATE LORAN-C (UNITED STATES)
+39 39 SPRENGER E076 (GERMANY)
+40 40 SPRENGER E084 (GERMANY)
+41 41 VAISALA RS41 WITH PRESSURE DERIVED FROM GPS HEIGHT/DIGICORA MW41 (FINLAND)
+42 42 VAISALA RS41 WITH PRESSURE DERIVED FROM GPS HEIGHT/AUTOSONDE (FINLAND)
+43 43 NANJING DAQIAO XGP-3G (CHINA)*
+44 44 TIANJIN HUAYUNTIANYI GTS(U)1 (CHINA)*
+45 45 BEIJING CHANGFENG CF-06 (CHINA)*
+46 46 SHANGHAI CHANGWANG GTS3 (CHINA)*
+47 47 NOT VACANT
+48 48 PAZA-22M/MARL-A
+49 49 NOT VACANT
+50 50 METEOLABOR SRS-C50/ARGUS (SWITZERLAND)
+51 51 NOT VACANT
+52 52 VAISALA RS92-NGP/INTERMET IMS-2000 (UNITED STATES)
+53 53 AVK - I-2012 (RUSSIAN FEDERATION)
+54 54 GRAW DFM-97 (GERMANY)
+55 55 MEISEI RS-01G (JAPAN)
+56 56 M2K2 (FRANCE)
+57 57 MODEM M2K2-DC (FRANCE)
+58 58 AVK-BAR (RUSSIAN FEDERATION)
+59 59 MODEM M2K2-R 1680 MHZ RDF RADIOSONDE WITH PRESSURE SENSOR CHIP (FRANCE)
+60 60 MARL-A OR VEKTOR-M - I-2012 (RUSSIAN FEDERATION)
+61 61 NOT VACANT
+62 62 MARL-A OR VEKTOR-M - MRZ-3MK (RUSSIAN FEDERATION)
+63 63 VAISALA RS80/STAR (FINLAND)
+64 64 ORBITAL SCIENCES CORPORATION, SPACE DATA DIVISION, TRANSPONDER RADIOSONDE, TYPE 909-11-XX, WHERE XX CORRESPONDS TO THE MODEL OF THE INSTRUMENT (UNITED STATES)
+65 65 VIZ TRANSPONDER RADIOSONDE, MODEL NUMBER 1499–520 (UNITED STATES)
+66 66 VAISALA RS80 /AUTOSONDE (FINLAND)
+67 67 VAISALA RS80/DIGICORA III (FINLAND)
+68 68 AVK-RZM-2 (RUSSIAN FEDERATION)
+69 69 MARL-A OR VEKTOR-M-RZM-2 (RUSSIAN FEDERATION)
+70 70 VAISALA RS92/STAR (FINLAND)
+71 71 VAISALA RS90/LORAN/DIGICORA I, II OR MARWIN (FINLAND)
+72 72 VAISALA RS90/PC-CORA (FINLAND)
+73 73 VAISALA RS90/AUTOSONDE (FINLAND)
+74 74 VAISALA RS90/STAR (FINLAND)
+75 75 AVK-MRZ-ARMA (RUSSIAN FEDERATION)
+76 76 AVK-RF95-ARMA (RUSSIAN FEDERATION)
+77 77 MODEM GPSONDE M10 (FRANCE)
+78 78 VAISALA RS90/DIGICORA III (FINLAND)
+79 79 VAISALA RS92/DIGICORA I,II OR MARWIN (FINLAND)
+80 80 VAISALA RS92/DIGICORA III (FINLAND)
+81 81 VAISALA RS92/AUTOSONDE (FINLAND)
+82 82 LOCKHEED MARTIN LMS-6 W/CHIP THERMISTOR; EXTERNAL BOOM MOUNTED POLYMER CAPACITIVE RELATIVE HUMIDITY SENSOR; CAPACITIVE PRESSURE SENSOR AND GPS WIND
+83 83 VAISALA RS92-D/INTERMET IMS 1500 W/SILICON CAPACITIVE PRESSURE SENSOR, CAPACITIVE WIRE TEMPERATURE SENSOR, TWIN THIN-FILM HEATED POLYMER CAPACITIVE RELATIVE HUMIDITY SENSOR AND RDF WIND
+84 84 VACANT
+85 85 SIPPICAN MARK IIA WITH CHIP THERMISTOR, CARBON ELEMENT AND DERIVED PRESSURE FROM GPS HEIGHT
+86 86 SIPPICAN MARK II WITH CHIP THERMISTOR, PRESSURE AND CARBON ELEMENT
+87 87 SIPPICAN MARK IIA WITH CHIP THERMISTOR, PRESSURE AND CARBON ELEMENT
+88 88 MARL-A OR VEKTOR-M-MRZ (RUSSIAN FEDERATION)
+89 89 MARL-A OR VEKTOR-M-BAR (RUSSIAN FEDERATION)
+90 90 RADIOSONDE NOT SPECIFIED OR UNKNOWN
+91 91 PRESSURE ONLY RADIOSONDE
+92 92 PRESSURE ONLY RADIOSONDE PLUS TRANSPONDER
+93 93 PRESSURE ONLY RADIOSONDE PLUS RADAR REFLECTOR
+94 94 NO PRESSURE RADIOSONDE PLUS TRANSPONDER
+95 95 NO PRESSURE RADIOSONDE PLUS RADAR REFLECTOR
+96 96 DESCENDING RADIOSONDE
+97 97 BAT-16P (SOUTH AFRICA)
+98 98 BAT-16G (SOUTH AFRICA)
+99 99 BAT-4G (SOUTH AFRICA)
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20119.table b/definitions/bufr/tables/0/wmo/27/codetables/20119.table
new file mode 100644
index 0000000..4a4b40f
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20119.table
@@ -0,0 +1,4 @@
+0 0 NOT DEFINED
+1 1 POSITIVE
+2 2 NEGATIVE
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20124.table b/definitions/bufr/tables/0/wmo/27/codetables/20124.table
new file mode 100644
index 0000000..f78eacb
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20124.table
@@ -0,0 +1,4 @@
+0 0 NOT DEFINED
+1 1 LIGHTNING STROKE
+2 2 LIGHTNING FLASH, BY MANUAL OBSERVATION, OR IF EQUIPMENT INSENSITIVE TO STROKE RESOLUTION
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2013.table b/definitions/bufr/tables/0/wmo/27/codetables/2013.table
new file mode 100644
index 0000000..91ce650
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2013.table
@@ -0,0 +1,11 @@
+0 0 NO CORRECTION
+1 1 CIMO SOLAR CORRECTED AND CIMO INFRARED CORRECTED
+2 2 CIMO SOLAR CORRECTED AND INFRARED CORRECTED
+3 3 CIMO SOLAR CORRECTED ONLY
+4 4 SOLAR AND INFRARED CORRECTED AUTOMATICALLY BY RADIOSONDE SYSTEM
+5 5 SOLAR CORRECTED AUTOMATICALLY BY RADIOSONDE SYSTEM
+6 6 SOLAR AND INFRARED CORRECTED AS SPECIFIED BY COUNTRY
+7 7 SOLAR CORRECTED AS SPECIFIED BY COUNTRY
+8 8 SOLAR AND INFRARED CORRECTED AS SPECIFIED BY GRUAN
+9 9 SOLAR CORRECTED AS SPECIFIED BY GRUAN
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20136.table b/definitions/bufr/tables/0/wmo/27/codetables/20136.table
new file mode 100644
index 0000000..0369f5d
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20136.table
@@ -0,0 +1,44 @@
+0 0 ISOLATED CUMULUS HUMILIS AND/OR CUMULUS MEDIOCRIS OF VERTICAL DEVELOPMENT
+1 1 NUMEROUS CUMULUS HUMILIS AND/OR CUMULUS MEDIOCRIS OF VERTICAL DEVELOPMENT
+2 2 ISOLATED CUMULUS CONGESTUS OF VERTICAL DEVELOPMENT
+3 3 NUMEROUS CUMULUS CONGESTUS OF VERTICAL DEVELOPMENT
+4 4 ISOLATED CUMULONIMBUS OF VERTICAL DEVELOPMENT
+5 5 NUMEROUS CUMULONIMBUS OF VERTICAL DEVELOPMENT
+6 6 ISOLATED CUMULUS AND CUMULONIMBUS OF VERTICAL DEVELOPMENT
+7 7 NUMEROUS CUMULUS AND CUMULONIMBUS OF VERTICAL DEVELOPMENT
+10 10 RESERVED
+11 11 ISOLATED OROGRAPHIC CLOUDS, PILEUS, INCUS, FORMING
+12 12 ISOLATED OROGRAPHIC CLOUDS, PILEUS, INCUS, NOT CHANGING
+13 13 ISOLATED OROGRAPHIC CLOUDS, PILEUS, INCUS, DISSOLVING
+14 14 IRREGULAR BANKS OF OROGRAPHIC CLOUD, FöHN BANK, ETC., FORMING
+15 15 IRREGULAR BANKS OF OROGRAPHIC CLOUD, FöHN BANK, ETC., NOT CHANGING
+16 16 IRREGULAR BANKS OF OROGRAPHIC CLOUD, FöHN BANK, ETC., DISSOLVING
+17 17 COMPACT LAYER OF OROGRAPHIC CLOUD, FöHN BANK, ETC., FORMING
+18 18 COMPACT LAYER OF OROGRAPHIC CLOUD, FöHN BANK, ETC., NOT CHANGING
+19 19 COMPACT LAYER OF OROGRAPHIC CLOUD, FöHN BANK, ETC., DISSOLVING
+20 20 ALL MOUNTAINS OPEN, ONLY SMALL AMOUNTS OF CLOUD PRESENT
+21 21 MOUNTAINS PARTLY COVERED WITH DETACHED CLOUDS (NOT MORE THAN HALF THE PEAKS CAN BE SEEN)
+22 22 ALL MOUNTAIN SLOPES COVERED, PEAKS AND PASSES FREE
+23 23 MOUNTAINS OPEN ON OBSERVER’S SIDE (ONLY SMALL AMOUNTS OF CLOUD PRESENT), BUT A CONTINUOUS WALL OF CLOUD ON THE OTHER SIDE
+24 24 CLOUDS LOW ABOVE THE MOUNTAINS, BUT ALL SLOPES AND MOUNTAINS OPEN (ONLY SMALL AMOUNTS OF CLOUD ON THE SLOPES)
+25 25 CLOUDS LOW ABOVE THE MOUNTAINS, PEAKS PARTLY COVERED BY PRECIPITATION TRAILS OR CLOUDS
+26 26 ALL PEAKS COVERED BUT PASSES OPEN, SLOPES EITHER OPEN OR COVERED
+27 27 MOUNTAINS GENERALLY COVERED BUT SOME PEAKS FREE, SLOPES WHOLLY OR PARTIALLY COVERED
+28 28 ALL PEAKS, PASSES AND SLOPES COVERED
+29 29 MOUNTAINS CANNOT BE SEEN OWING TO DARKNESS, FOG, SNOWSTORM, PRECIPITATION, ETC.
+35 35 NON-PERSISTENT CONDENSATION TRAILS
+36 36 PERSISTENT CONDENSATION TRAILS COVERING LESS THAN 1/8 OF THE SKY
+37 37 PERSISTENT CONDENSATION TRAILS COVERING 1/8 OF THE SKY
+38 38 PERSISTENT CONDENSATION TRAILS COVERING 2/8 OF THE SKY
+39 39 PERSISTENT CONDENSATION TRAILS COVERING 3/8 OR MORE OF THE SKY
+40 40 NO CLOUD OR MIST OBSERVED FROM A HIGHER LEVEL
+41 41 MIST, CLEAR ABOVE OBSERVED FROM A HIGHER LEVEL
+42 42 FOG PATCHES OBSERVED FROM A HIGHER LEVEL
+43 43 LAYER OF SLIGHT FOG OBSERVED FROM A HIGHER LEVEL
+44 44 LAYER OF THICK FOG OBSERVED FROM A HIGHER LEVEL
+45 45 SOME ISOLATED CLOUDS OBSERVED FROM A HIGHER LEVEL
+46 46 ISOLATED CLOUDS AND FOG BELOW OBSERVED FROM A HIGHER LEVEL
+47 47 MANY ISOLATED CLOUDS OBSERVED FROM A HIGHER LEVEL
+48 48 SEA OF CLOUDS OBSERVED FROM A HIGHER LEVEL
+49 49 BAD VISIBILITY OBSCURING THE DOWNWARD VIEW OBSERVED FROM A HIGHER LEVEL
+511 511 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20137.table b/definitions/bufr/tables/0/wmo/27/codetables/20137.table
new file mode 100644
index 0000000..adda880
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20137.table
@@ -0,0 +1,11 @@
+0 0 NO CHANGE
+1 1 CUMULIFICATION
+2 2 SLOW ELEVATION
+3 3 RAPID ELEVATION
+4 4 ELEVATION AND STRATIFICATION
+5 5 SLOW LOWERING
+6 6 RAPID LOWERING
+7 7 STRATIFICATION
+8 8 STRATIFICATION AND LOWERING
+9 9 RAPID CHANGE
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/20138.table b/definitions/bufr/tables/0/wmo/27/codetables/20138.table
new file mode 100644
index 0000000..ed9b315
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/20138.table
@@ -0,0 +1,9 @@
+0 0  DRY
+1 1  MOIST
+2 2  WET
+3 3  RIME
+4 4  SNOW
+5 5  ICE
+6 6  GLAZE
+7 7  NOT DRY
+15 15  MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2014.table b/definitions/bufr/tables/0/wmo/27/codetables/2014.table
new file mode 100644
index 0000000..bc5c5fc
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2014.table
@@ -0,0 +1,51 @@
+0 0 NO WIND FINDING
+1 1 AUTOMATIC WITH AUXILIARY OPTICAL DIRECTION FINDING
+2 2 AUTOMATIC WITH AUXILIARY RADIO DIRECTION FINDING
+3 3 AUTOMATIC WITH AUXILIARY RANGING
+4 4 NOT USED
+5 5 AUTOMATIC WITH MULTIPLE VLF-OMEGA SIGNALS
+6 6 AUTOMATIC CROSS CHAIN LORAN-C
+7 7 AUTOMATIC WITH AUXILIARY WIND PROFILER
+8 8 AUTOMATIC SATELLITE NAVIGATION
+19 19 TRACKING TECHNIQUE NOT SPECIFIED
+20 20 VESSEL STOPPED
+21 21 VESSEL DIVERTED FROM ORIGINAL DESTINATION
+22 22 VESSEL'S ARRIVAL DELAYED
+23 23 CONTAINER DAMAGED
+24 24 POWER FAILURE TO CONTAINER
+29 29 OTHER PROBLEMS
+30 30 MAJOR POWER PROBLEMS
+31 31 UPS INOPERATIVE
+32 32 RECEIVER HARDWARE PROBLEMS
+33 33 RECEIVER SOFTWARE PROBLEMS
+34 34 PROCESSOR HARDWARE PROBLEMS
+35 35 PROCESSOR SOFTWARE PROBLEMS
+36 36 NAVAID SYSTEM DAMAGED
+37 37 SHORTAGE OF LIFTING GAS
+38 38 RESERVED
+39 39 OTHER PROBLEMS
+40 40 MECHANICAL DEFECT
+41 41 MATERIAL DEFECT (HAND LAUNCHER)
+42 42 POWER FAILURE
+43 43 CONTROL FAILURE
+44 44 PNEUMATIC/HYDRAULIC FAILURE
+45 45 OTHER PROBLEMS
+46 46 COMPRESSOR PROBLEMS
+47 47 BALLOON PROBLEMS
+48 48 BALLOON RELEASE PROBLEMS
+49 49 LAUNCHER DAMAGED
+50 50 R/S RECEIVER ANTENNA DEFECT
+51 51 NAVAID ANTENNA DEFECT
+52 52 R/S RECEIVER CABLING (ANTENNA) DEFECT
+53 53 NAVAID ANTENNA CABLING DEFECT
+59 59 OTHER PROBLEMS
+60 60 ASAP COMMUNICATIONS DEFECT
+61 61 COMMUNICATIONS FACILITY REJECTED DATA
+62 62 NO POWER AT TRANSMITTING ANTENNA
+63 63 ANTENNA CABLE BROKEN
+64 64 ANTENNA CABLE DEFECT
+65 65 MESSAGE TRANSMITTED POWER BELOW NORMAL
+69 69 OTHER PROBLEMS
+70 70 ALL SYSTEMS IN NORMAL OPERATION
+99 99 STATUS OF SYSTEM AND ITS COMPONENTS NOT SPECIFIED
+127 127 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2015.table b/definitions/bufr/tables/0/wmo/27/codetables/2015.table
new file mode 100644
index 0000000..7b0ccaf
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2015.table
@@ -0,0 +1,7 @@
+0 0 RESERVED
+1 1 PRESSURE ONLY RADIOSONDE
+2 2 PRESSURE ONLY RADIOSONDE PLUS TRANSPONDER
+3 3 PRESSURE ONLY RADIOSONDE PLUS RADAR REFLECTOR
+4 4 NO-PRESSURE RADIOSONDE PLUS TRANSPONDER
+5 5 NO-PRESSURE RADIOSONDE PLUS RADAR REFLECTOR
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2016.table b/definitions/bufr/tables/0/wmo/27/codetables/2016.table
new file mode 100644
index 0000000..4a30226
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2016.table
@@ -0,0 +1,4 @@
+1 1 TRAIN REGULATOR
+2 2 LIGHT UNIT
+3 3 PARACHUTE
+4 4 ROOFTOP RELEASE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2017.table b/definitions/bufr/tables/0/wmo/27/codetables/2017.table
new file mode 100644
index 0000000..7fac2e1
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2017.table
@@ -0,0 +1,6 @@
+0 0 NO CORRECTIONS
+1 1 TIME LAG CORRECTION PROVIDED BY THE MANUFACTURER
+2 2 SOLAR RADIATION CORRECTION PROVIDED BY THE MANUFACTURER
+3 3 SOLAR RADIATION AND TIME LAG CORRECTION PROVIDED BY THE MANUFACTURER
+7 7 GRUAN SOLAR RADIATION AND TIME LAG CORRECTION
+31 31 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2019.table b/definitions/bufr/tables/0/wmo/27/codetables/2019.table
new file mode 100644
index 0000000..8e7586d
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2019.table
@@ -0,0 +1,331 @@
+10 10 AATSR
+11 11 ATSR
+12 12 ATSR-2
+13 13 MWR
+30 30 ARGOS
+40 40 LASER REFLECTORS
+41 41 DORIS
+42 42 DORIS-NG
+47 47 POSEIDON-1 (SSALT1)
+48 48 POSEIDON-2 (SSALT2)
+49 49 POSEIDON-3 (SSALT3)
+50 50 ATSR/M
+51 51 HRG
+52 52 HRV
+53 53 HRVIR
+54 54 SCARAB/MV2
+55 55 POLDER
+56 56 IIR
+60 60 VEGETATION
+61 61 WINDII
+62 62 ALTIKA
+80 80 RADARSAT DTT
+81 81 RADARSAT TTC
+85 85 SAR (CSA)
+90 90 MOPITT
+91 91 OSIRIS
+92 92 ACE-FTS
+97 97 PANCHROMATIC IMAGER
+98 98 GPS RECEIVER
+102 102 CHAMP GPS SOUNDER
+103 103 IGOR
+116 116 CHAMP GRAVITY PACKAGE (ACCELEROMETER+GPS)
+117 117 CHAMP MAGNETOMETRY PACKAGE (1 SCALAR+2 VECTOR MAGNETOMETER)
+120 120 ENVISAT COMMS
+121 121 ERS COMMS
+130 130 ALADIN
+131 131 ATLID
+140 140 AMI/SAR/IMAGE
+141 141 AMI/SAR/WAVE
+142 142 AMI/SCATTEROMETER
+143 143 ASAR
+144 144 ASAR
+145 145 ASAR
+146 146 CPR
+147 147 RA-2/MWR
+148 148 RA/MWR
+150 150 SCATTEROMETER
+151 151 SAR-C
+152 152 SW
+161 161 MIPAS
+162 162 MWR-2
+163 163 SOPRANO
+170 170 GOME
+172 172 GOMOS
+174 174 MERIS
+175 175 SCIAMACHY
+176 176 MIRAS
+177 177 SIRAL
+178 178 SRAL
+179 179 OLCI
+180 180 SLSTR
+181 181 METEOSAT COMMS
+182 182 MSG COMMS
+190 190 ASCAT
+200 200 GERB
+202 202 GRAS
+203 203 MHS
+205 205 MVIRI
+207 207 SEVIRI
+208 208 VIRI
+220 220 GOME-2
+221 221 IASI
+240 240 DCP
+245 245 CCD
+246 246 HSB
+248 248 OBA
+250 250 WFI
+255 255 IRMSS
+260 260 BSS & FSS TRANSPONDERS
+261 261 DRT-S&R
+262 262 INSAT COMMS
+268 268 HR-PAN
+269 269 MSMR
+270 270 VHRR
+271 271 WIFS
+275 275 AWIFS
+276 276 LISS-I
+277 277 LISS-II
+278 278 LISS-III
+279 279 LISS-IV
+284 284 PAN
+285 285 MOS
+286 286 OCM
+287 287 ROSA
+288 288 SCAT
+290 290 MTSAT COMMS
+291 291 HIMAWARI COMMS
+294 294 JAMI
+295 295 IMAGER/MTSAT-2
+296 296 VISSR
+297 297 AHI
+300 300 GLAS
+301 301 LRA
+302 302 MBLA
+303 303 CALIOP
+309 309 CPR (CLOUDSAT)
+312 312 NSCAT
+313 313 SEAWINDS
+314 314 RAPIDSCAT
+330 330 ACRIM
+334 334 BUV
+336 336 ALI
+347 347 ASTER
+348 348 CERES-2
+351 351 GPSDR
+353 353 HIRDLS
+354 354 HRDI
+356 356 LIS
+358 358 PEM
+359 359 SEAWIFS
+360 360 SUSIM (UARS)
+363 363 SBUV/1
+365 365 TMI
+366 366 JMR
+367 367 AMR
+369 369 LIMS
+370 370 LRIR
+371 371 EPIC
+372 372 NISTAR
+373 373 PLASMA-MAG
+374 374 XPS
+375 375 VIRS
+376 376 POLDER II
+377 377 TIM
+379 379 WFC
+382 382 CLAES
+383 383 HALOE
+384 384 ISAMS
+385 385 MISR
+386 386 MLS
+387 387 MLS (EOS-AURA)
+389 389 MODIS
+393 393 HAIRS
+394 394 OMI
+395 395 ATMOSPHERIC CORRECTOR
+396 396 HYPERION
+399 399 SAGE I
+400 400 SAGE II
+401 401 SAGE III
+402 402 SAMS
+403 403 SAM-II
+404 404 IRIS
+405 405 GIFTS
+420 420 AIRS
+426 426 SOLSTICE
+430 430 TES
+431 431 TOMS
+432 432 OCO
+450 450 ADEOS COMMS
+451 451 DCS (JAXA)
+453 453 GMS COMMS
+454 454 JERS-1 COMMS
+460 460 RIS
+461 461 PR
+462 462 SAR
+470 470 PALSAR
+478 478 AMSR2
+479 479 AMSR-E
+480 480 PRISM (ALOS)
+481 481 AMSR
+482 482 AVNIR
+483 483 AVNIR-2
+484 484 GLI
+485 485 MESSR
+486 486 MSR
+487 487 OCTS
+488 488 OPS
+489 489 VISSR (GMS-5)
+490 490 VTIR
+510 510 ILAS-I
+511 511 ILAS-II
+512 512 IMG
+514 514 SEM
+515 515 SOFIS
+516 516 TANSO-FTS
+517 517 TANSO-CAI
+518 518 DPR
+519 519 GMI
+540 540 DCS (NOAA)
+541 541 GOES COMMS
+542 542 LANDSAT COMMS
+543 543 NOAA COMMS
+544 544 S&R (GOES)
+545 545 S&R (NOAA)
+546 546 WEFAX
+547 547 SEM (GOES)
+550 550 SSM
+551 551 SSJ/4
+552 552 SSIES-2
+553 553 SSB/X-2
+570 570 AMSU-A
+574 574 AMSU-B
+580 580 ATOVS (HIRS/3 + AMSU + AVHRR/3)
+590 590 AVHRR/2
+591 591 AVHRR/3
+592 592 AVHRR/4
+600 600 ERBE
+601 601 ETM+
+605 605 HIRS/2
+606 606 HIRS/3
+607 607 HIRS/4
+615 615 IMAGER
+616 616 VIIRS
+620 620 CRIRS/NP
+621 621 ATMS
+622 622 MSS
+623 623 MSU
+624 624 SBUV/2
+625 625 SBUV/3
+626 626 SOUNDER
+627 627 SSU
+628 628 TM
+629 629 TOVS (HIRS/2 + MSU + SSU)
+630 630 VAS
+631 631 SSZ
+645 645 SEM
+650 650 MVIRSR (10 CHANNEL)
+651 651 MVIRSR (3 CHANNEL)
+652 652 MVIRSR (5 CHANNEL)
+670 670 RLSBO
+680 680 MSU-EU
+681 681 MSU-UM
+682 682 RM-08
+683 683 SU-UMS
+684 684 SU-VR
+685 685 TRASSER
+686 686 SCAT
+687 687 ALT
+688 688 MWI
+700 700 KONDOR-2
+701 701 BRK
+710 710 ALISSA
+712 712 BALKAN-2 LIDAR
+715 715 MK-4
+716 716 MK-4M
+730 730 GREBEN
+731 731 SAR-10
+732 732 SAR-3
+733 733 SAR-70
+740 740 SLR-3
+745 745 TRAVERS SAR
+750 750 174-K
+751 751 BTVK
+752 752 CHAIKA
+753 753 DELTA-2
+755 755 IKAR-D
+756 756 IKAR-N
+757 757 IKAR-P
+760 760 ISP
+761 761 KFA-1000
+762 762 KFA-200
+763 763 KFA-3000
+770 770 KLIMAT
+771 771 KLIMAT-2
+775 775 MIRAS
+776 776 MIVZA
+777 777 MIVZA-M
+780 780 MR-2000
+781 781 MR-2000M
+785 785 MR-900
+786 786 MR-900B
+790 790 MSU-E
+791 791 MSU-E1
+792 792 MSU-E2
+793 793 MSU-M
+794 794 MSU-S
+795 795 MSU-SK
+796 796 MSU-V
+810 810 MTZA
+815 815 MZOAS
+820 820 R-225
+821 821 R-400
+822 822 R-600
+830 830 RMS
+835 835 TV CAMERA
+836 836 SILVA
+840 840 SROSMO
+850 850 BUFS-2
+851 851 BUFS-4
+855 855 ISTOK-1
+856 856 SFM-2
+857 857 DOPI
+858 858 KGI-4
+859 859 OZON-M
+860 860 RMK-2
+900 900 MAXIE
+901 901 OLS
+905 905 SSM/I
+906 906 SSM/T-1
+907 907 SSM/T-2
+908 908 SSMIS
+910 910 SXI
+930 930 EHIC
+931 931 X-RAY ASTRONOMY PAYLOAD
+932 932 IVISSR (FY-2)
+933 933 IRAS
+934 934 MWAS
+935 935 IMWAS
+936 936 MWHS
+937 937 MVIRS
+938 938 MWRI
+940 940 MTVZA-OK
+941 941 SAPHIR
+942 942 MADRAS
+944 944 ALT
+945 945 TSIS
+946 946 CMIS
+947 947 OMPS
+948 948 GPSOS
+949 949 SESS
+950 950 VIRR
+951 951 TOM
+952 952 OP
+953 953 MWHS-2
+954 954 MWTS-2
+955 955 HIRAS
+956 956 SBUS
+957 957 TOU
+958 958 GNOS
+959 959 SMR
+2047 2047 
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2020.table b/definitions/bufr/tables/0/wmo/27/codetables/2020.table
new file mode 100644
index 0000000..fc19e6d
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2020.table
@@ -0,0 +1,31 @@
+0 0 NIMBUS
+1 1 VTPR
+2 2 TIROS 1 (TIROS, NOAA-6 TO NOAA-13)
+3 3 TIROS 2 (NOAA-14 ONWARDS)
+10 10 EOS
+20 20 GPM-CORE
+31 31 DMSP
+61 61 EUMETSAT POLAR SYSTEM (EPS)
+91 91 ERS
+92 92 SENTINEL-3
+121 121 ADEOS
+122 122 GCOM
+241 241 GOES
+261 261 JASON
+271 271 GMS
+272 272 MTSAT
+273 273 HIMAWARI
+281 281 COMS
+301 301 INSAT
+331 331 METEOSAT OPERATIONAL PROGRAMME (MOP)
+332 332 METEOSAT TRANSITIONAL PROGRAMME (MTP)
+333 333 METEOSAT SECOND GENERATION PROGRAMME (MSG)
+351 351 GOMS
+380 380 FY-1
+381 381 FY-2
+382 382 FY-3
+401 401 GPS
+402 402 GLONASS
+403 403 GALILEO
+404 404 BDS (BEIDOU NAVIGATION SATELLITE SYSTEM)
+511 511 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2021.table b/definitions/bufr/tables/0/wmo/27/codetables/2021.table
new file mode 100644
index 0000000..b95fdc9
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2021.table
@@ -0,0 +1,8 @@
+1 1 HIGH-RESOLUTION INFRARED SOUNDER (HIRS)
+2 2 MICROWAVE SOUNDING UNIT (MSU)
+3 3 STRATOSPHERIC SOUNDING UNIT (SSU)
+4 4 AMI (ADVANCED MICROWAVE INSTRUMENT) WIND MODE
+5 5 AMI (ADVANCED MICROWAVE INSTRUMENT) WAVE MODE
+6 6 AMI (ADVANCED MICROWAVE INSTRUMENT) IMAGE MODE
+7 7 RADAR ALTIMETER
+8 8 ATSR (ALONG-TRACK SCANNING RADIOMETER)
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2022.table b/definitions/bufr/tables/0/wmo/27/codetables/2022.table
new file mode 100644
index 0000000..5068e7f
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2022.table
@@ -0,0 +1,5 @@
+1 1 PROCESSING TECHNIQUE NOT DEFINED
+2 2 AUTOMATED STATISTICAL REGRESSION
+3 3 CLEAR PATH
+4 4 PARTLY CLOUDY PATH
+5 5 CLOUDY PATH
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2023.table b/definitions/bufr/tables/0/wmo/27/codetables/2023.table
new file mode 100644
index 0000000..be7eb84
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2023.table
@@ -0,0 +1,11 @@
+0 0 RESERVED
+1 1 WIND DERIVED FROM CLOUD MOTION OBSERVED IN THE INFRARED CHANNEL
+2 2 WIND DERIVED FROM CLOUD MOTION OBSERVED IN THE VISIBLE CHANNEL
+3 3 WIND DERIVED FROM CLOUD MOTION OBSERVED IN THE WATER VAPOUR CHANNEL
+4 4 WIND DERIVED FROM MOTION OBSERVED IN A COMBINATION OF SPECTRAL CHANNELS
+5 5 WIND DERIVED FROM MOTION OBSERVED IN THE WATER VAPOUR CHANNEL IN CLEAR AIR
+6 6 WIND DERIVED FROM MOTION OBSERVED IN THE OZONE CHANNEL
+7 7 WIND DERIVED FROM MOTION OBSERVED IN WATER VAPOUR CHANNEL (CLOUD OR CLEAR AIR NOT SPECIFIED)
+13 13 ROOT-MEAN-SQUARE
+14 14 RESERVED
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2024.table b/definitions/bufr/tables/0/wmo/27/codetables/2024.table
new file mode 100644
index 0000000..00ec80e
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2024.table
@@ -0,0 +1,4 @@
+0 0 RESERVED
+1 1 TABLE WITH FULL RANGE OF HUMIDITY VARIATION IN LAYER
+2 2 REGRESSION TECHNIQUE ON 2 HUMIDITY VALUES IN LAYER
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2025.table b/definitions/bufr/tables/0/wmo/27/codetables/2025.table
new file mode 100644
index 0000000..64dc018
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2025.table
@@ -0,0 +1,16 @@
+1 1 RESERVED
+2 2 HIRS
+3 3 MSU
+6 6 HIRS
+7 7 MSU
+10 10 HIRS (1, 2, 3, 8, 9, 16, 17)
+11 11 HIRS (1, 2, 3, 9, 17)
+12 12 MSU
+15 15 HIRS
+16 16 HIRS
+17 17 MSU
+18 18 SKINTK (OCEAN ONLY)
+21 21 HIRS
+22 22 SSU
+23 23 MSU (3, 4)
+24 24 RESERVED
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2030.table b/definitions/bufr/tables/0/wmo/27/codetables/2030.table
new file mode 100644
index 0000000..2777bbc
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2030.table
@@ -0,0 +1,8 @@
+0 0 RESERVED
+1 1 ADCP (ACOUSTIC DOPPLER CURRENT PROFILER)
+2 2 GEK (GEOMAGNETIC ELECTROKINETOGRAPH)
+3 3 SHIP'S SET AND DRIFT DETERMINED BY FIXES 3-6 HOURS APART
+4 4 SHIP'S SET AND DRIFT DETERMINED BY FIXES MORE THAN 6 HOURS BUT LESS THAN 12 HOURS APART
+5 5 DRIFT OF BUOY
+6 6 ADCP (ACOUSTIC DOPPLER CURRENT PROFILER)
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2031.table b/definitions/bufr/tables/0/wmo/27/codetables/2031.table
new file mode 100644
index 0000000..a96b857
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2031.table
@@ -0,0 +1,21 @@
+0 0 RESERVED
+1 1 INSTANTANEOUS
+2 2 AVERAGED OVER 3 MINUTES OR LESS
+3 3 AVERAGED OVER MORE THAN 3 MINUTES, BUT 6 AT THE MOST
+4 4 AVERAGED OVER MORE THAN 6 MINUTES, BUT 12 AT THE MOST
+5 5 INSTANTANEOUS
+6 6 AVERAGED OVER 3 MINUTES OR LESS
+7 7 AVERAGED OVER MORE THAN 3 MINUTES, BUT 6 AT THE MOST
+8 8 AVERAGED OVER MORE THAN 6 MINUTES, BUT 12 AT THE MOST
+9 9 VECTOR OR DOPPLER CURRENT PROFILING METHOD NOT USED
+10 10 RESERVED
+11 11 1 HOUR OR LESS
+12 12 MORE THAN 1 HOUR BUT 2 AT THE MOST
+13 13 MORE THAN 2 HOURS BUT 4 AT THE MOST
+14 14 MORE THAN 4 HOURS BUT 8 AT THE MOST
+15 15 MORE THAN 8 HOURS BUT 12 AT THE MOST
+16 16 MORE THAN 12 HOURS BUT 18 AT THE MOST
+17 17 MORE THAN 18 HOURS BUT 24 AT THE MOST
+18 18 RESERVED
+19 19 DRIFT METHOD NOT USED
+31 31 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2032.table b/definitions/bufr/tables/0/wmo/27/codetables/2032.table
new file mode 100644
index 0000000..7e9310d
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2032.table
@@ -0,0 +1,4 @@
+0 0 VALUES AT SELECTED DEPTHS (DATA POINTS FIXED BY THE INSTRUMENT OR SELECTED BY ANY OTHER METHOD)
+1 1 VALUES AT SELECTED DEPTHS (DATA POINTS TAKEN FROM TRACES AT SIGNIFICANT DEPTHS)
+2 2 RESERVED
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2033.table b/definitions/bufr/tables/0/wmo/27/codetables/2033.table
new file mode 100644
index 0000000..8215be0
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2033.table
@@ -0,0 +1,5 @@
+0 0 NO SALINITY MEASURED
+1 1 IN SITU SENSOR, ACCURACY BETTER THAN 0.02 ‰
+2 2 IN SITU SENSOR, ACCURACY LESS THAN 0.02 ‰
+3 3 SAMPLE ANALYSIS
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2034.table b/definitions/bufr/tables/0/wmo/27/codetables/2034.table
new file mode 100644
index 0000000..06cdd52
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2034.table
@@ -0,0 +1,7 @@
+0 0 UNSPECIFIED DROGUE
+1 1 HOLEY SOCK
+2 2 TRISTAR
+3 3 WINDOW SHADE
+4 4 PARACHUTE
+5 5 NON-LAGRANGIAN SEA ANCHOR
+31 31 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2036.table b/definitions/bufr/tables/0/wmo/27/codetables/2036.table
new file mode 100644
index 0000000..7782d30
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2036.table
@@ -0,0 +1,4 @@
+0 0 DRIFTING BUOY
+1 1 FIXED BUOY
+2 2 SUBSURFACE FLOAT (MOVING)
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2037.table b/definitions/bufr/tables/0/wmo/27/codetables/2037.table
new file mode 100644
index 0000000..729c40e
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2037.table
@@ -0,0 +1,8 @@
+0 0 RESERVED
+1 1 MANUAL READING FROM VERTICAL TIDE STAFF
+2 2 MANUAL READING FROM SINGLE AUTOMATIC RECORDER AT STATION
+3 3 MANUAL READING FROM MULTIPLE AUTOMATIC RECORDERS AT STATION
+4 4 AUTOMATIC READING FROM SINGLE AUTOMATIC RECORDER AT STATION WITHOUT LEVEL REFERENCE CHECK
+5 5 AUTOMATIC READING FROM SINGLE AUTOMATIC RECORDER AT STATION WITH LEVEL REFERENCE CHECK, OR FROM MULTIPLE AUTOMATIC RECORDERS
+6 6 RESERVED
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2038.table b/definitions/bufr/tables/0/wmo/27/codetables/2038.table
new file mode 100644
index 0000000..458f141
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2038.table
@@ -0,0 +1,16 @@
+0 0 SHIP INTAKE
+1 1 BUCKET
+2 2 HULL CONTACT SENSOR
+3 3 REVERSING THERMOMETER
+4 4 STD/CTD SENSOR
+5 5 MECHANICAL BT
+6 6 EXPENDABLE BT
+7 7 DIGITAL BT
+8 8 THERMISTOR CHAIN
+9 9 INFRARED SCANNER
+10 10 MICROWAVE SCANNER
+11 11 INFRARED RADIOMETER
+12 12 IN-LINE THERMOSALINOGRAPH
+13 13 TOWED BODY
+14 14 OTHER
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2039.table b/definitions/bufr/tables/0/wmo/27/codetables/2039.table
new file mode 100644
index 0000000..0a94982
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2039.table
@@ -0,0 +1,5 @@
+0 0 MEASURED WET-BULB TEMPERATURE
+1 1 ICED BULB MEASURED WET-BULB TEMPERATURE
+2 2 COMPUTED WET-BULB TEMPERATURE
+3 3 ICED BULB COMPUTED WET-BULB TEMPERATURE
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2040.table b/definitions/bufr/tables/0/wmo/27/codetables/2040.table
new file mode 100644
index 0000000..78b2917
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2040.table
@@ -0,0 +1,8 @@
+0 0 SHIP'S MOTION REMOVED BY AVERAGING
+1 1 SHIP'S MOTION REMOVED BY MOTION COMPENSATION
+2 2 SHIP'S MOTION NOT REMOVED
+3 3 SHIP'S MOTION REMOVED BY AVERAGING
+4 4 SHIP'S MOTION REMOVED BY MOTION COMPENSATION
+5 5 SHIP'S MOTION NOT REMOVED
+6 6 DOPPLER CURRENT PROFILING METHOD NOT USED
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2041.table b/definitions/bufr/tables/0/wmo/27/codetables/2041.table
new file mode 100644
index 0000000..ef5bf86
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2041.table
@@ -0,0 +1,6 @@
+0 0 INFORMATION BASED ON MANUAL ANALYSIS
+1 1 INFORMATION BASED ON COMPUTER ANALYSIS
+2 2 INFORMATION BASED ON DATA ASSIMILATION
+3 3 INFORMATION BASED ON COMPUTER ANALYSIS OR DATA ASSIMILATION MANUALLY MODIFIED
+10 10 INFORMATION BASED ON THE NUMERICAL WEATHER PREDICTION
+63 63 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2042.table b/definitions/bufr/tables/0/wmo/27/codetables/2042.table
new file mode 100644
index 0000000..eb2445b
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2042.table
@@ -0,0 +1,4 @@
+0 0 VALUE ORIGINALLY REPORTED IN M/S
+1 1 VALUE ORIGINALLY REPORTED IN KNOTS
+2 2 NO SEA CURRENT DATA AVAILABLE
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2044.table b/definitions/bufr/tables/0/wmo/27/codetables/2044.table
new file mode 100644
index 0000000..0e10ed8
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2044.table
@@ -0,0 +1,6 @@
+0 0 RESERVED FOR FUTURE USE
+1 1 LONGUET-HIGGINS (1964)
+2 2 LONGUET-HIGGINS (F3 METHOD)
+3 3 MAXIMUM LIKELIHOOD METHOD
+4 4 MAXIMUM ENTROPY METHOD
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2045.table b/definitions/bufr/tables/0/wmo/27/codetables/2045.table
new file mode 100644
index 0000000..374e4f2
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2045.table
@@ -0,0 +1,5 @@
+0 0 SEA STATION
+1 1 AUTOMATIC DATA BUOY
+2 2 AIRCRAFT
+3 3 SATELLITE
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2046.table b/definitions/bufr/tables/0/wmo/27/codetables/2046.table
new file mode 100644
index 0000000..57fb9d6
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2046.table
@@ -0,0 +1,4 @@
+0 0 RESERVED FOR FUTURE USE
+1 1 HEAVE SENSOR
+2 2 SLOPE SENSOR
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2047.table b/definitions/bufr/tables/0/wmo/27/codetables/2047.table
new file mode 100644
index 0000000..8213931
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2047.table
@@ -0,0 +1,9 @@
+0 0 RESERVED
+1 1 DART II (PMEL)
+2 2 DART ETD
+3 3 SAIC TSUNAMI BUOY (STB)
+4 4 GFZ - POTSDAM
+5 5 INCOIS (INDIA)
+6 6 INABUOY (INDONESIA)
+7 7 ENVIRTECH
+127 127 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2048.table b/definitions/bufr/tables/0/wmo/27/codetables/2048.table
new file mode 100644
index 0000000..d7cb2ef
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2048.table
@@ -0,0 +1,14 @@
+0 0 HIRS
+1 1 MSU
+2 2 SSU
+3 3 AMSU-A
+4 4 AMSU-B
+5 5 AVHRR
+6 6 SSMI
+7 7 NSCAT
+8 8 SEAWINDS
+9 9 POSEIDON ALTIMETER
+10 10 JMR (JASON MICROWAVE RADIOMETER)
+11 11 MHS
+12 12 ASCAT
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2049.table b/definitions/bufr/tables/0/wmo/27/codetables/2049.table
new file mode 100644
index 0000000..ade5cac
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2049.table
@@ -0,0 +1,4 @@
+1 1 PROCESSING TECHNIQUE NOT DEFINED
+2 2 SIMULTANEOUS PHYSICAL RETRIEVAL
+3 3 CLEAR SOUNDING
+4 4 CLOUDY SOUNDING
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2050.table b/definitions/bufr/tables/0/wmo/27/codetables/2050.table
new file mode 100644
index 0000000..fbcce61
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2050.table
@@ -0,0 +1,19 @@
+1 1 1
+2 2 2
+3 3 3
+4 4 4
+5 5 5
+6 6 6
+7 7 7
+8 8 8
+9 9 9
+10 10 10
+11 11 11
+12 12 12
+13 13 13
+14 14 14
+15 15 15
+16 16 16
+17 17 17
+18 18 18
+19 19 19
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2051.table b/definitions/bufr/tables/0/wmo/27/codetables/2051.table
new file mode 100644
index 0000000..3524ae7
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2051.table
@@ -0,0 +1,5 @@
+0 0 RESERVED
+1 1 MAXIMUM/MINIMUM THERMOMETERS
+2 2 AUTOMATED INSTRUMENTS
+3 3 THERMOGRAPH
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2052.table b/definitions/bufr/tables/0/wmo/27/codetables/2052.table
new file mode 100644
index 0000000..8b6262c
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2052.table
@@ -0,0 +1,5 @@
+1 1 1
+2 2 2
+3 3 3
+4 4 4
+5 5 5
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2053.table b/definitions/bufr/tables/0/wmo/27/codetables/2053.table
new file mode 100644
index 0000000..03e5e29
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2053.table
@@ -0,0 +1,5 @@
+0 0 OBSERVED BRIGHTNESS TEMPERATURE
+1 1 BRIGHTNESS TEMPERATURE WITH BIAS CORRECTION APPLIED
+2 2 BRIGHTNESS TEMPERATURE CALCULATED FROM FIRST GUESS
+3 3 BRIGHTNESS TEMPERATURE CALCULATED FROM SOUNDING
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2054.table b/definitions/bufr/tables/0/wmo/27/codetables/2054.table
new file mode 100644
index 0000000..0995688
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2054.table
@@ -0,0 +1,6 @@
+0 0 PARAMETER DERIVED USING OBSERVED SOUNDER BRIGHTNESS TEMPERATURES
+1 1 PARAMETER DERIVED USING OBSERVED IMAGER BRIGHTNESS TEMPERATURES
+2 2 PARAMETER DERIVED USING FIRST GUESS INFORMATION
+3 3 PARAMETER DERIVED USING NMC ANALYSIS INFORMATION
+4 4 PARAMETER DERIVED USING RADIOSONDE INFORMATION
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2055.table b/definitions/bufr/tables/0/wmo/27/codetables/2055.table
new file mode 100644
index 0000000..ce06f00
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2055.table
@@ -0,0 +1,10 @@
+0 0 STATISTICS GENERATED COMPARING RETRIEVAL VERSUS RADIOSONDE
+1 1 STATISTICS GENERATED COMPARING RETRIEVAL VERSUS FIRST GUESS
+2 2 STATISTICS GENERATED COMPARING RADIOSONDE VERSUS FIRST GUESS
+3 3 STATISTICS GENERATED COMPARING OBSERVED VERSUS RETRIEVAL
+4 4 STATISTICS GENERATED COMPARING OBSERVED VERSUS FIRST GUESS
+5 5 STATISTICS GENERATED COMPARING RADIOSONDE VERSUS IMAGER
+6 6 STATISTICS GENERATED COMPARING RADIOSONDE VERSUS SOUNDER
+7 7 STATISTICS GENERATED FOR RADIOSONDE
+8 8 STATISTICS GENERATED FOR FIRST GUESS
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2056.table b/definitions/bufr/tables/0/wmo/27/codetables/2056.table
new file mode 100644
index 0000000..86eb983
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2056.table
@@ -0,0 +1,6 @@
+0 0 SUMS OF DIFFERENCES
+1 1 SUMS OF SQUARED DIFFERENCES
+2 2 SAMPLE SIZE
+3 3 MINIMUM DIFFERENCE
+4 4 MAXIMUM DIFFERENCE
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2057.table b/definitions/bufr/tables/0/wmo/27/codetables/2057.table
new file mode 100644
index 0000000..681e6bd
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2057.table
@@ -0,0 +1,7 @@
+0 0 NESTED GRID MODEL (NGM)
+1 1 AVIATION MODEL (AVN)
+2 2 MEDIUM RANGE FORECAST (MRF) MODEL
+3 3 GLOBAL DATA ASSIMILATION SYSTEM (GDAS) FORECAST MODEL
+4 4 PRIOR SOUNDINGS (WITHIN 3 HOURS OF CURRENT TIME)
+5 5 CLIMATOLOGY
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2058.table b/definitions/bufr/tables/0/wmo/27/codetables/2058.table
new file mode 100644
index 0000000..6c45eda
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2058.table
@@ -0,0 +1,5 @@
+0 0 12 HOUR AND 18 HOUR
+1 1 18 HOUR AND 24 HOUR
+2 2 6 HOUR AND 12 HOUR
+3 3 GREATER THAN 24 HOURS
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2059.table b/definitions/bufr/tables/0/wmo/27/codetables/2059.table
new file mode 100644
index 0000000..8f089d3
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2059.table
@@ -0,0 +1,5 @@
+0 0 NCEP NESTED GRID MODEL (NGM) ANALYSIS
+1 1 NCEP AVIATION MODEL (AVN) ANALYSIS
+2 2 NCEP MEDIUM RANGE FORECAST (MRF) MODEL ANALYSIS
+3 3 NCEP GLOBAL DATA ASSIMILATION SYSTEM (GDAS) FORECAST MODEL ANALYSIS
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2060.table b/definitions/bufr/tables/0/wmo/27/codetables/2060.table
new file mode 100644
index 0000000..6f84698
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2060.table
@@ -0,0 +1,7 @@
+0 0 CURRENT SURFACE HOURLY REPORTS
+1 1 CURRENT SHIP REPORTS
+2 2 CURRENT BUOY REPORTS
+3 3 ONE HOUR OLD SURFACE HOURLY REPORTS
+4 4 ONE HOUR OLD SHIP REPORTS
+5 5 ONE HOUR OLD BUOY REPORTS
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2061.table b/definitions/bufr/tables/0/wmo/27/codetables/2061.table
new file mode 100644
index 0000000..592d51e
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2061.table
@@ -0,0 +1,3 @@
+0 0 INERTIAL NAVIGATION SYSTEM
+1 1 OMEGA
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2062.table b/definitions/bufr/tables/0/wmo/27/codetables/2062.table
new file mode 100644
index 0000000..2d0f4e2
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2062.table
@@ -0,0 +1,7 @@
+0 0 ASDAR
+1 1 ASDAR (ACARS ALSO AVAILABLE BUT NOT OPERATIVE)
+2 2 ASDAR (ACARS ALSO AVAILABLE AND OPERATIVE)
+3 3 ACARS
+4 4 ACARS (ASDAR ALSO AVAILABLE BUT NOT OPERATIVE)
+5 5 ACARS (ASDAR ALSO AVAILABLE AND OPERATIVE)
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2064.table b/definitions/bufr/tables/0/wmo/27/codetables/2064.table
new file mode 100644
index 0000000..7414302
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2064.table
@@ -0,0 +1,4 @@
+0 0 GOOD
+1 1 BAD
+2 2 RESERVED
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2066.table b/definitions/bufr/tables/0/wmo/27/codetables/2066.table
new file mode 100644
index 0000000..a3865dc
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2066.table
@@ -0,0 +1,9 @@
+0 0 INTERMET IMS 2000
+1 1 INTERMET IMS 1500C
+2 2 SHANGHAI GTC1
+3 3 NANJING GTC2
+4 4 NANJING GFE(L)1
+5 5 MARL-A RADAR
+6 6 VEKTOR-M RADAR
+62 62 OTHER
+63 63 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2070.table b/definitions/bufr/tables/0/wmo/27/codetables/2070.table
new file mode 100644
index 0000000..5a098ea
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2070.table
@@ -0,0 +1,13 @@
+0 0 ACTUAL LOCATION IN SECONDS
+1 1 ACTUAL LOCATION IN MINUTES
+2 2 ACTUAL LOCATION IN DEGREES
+3 3 ACTUAL LOCATION IN DECIDEGREES
+4 4 ACTUAL LOCATION IN CENTIDEGREES
+5 5 REFERENCED TO CHECKPOINT IN SECONDS
+6 6 REFERENCED TO CHECKPOINT IN MINUTES
+7 7 REFERENCED TO CHECKPOINT IN DEGREES
+8 8 REFERENCED TO CHECKPOINT IN DECIDEGREES
+9 9 REFERENCED TO CHECKPOINT IN CENTIDEGREES
+10 10 ACTUAL LOCATION IN TENTHS OF A MINUTE
+11 11 REFERENCED TO CHECKPOINT IN TENTHS OF A MINUTE
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2080.table b/definitions/bufr/tables/0/wmo/27/codetables/2080.table
new file mode 100644
index 0000000..c68a39d
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2080.table
@@ -0,0 +1,7 @@
+0 0 KAYSAM
+1 1 TOTEX
+2 2 KKS
+3 3 GUANGZHOU SHUANGYI (CHINA)
+4 4 CHEMCHINA ZHUZHOU (CHINA)
+62 62 OTHER
+63 63 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2081.table b/definitions/bufr/tables/0/wmo/27/codetables/2081.table
new file mode 100644
index 0000000..dfe9551
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2081.table
@@ -0,0 +1,11 @@
+0 0 GP26
+1 1 GP28
+2 2 GP30
+3 3 HM26
+4 4 HM28
+5 5 HM30
+6 6 SV16
+7 7 TOTEX TA TYPE BALLOONS
+8 8 TOTEX TX TYPE BALLOONS
+30 30 OTHER
+31 31 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2083.table b/definitions/bufr/tables/0/wmo/27/codetables/2083.table
new file mode 100644
index 0000000..611c5bf
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2083.table
@@ -0,0 +1,7 @@
+0 0 HIGH BAY
+1 1 LOW BAY
+2 2 BALLOON-INFLATED LAUNCH SYSTEM (BILS)
+3 3 ROOF-TOP BILS
+4 4 AUTOMATED UNMANNED SOUNDING SYSTEM
+14 14 OTHER
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2084.table b/definitions/bufr/tables/0/wmo/27/codetables/2084.table
new file mode 100644
index 0000000..be6430a
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2084.table
@@ -0,0 +1,5 @@
+0 0 HYDROGEN
+1 1 HELIUM
+2 2 NATURAL GAS
+14 14 OTHER
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2095.table b/definitions/bufr/tables/0/wmo/27/codetables/2095.table
new file mode 100644
index 0000000..580fe93
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2095.table
@@ -0,0 +1,7 @@
+0 0 CAPACITANCE ANEROID
+1 1 DERIVED FROM GPS
+2 2 RESISTIVE STRAIN GAUGE
+3 3 SILICON CAPACITOR
+4 4 DERIVED FROM RADAR HEIGHT
+30 30 OTHER
+31 31 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2096.table b/definitions/bufr/tables/0/wmo/27/codetables/2096.table
new file mode 100644
index 0000000..9f1b102
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2096.table
@@ -0,0 +1,9 @@
+0 0 ROD THERMISTOR
+1 1 BEAD THERMISTOR
+2 2 CAPACITANCE BEAD
+3 3 CAPACITANCE WIRE
+4 4 RESISTIVE SENSOR
+5 5 CHIP THERMISTOR
+6 6 MERCURY
+7 7 ALCOHOL/GLYCOL
+31 31 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2097.table b/definitions/bufr/tables/0/wmo/27/codetables/2097.table
new file mode 100644
index 0000000..3f6b471
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2097.table
@@ -0,0 +1,26 @@
+0 0 VIZ MARK II CARBON HYGRISTOR
+1 1 VIZ B2 HYGRISTOR
+2 2 VAISALA A-HUMICAP
+3 3 VAISALA H-HUMICAP
+4 4 CAPACITANCE SENSOR
+5 5 VAISALA RS90
+6 6 SIPPICAN MARK IIA CARBON HYGRISTOR
+7 7 TWIN ALTERNATIVELY HEATED HUMICAP CAPACITANCE SENSOR
+8 8 HUMICAP CAPACITANCE SENSOR WITH ACTIVE DE-ICING METHOD
+9 9 CARBON HYGRISTOR
+10 10 PSYCHROMETER
+11 11 CAPACITIVE (POLYMER)
+12 12 CAPACITIVE (CERAMIC, INCL. METAL OXIDE)
+13 13 RESISTIVE (GENERIC)
+14 14 RESISTIVE (SALT POLYMER)
+15 15 RESISTIVE (CONDUCTIVE POLYMER)
+16 16 THERMAL CONDUCTIVITY
+17 17 GRAVIMETRIC
+18 18 PAPER-METAL COIL
+19 19 ORDINARY HUMAN HAIR
+20 20 ROLLED HAIR (TORSION)
+21 21 GOLDBEATER'S SKIN
+22 22 CHILLED MIRROR HYGROMETER
+23 23 DEW CELL
+24 24 OPTICAL ABSORPTION SENSOR
+31 31 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2099.table b/definitions/bufr/tables/0/wmo/27/codetables/2099.table
new file mode 100644
index 0000000..74cb817
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2099.table
@@ -0,0 +1,5 @@
+0 0 HH POLARIZATION
+1 1 VV POLARIZATION
+2 2 HV POLARIZATION REAL VALUED COMPONENT
+3 3 HV POLARIZATION IMAGINARY VALUED COMPONENT
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2101.table b/definitions/bufr/tables/0/wmo/27/codetables/2101.table
new file mode 100644
index 0000000..efdb3ec
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2101.table
@@ -0,0 +1,10 @@
+0 0 CENTRE FRONT-FED PARABOLOID
+1 1 OFFSET FRONT-FED PARABOLOID
+2 2 CENTRE CASSEGRAIN PARABOLOID
+3 3 OFFSET CASSEGRAIN PARABOLOID
+4 4 PLANAR ARRAY
+5 5 COAXIAL-COLLINEAR ARRAY
+6 6 YAGI ELEMENTS ARRAY
+7 7 MICROSTRIP
+14 14 OTHER
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2103.table b/definitions/bufr/tables/0/wmo/27/codetables/2103.table
new file mode 100644
index 0000000..417d2c9
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2103.table
@@ -0,0 +1 @@
+1 1 RADAR ANTENNA IS PROTECTED BY A RADOME
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2104.table b/definitions/bufr/tables/0/wmo/27/codetables/2104.table
new file mode 100644
index 0000000..e39a153
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2104.table
@@ -0,0 +1,9 @@
+0 0 HORIZONTAL POLARIZATION
+1 1 VERTICAL POLARIZATION
+2 2 RIGHT CIRCULAR POLARIZATION
+3 3 LEFT CIRCULAR POLARIZATION
+4 4 HORIZONTAL AND VERTICAL POLARIZATION
+5 5 RIGHT AND LEFT CIRCULAR POLARIZATION
+6 6 QUASI-HORIZONTAL POLARIZATION
+7 7 QUASI-VERTICAL POLARIZATION
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/21066.table b/definitions/bufr/tables/0/wmo/27/codetables/21066.table
new file mode 100644
index 0000000..9bcafea
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/21066.table
@@ -0,0 +1,11 @@
+1 1 PROCESSING EQUIPMENT NOT WORKING
+2 2 EQUIPMENT FAILED
+3 3 PRF CODE CHANGED DURING IMAGE GENERATION
+4 4 SAMPLING WINDOW CHANGED DURING IMAGE GENERATION
+5 5 GAIN CHANGED DURING IMAGE GENERATION
+6 6 CHIRP REPLICA EXCEEDS SPECIFIED VALUE
+7 7 INPUT DATA MEAN AND STANDARD DEVIATION OF IN-PHASE AND QUADRATURE OUT OF RANGE
+8 8 DOPPLER CENTROID CONFIDENCE > MMCC VALUE
+9 9 DOPPLER CENTROID ABSOLUTE VALUE > PRF/2
+10 10 DOPPLER AMBIGUITY CONFIDENCE < MMCC VALUE
+11 11 OUTPUT DATA MEAN AND STANDARD DEVIATION =< MMCC VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/21067.table b/definitions/bufr/tables/0/wmo/27/codetables/21067.table
new file mode 100644
index 0000000..a0ed399
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/21067.table
@@ -0,0 +1,12 @@
+1 1 NO FOREBEAM CALCULATION
+2 2 NO MIDBEAM CALCULATION
+3 3 NO AFTBEAM CALCULATION
+4 4 FOREBEAM ARCING DETECTED
+5 5 MIDBEAM ARCING DETECTED
+6 6 AFTBEAM ARCING DETECTED
+7 7 ANY BEAM NOISE CONTENT ABOVE OR EQUAL TO THRESHOLD
+8 8 LAND (ANY LAND IN CELL FOOTPRINT)
+9 9 AUTONOMOUS AMBIGUITY REMOVAL NOT USED
+10 10 METEOROLOGICAL BACKGROUND NOT USED
+11 11 MINIMUM RESIDUAL EXCEEDED THRESHOLD
+12 12 FRAME CHECKSUM ERROR DETECTED
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/21068.table b/definitions/bufr/tables/0/wmo/27/codetables/21068.table
new file mode 100644
index 0000000..102171f
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/21068.table
@@ -0,0 +1,7 @@
+1 1 STANDARD DEVIATION OF WIND SPEED OUTSIDE MMCC LIMIT
+2 2 STANDARD DEVIATION OF SIGNIFICANT WAVE HEIGHT OUTSIDE MMCC LIMIT
+3 3 STANDARD DEVIATION OF ALTITUDE OUTSIDE MMCC LIMIT
+4 4 MEAN PEAKINESS OUTSIDE MMCC LIMIT
+5 5 FRAME CHECKSUM ERROR DETECTED
+6 6 HEIGHT-TIME LOOP TIME CONSTANT CORRECTION NOT PERFORMED
+7 7 NOT ENOUGH MEASUREMENTS (N < 10)
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/21069.table b/definitions/bufr/tables/0/wmo/27/codetables/21069.table
new file mode 100644
index 0000000..320890a
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/21069.table
@@ -0,0 +1,9 @@
+1 1 12.0 µM CHANNEL PRESENT IN SOURCE DATA
+2 2 11.0 µM CHANNEL PRESENT IN SOURCE DATA
+3 3 3.7 µM CHANNEL PRESENT IN SOURCE DATA
+4 4 1.6 µM CHANNEL PRESENT IN SOURCE DATA
+5 5 CLOUD IDENTIFICATION USED 1.6 µM HISTOGRAM REFLECTANCE CLOUD TEST
+6 6 1.6 µM HISTOGRAM REFLECTANCE CLOUD TEST USED DYNAMIC THRESHOLD
+7 7 SUN GLINT DETECTED BY 1.6 µM REFLECTANCE CLOUD TEST
+8 8 3.7 µM CHANNEL USED IN SEA-SURFACE TEMPERATURE RETRIEVAL
+9 9 SEA-SURFACE TEMPERATURE DERIVATION USED DAYTIME DATA (NIGHT-TIME IF ZERO)
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/21070.table b/definitions/bufr/tables/0/wmo/27/codetables/21070.table
new file mode 100644
index 0000000..669655f
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/21070.table
@@ -0,0 +1,22 @@
+1 1 CELL 1: NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+2 2 CELL 2: NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+3 3 CELL 3: NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+4 4 CELL 4: NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+5 5 CELL 5: NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+6 6 CELL 6: NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+7 7 CELL 7: NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+8 8 CELL 8: NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+9 9 CELL 9: NADIR-ONLY VIEW SST USED 3.7 MICRON CHANNEL
+10 10 CELL 1: DUAL VIEW SST USED 3.7 MICRON CHANNEL
+11 11 CELL 2: DUAL VIEW SST USED 3.7 MICRON CHANNEL
+12 12 CELL 3: DUAL VIEW SST USED 3.7 MICRON CHANNEL
+13 13 CELL 4: DUAL VIEW SST USED 3.7 MICRON CHANNEL
+14 14 CELL 5: DUAL VIEW SST USED 3.7 MICRON CHANNEL
+15 15 CELL 6: DUAL VIEW SST USED 3.7 MICRON CHANNEL
+16 16 CELL 7: DUAL VIEW SST USED 3.7 MICRON CHANNEL
+17 17 CELL 8: DUAL VIEW SST USED 3.7 MICRON CHANNEL
+18 18 CELL 9: DUAL VIEW SST USED 3.7 MICRON CHANNEL
+19 19 NADIR VIEW CONTAINS DAY-TIME DATA (NIGHT IF ZERO)
+20 20 FORWARD VIEW CONTAINS DAY-TIME DATA (NIGHT IF ZERO)
+21 21 RECORD CONTAINS CONTRIBUTIONS FROM INSTRUMENT SCANS ACQUIRED WHEN ERS PLATFORM NOT IN YAW-STEERING MODE
+22 22 RECORD CONTAINS CONTRIBUTIONS FROM INSTRUMENT SCANS FOR WHICH PRODUCT CONFIDENCE DATA SHOW QUALITY IS POOR OR UNKNOWN
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/21072.table b/definitions/bufr/tables/0/wmo/27/codetables/21072.table
new file mode 100644
index 0000000..99e4b1c
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/21072.table
@@ -0,0 +1,3 @@
+1 1 HEIGHT ERROR CORRECTION APPLIED INSTEAD OF OPEN LOOP CALIBRATION
+2 2 MICROWAVE SOUNDER USED FOR TROPOSPHERE CORRECTION
+3 3 AGC OUTPUT CORRECTION APPLIED INSTEAD OF OPEN LOOP CALIBRATION
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/21073.table b/definitions/bufr/tables/0/wmo/27/codetables/21073.table
new file mode 100644
index 0000000..9538fa5
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/21073.table
@@ -0,0 +1,8 @@
+1 1 BLANK DATA RECORD
+2 2 TEST
+3 3 CALIBRATION (CLOSED LOOP)
+4 4 BITE
+5 5 ACQUISITION ON ICE
+6 6 ACQUISITION ON OCEAN
+7 7 TRACKING ON ICE
+8 8 TRACKING ON OCEAN
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/21076.table b/definitions/bufr/tables/0/wmo/27/codetables/21076.table
new file mode 100644
index 0000000..bc52ac5
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/21076.table
@@ -0,0 +1,4 @@
+0 0 LINEAR
+1 1 LOGARITHMIC (BASE E)
+2 2 LOGARITHMIC (BASE 10)
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/21109.table b/definitions/bufr/tables/0/wmo/27/codetables/21109.table
new file mode 100644
index 0000000..deb577a
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/21109.table
@@ -0,0 +1,7 @@
+1 1 NOT ENOUGH GOOD SIGMA-0 AVAILABLE FOR WIND RETRIEVAL
+2 2 POOR AZIMUTH DIVERSITY AMONG SIGMA-0 FOR WIND RETRIEVAL
+8 8 SOME PORTION OF WIND VECTOR CELL IS OVER LAND
+9 9 SOME PORTION OF WIND VECTOR CELL IS OVER ICE
+10 10 WIND RETRIEVAL NOT PERFORMED FOR WIND VECTOR CELL
+11 11 REPORTED WIND SPEED IS GREATER THAN 30 M S-1
+12 12 REPORTED WIND SPEED IS LESS THAN OR EQUAL TO 3 M S-1
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/21115.table b/definitions/bufr/tables/0/wmo/27/codetables/21115.table
new file mode 100644
index 0000000..9e90133
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/21115.table
@@ -0,0 +1,10 @@
+1 1 SIGMA-0 MEASUREMENT IS NOT USABLE
+2 2 SIGNAL TO NOISE RATIO IS LOW
+3 3 SIGMA-0 IS NEGATIVE
+4 4 SIGMA-0 IS OUTSIDE OF ACCEPTABLE RANGE
+5 5 SCATTEROMETER PULSE QUALITY IS NOT ACCEPTABLE
+6 6 SIGMA-0 CELL LOCATION ALGORITHM DOES NOT CONVERGE
+7 7 FREQUENCY SHIFT LIES BEYOND THE RANGE OF THE X FACTOR TABLE
+8 8 SPACECRAFT TEMPERATURE IS BEYOND CALIBRATION COEFFICIENT RANGE
+9 9 NO APPLICABLE ALTITUDE RECORDS WERE FOUND FOR THIS SIGMA-0
+10 10 INTERPOLATED EPHEMERIS DATA ARE NOT ACCEPTABLE FOR THIS SIGMA-0
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/21116.table b/definitions/bufr/tables/0/wmo/27/codetables/21116.table
new file mode 100644
index 0000000..10b5c53
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/21116.table
@@ -0,0 +1,16 @@
+1 1 CALIBRATION/MEASUREMENT PULSE FLAG (1)
+2 2 CALIBRATION/MEASUREMENT PULSE FLAG (2)
+3 3 OUTER ANTENNA BEAM
+4 4 SIGMA-0 CELL IS AFT OF SPACECRAFT
+5 5 CURRENT MODE (1)
+6 6 CURRENT MODE (2)
+7 7 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (1)
+8 8 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (2)
+9 9 EFFECTIVE GATE WIDTH - SLICE RESOLUTION (3)
+10 10 LOW RESOLUTION MODE - WHOLE PULSE DATA
+11 11 SCATTEROMETER ELECTRONIC SUBSYSTEM B
+12 12 ALTERNATE SPIN RATE - 19.8 RPM
+13 13 RECEIVER PROTECTION ON
+14 14 SLICES PER COMPOSITE FLAG (1)
+15 15 SLICES PER COMPOSITE FLAG (2)
+16 16 SLICES PER COMPOSITE FLAG (3)
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/21119.table b/definitions/bufr/tables/0/wmo/27/codetables/21119.table
new file mode 100644
index 0000000..e17e3c0
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/21119.table
@@ -0,0 +1,14 @@
+0 0 RESERVED
+1 1 SASS
+2 2 SASS2
+3 3 NSCAT0
+4 4 NSCAT1
+5 5 NSCAT2
+6 6 QSCAT0
+7 7 QSCAT1
+31 31 CMOD1
+32 32 CMOD2
+33 33 CMOD3
+34 34 CMOD4
+35 35 CMOD5
+63 63 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/21144.table b/definitions/bufr/tables/0/wmo/27/codetables/21144.table
new file mode 100644
index 0000000..1f082e6
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/21144.table
@@ -0,0 +1 @@
+1 1 RAIN
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/21148.table b/definitions/bufr/tables/0/wmo/27/codetables/21148.table
new file mode 100644
index 0000000..11413ed
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/21148.table
@@ -0,0 +1,2 @@
+1 1 NON SHORT SCALE VARIATION
+2 2 SHORT SCALE VARIATION
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2115.table b/definitions/bufr/tables/0/wmo/27/codetables/2115.table
new file mode 100644
index 0000000..c7e866c
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2115.table
@@ -0,0 +1,7 @@
+0 0 PDB
+1 1 RSOIS
+2 2 ASOS
+3 3 PSYCHROMETER
+4 4 F420
+30 30 OTHER
+31 31 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/21150.table b/definitions/bufr/tables/0/wmo/27/codetables/21150.table
new file mode 100644
index 0000000..8510046
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/21150.table
@@ -0,0 +1,4 @@
+0 0 DATA FROM SINGLE GROUND STATION (NO CO-LOCATION)
+1 1 DATA FROM MULTIPLE GROUND STATION (CO-LOCATED DATA)
+2 2 RESERVED
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/21155.table b/definitions/bufr/tables/0/wmo/27/codetables/21155.table
new file mode 100644
index 0000000..a7837cf
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/21155.table
@@ -0,0 +1,16 @@
+1 1 NOT ENOUGH GOOD SIGMA-0 AVAILABLE FOR WIND RETRIEVAL
+2 2 POOR AZIMUTH DIVERSITY AMONG SIGMA-0 FOR WIND RETRIEVAL
+3 3 ANY BEAM NOISE CONTENT ABOVE THRESHOLD
+4 4 PRODUCT MONITORING NOT USED
+5 5 PRODUCT MONITORING FLAG
+6 6 KNMI QUALITY CONTROL FAILS
+7 7 VARIATIONAL QUALITY CONTROL FAILS
+8 8 SOME PORTION OF WIND VECTOR CELL IS OVER LAND
+9 9 SOME PORTION OF WIND VECTOR CELL IS OVER ICE
+10 10 WIND RETRIEVAL NOT PERFORMED FOR WIND VECTOR CELL
+11 11 REPORTED WIND SPEED IS GREATER THAN 30 M/S
+12 12 REPORTED WIND SPEED IS LESS THAN OR EQUAL TO 3 M/S
+13 13 RAIN FLAG FOR THE WIND VECTOR CELL IS NOT USABLE
+14 14 RAIN FLAG ALGORITHM DETECTS RAIN
+15 15 NO METEOROLOGICAL BACKGROUND USED
+16 16 DATA ARE REDUNDANT
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/21158.table b/definitions/bufr/tables/0/wmo/27/codetables/21158.table
new file mode 100644
index 0000000..dd53c51
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/21158.table
@@ -0,0 +1,4 @@
+0 0 ACCEPTABLE
+1 1 NOT ACCEPTABLE
+2 2 RESERVED
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/21159.table b/definitions/bufr/tables/0/wmo/27/codetables/21159.table
new file mode 100644
index 0000000..1703f9b
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/21159.table
@@ -0,0 +1,4 @@
+0 0 GOOD
+1 1 USABLE
+2 2 BAD
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/21169.table b/definitions/bufr/tables/0/wmo/27/codetables/21169.table
new file mode 100644
index 0000000..9b93444
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/21169.table
@@ -0,0 +1,4 @@
+0 0 NO ICE PRESENT
+1 1 ICE PRESENT
+2 2 RESERVED
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2119.table b/definitions/bufr/tables/0/wmo/27/codetables/2119.table
new file mode 100644
index 0000000..0640af6
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2119.table
@@ -0,0 +1,8 @@
+0 0 INTERMEDIATE FREQUENCY CALIBRATION MODE (IF CAL)
+1 1 BUILT-IN TEST EQUIPMENT DIGITAL (BITE DGT)
+2 2 BUILT-IN TEST EQUIPMENT RADIO FREQUENCY (BITE RF)
+3 3 PRESET TRACKING (PSET TRK)
+4 4 PRESET LOOP OUT
+5 5 ACQUISITION
+6 6 TRACKING
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2131.table b/definitions/bufr/tables/0/wmo/27/codetables/2131.table
new file mode 100644
index 0000000..f4336ef
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2131.table
@@ -0,0 +1 @@
+1 1 STC OPERATIONAL
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2137.table b/definitions/bufr/tables/0/wmo/27/codetables/2137.table
new file mode 100644
index 0000000..40d33fd
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2137.table
@@ -0,0 +1,4 @@
+1 1 3:2
+2 2 4:3
+3 3 5:4
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2138.table b/definitions/bufr/tables/0/wmo/27/codetables/2138.table
new file mode 100644
index 0000000..a574506
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2138.table
@@ -0,0 +1,3 @@
+1 1 CLOCKWISE ROTATION
+2 2 COUNTERCLOCKWISE ROTATION
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2139.table b/definitions/bufr/tables/0/wmo/27/codetables/2139.table
new file mode 100644
index 0000000..f6cf802
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2139.table
@@ -0,0 +1,3 @@
+0 0 SIRAL NOMINAL
+1 1 SIRAL REDUNDANT
+2 2 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2143.table b/definitions/bufr/tables/0/wmo/27/codetables/2143.table
new file mode 100644
index 0000000..975d068
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2143.table
@@ -0,0 +1,21 @@
+0 0 RESERVED
+1 1 BREWER SPECTROPHOTOMETER
+2 2 CAVER TEICHERT
+3 3 DOBSON
+4 4 DOBSON (JAPAN)
+5 5 EHMET
+6 6 FECKER TELESCOPE
+7 7 HOELPER
+8 8 JODMETER
+9 9 FILTER OZONOMETER M-83
+10 10 MAST
+11 11 OXFORD
+12 12 PAETZOLD
+13 13 REGENER
+14 14 RESERVED FOR FUTURE USE
+15 15 VASSY FILTER OZONOMETER
+16 16 CARBON IODIDE
+17 17 SURFACE OZONE BUBBLER
+18 18 FILTER OZONOMETER M-124
+19 19 ECC SONDE
+127 127 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2144.table b/definitions/bufr/tables/0/wmo/27/codetables/2144.table
new file mode 100644
index 0000000..5b0f37b
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2144.table
@@ -0,0 +1,8 @@
+0 0 DIRECT SUN
+1 1 DIRECT SUN, ATTENUATOR #1
+2 2 DIRECT SUN, ATTENUATOR #2
+3 3 FOCUSED MOON
+4 4 FOCUSED SUN
+5 5 FOCUSED SUN CORRECTED WITH ADJACENT SKY MEASUREMENTS
+6 6 ZENITH SKY
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2145.table b/definitions/bufr/tables/0/wmo/27/codetables/2145.table
new file mode 100644
index 0000000..1944e69
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2145.table
@@ -0,0 +1,9 @@
+0 0 WAVELENGTHS AD ORDINARY SETTING
+1 1 WAVELENGTHS BD ORDINARY SETTING
+2 2 WAVELENGTHS CD ORDINARY SETTING
+3 3 WAVELENGTHS CC' ORDINARY SETTING
+4 4 WAVELENGTHS AD FOCUSED IMAGE
+5 5 WAVELENGTHS BD FOCUSED IMAGE
+6 6 WAVELENGTHS CD FOCUSED IMAGE
+7 7 WAVELENGTHS CC' FOCUSED IMAGE
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2146.table b/definitions/bufr/tables/0/wmo/27/codetables/2146.table
new file mode 100644
index 0000000..871b357
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2146.table
@@ -0,0 +1,11 @@
+0 0 ON DIRECT SUN
+1 1 ON DIRECT MOON
+2 2 ON BLUE ZENITH SKY
+3 3 ON ZENITH CLOUD (UNIFORM STRATIFIED LAYER OF SMALL OPACITY)
+4 4 ON ZENITH CLOUD (UNIFORM OR MODERATELY VARIABLE LAYER OF MEDIUM OPACITY)
+5 5 ON ZENITH CLOUD (UNIFORM OR MODERATELY VARIABLE LAYER OF LARGE OPACITY)
+6 6 ON ZENITH CLOUD (HIGHLY VARIABLE OPACITY, WITH OR WITHOUT PRECIPITATION)
+7 7 ON ZENITH CLOUD (FOG)
+8 8 ON ZENITH HAZE
+9 9 ON DIRECT SUN THROUGH THIN CLOUD, FOG OR HAZE
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2147.table b/definitions/bufr/tables/0/wmo/27/codetables/2147.table
new file mode 100644
index 0000000..4ff1c92
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2147.table
@@ -0,0 +1,11 @@
+0 0 RESERVED
+1 1 DIRECT LEASED CIRCUIT
+2 2 DIALLED UP CONNECTION
+3 3 INTERNET ISP
+4 4 DCP VIA SATELLITE (MTSAT, METEOSAT, ETC.)
+5 5 VSAT
+6 6 GAN,* BGAN**
+7 7 THISS TERMINAL
+8 8 IRIDIUM SATELLITES
+9 9 MOBILE TELEPHONY
+63 63 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2148.table b/definitions/bufr/tables/0/wmo/27/codetables/2148.table
new file mode 100644
index 0000000..7d8ca51
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2148.table
@@ -0,0 +1,12 @@
+0 0 RESERVED
+1 1 ARGOS
+2 2 GPS
+3 3 GOES DCP
+4 4 METEOSAT DCP
+5 5 ORBCOMM
+6 6 INMARSAT
+7 7 IRIDIUM
+8 8 IRIDIUM AND GPS
+9 9 ARGOS-3
+10 10 ARGOS-4
+31 31 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2149.table b/definitions/bufr/tables/0/wmo/27/codetables/2149.table
new file mode 100644
index 0000000..04638d2
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2149.table
@@ -0,0 +1,38 @@
+0 0 UNSPECIFIED DRIFTING BUOY
+1 1 STANDARD LAGRANGIAN DRIFTER (GLOBAL DRIFTER PROGRAMME)
+2 2 STANDARD FGGE TYPE DRIFTING BUOY (NON-LAGRANGIAN METEOROLOGICAL DRIFTING BUOY)
+3 3 WIND MEASURING FGGE TYPE DRIFTING BUOY (NON-LAGRANGIAN METEOROLOGICAL DRIFTING BUOY)
+4 4 ICE DRIFTER
+5 5 SVPG STANDARD LAGRANGIAN DRIFTER WITH GPS
+6 6 SVP-HR DRIFTER WITH HIGH-RESOLUTION TEMPERATURE OR THERMISTOR STRING
+7 7 RESERVED
+8 8 UNSPECIFIED SUBSURFACE FLOAT
+9 9 SOFAR
+10 10 ALACE
+11 11 MARVOR
+12 12 RAFOS
+13 13 PROVOR
+14 14 SOLO
+15 15 APEX
+16 16 UNSPECIFIED MOORED BUOY
+17 17 NOMAD
+18 18 3-METRE DISCUS
+19 19 10-12-METRE DISCUS
+20 20 ODAS 30 SERIES
+21 21 ATLAS (E.G. TAO AREA)
+22 22 TRITON BUOY
+23 23 FLEX MOORING (E.G. TIP AREA)
+24 24 OMNIDIRECTIONAL WAVERIDER
+25 25 DIRECTIONAL WAVERIDER
+26 26 SUBSURFACE ARGO FLOAT
+27 27 PALACE
+28 28 NEMO
+29 29 NINJA
+30 30 ICE BUOY/FLOAT (POPS OR ITP)
+34 34 MOORING OCEANOGRAPHIC
+35 35 MOORING METEOROLOGICAL
+36 36 MOORING MULTIDISCIPLINARY (OCEANSITES)
+37 37 MOORING TIDE GAUGE OR TSUNAMI BUOY
+38 38 ICE BEACON
+39 39 ICE MASS BALANCE BUOY
+63 63 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2150.table b/definitions/bufr/tables/0/wmo/27/codetables/2150.table
new file mode 100644
index 0000000..8193b57
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2150.table
@@ -0,0 +1,55 @@
+0 0 RESERVED
+1 1 HIRS 1
+2 2 HIRS 2
+3 3 HIRS 3
+4 4 HIRS 4
+5 5 HIRS 5
+6 6 HIRS 6
+7 7 HIRS 7
+8 8 HIRS 8
+9 9 HIRS 9
+10 10 HIRS 10
+11 11 HIRS 11
+12 12 HIRS 12
+13 13 HIRS 13
+14 14 HIRS 14
+15 15 HIRS 15
+16 16 HIRS 16
+17 17 HIRS 17
+18 18 HIRS 18
+19 19 HIRS 19
+20 20 HIRS 20
+21 21 MSU 1
+22 22 MSU 2
+23 23 MSU 3
+24 24 MSU 4
+25 25 SSU 1
+26 26 SSU 2
+27 27 SSU 3
+28 28 AMSU-A 1
+29 29 AMSU-A 2
+30 30 AMSU-A 3
+31 31 AMSU-A 4
+32 32 AMSU-A 5
+33 33 AMSU-A 6
+34 34 AMSU-A 7
+35 35 AMSU-A 8
+36 36 AMSU-A 9
+37 37 AMSU-A 10
+38 38 AMSU-A 11
+39 39 AMSU-A 12
+40 40 AMSU-A 13
+41 41 AMSU-A 14
+42 42 AMSU-A 15
+43 43 AMSU-B 1 / MHS 1
+44 44 AMSU-B 2 / MHS 2
+45 45 AMSU-B 3 / MHS 3
+46 46 AMSU-B 4 / MHS 4
+47 47 AMSU-B 5 / MHS 5
+48 48 AVHRR 1
+49 49 AVHRR 2
+50 50 AVHRR 3A
+51 51 AVHRR 3B
+52 52 AVHRR 4
+53 53 AVHRR 5
+63 63 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2151.table b/definitions/bufr/tables/0/wmo/27/codetables/2151.table
new file mode 100644
index 0000000..45c80df
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2151.table
@@ -0,0 +1,11 @@
+0 0 HIRS
+1 1 MSU
+2 2 SSU
+3 3 AMSU-A1-1
+4 4 AMSU-A1-2
+5 5 AMSU-A2
+6 6 AMSU-B
+7 7 AVHRR
+8 8 RESERVED
+9 9 MHS
+2047 2047 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2152.table b/definitions/bufr/tables/0/wmo/27/codetables/2152.table
new file mode 100644
index 0000000..880c384
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2152.table
@@ -0,0 +1,13 @@
+1 1 HIGH-RESOLUTION INFRARED SOUNDER (HIRS)
+2 2 MICROWAVE SOUNDING UNIT (MSU)
+3 3 STRATOSPHERIC SOUNDING UNIT (SSU)
+4 4 AMI WIND MODE
+5 5 AMI WAVE MODE
+6 6 AMI IMAGE MODE
+7 7 RADAR ALTIMETER
+8 8 ATSR
+9 9 GEOSTATIONARY IMAGER
+10 10 GEOSTATIONARY SOUNDER
+11 11 GEOSTATIONARY EARTH RADIATION (GERB)
+12 12 MULTI-CHANNEL SCANNING RADIOMETER
+13 13 POLAR-ORBITING IMAGER
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2158.table b/definitions/bufr/tables/0/wmo/27/codetables/2158.table
new file mode 100644
index 0000000..97c4449
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2158.table
@@ -0,0 +1,8 @@
+1 1 MISMATCH IN RED VEC HPA
+2 2 MISMATCH IN RED VEC RFSS
+3 3 PTR CALIBRATION BAND 320 MHZ (KU)
+4 4 PTR CALIBRATION BAND 80 MHZ (KU)
+5 5 PTR CALIBRATION BAND 20 MHZ (KU)
+6 6 PTR CALIBRATION BAND 160 MHZ (S)
+7 7 KU FLIGHT CALIBRATION PARAMETERS AVAILABLE
+8 8 S FLIGHT CALIBRATION PARAMETERS AVAILABLE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2159.table b/definitions/bufr/tables/0/wmo/27/codetables/2159.table
new file mode 100644
index 0000000..63cb87c
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2159.table
@@ -0,0 +1,7 @@
+1 1 TEMPERATURE INCONSISTENCY
+2 2 DATA IS MISSING
+3 3 REDUNDANCY CHANNEL
+4 4 POWER BUS PROTECTION
+5 5 OVERVOLTAGE/OVERLOAD PROTECTION
+6 6 RESERVED
+7 7 RESERVED
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2160.table b/definitions/bufr/tables/0/wmo/27/codetables/2160.table
new file mode 100644
index 0000000..fd7f372
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2160.table
@@ -0,0 +1,11 @@
+0 0 RESERVED
+1 1 10 TO LESS THAN 20 MM
+2 2 RESERVED
+3 3 20 TO LESS THAN 40 MM
+4 4 RESERVED
+5 5 40 TO LESS THAN 60 MM
+6 6 RESERVED
+7 7 60 TO LESS THAN 90 MM
+8 8 90 TO LESS THAN 110 MM
+9 9 110 MM AND GREATER
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2163.table b/definitions/bufr/tables/0/wmo/27/codetables/2163.table
new file mode 100644
index 0000000..8cac631
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2163.table
@@ -0,0 +1,16 @@
+0 0 AUTO EDITOR
+1 1 IRW HEIGHT ASSIGNMENT
+2 2 WV HEIGHT ASSIGNMENT
+3 3 H2O INTERCEPT HEIGHT ASSIGNMENT
+4 4 CO2 SLICING HEIGHT ASSIGNMENT
+5 5 LOW PIXEL MAX GRADIENT
+6 6 HIGHER PIXEL MAX GRADIENT
+7 7 PRIMARY HEIGHT ASSIGNMENT
+8 8 LAYER THICKNESS ASSIGNMENT
+9 9 CUMULATIVE CONTRIBUTION FUNCTION - 10 PER CENT HEIGHT
+10 10 CUMULATIVE CONTRIBUTION FUNCTION - 50 PER CENT HEIGHT
+11 11 CUMULATIVE CONTRIBUTION FUNCTION - 90 PER CENT HEIGHT
+12 12 CUMULATIVE CONTRIBUTION FUNCTION - HEIGHT OF MAXIMUM GRADIENT
+13 13 IR / TWO WV CHANNEL RATIOING METHOD
+14 14 COMPOSITE HEIGHT ASSIGNMENT
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2164.table b/definitions/bufr/tables/0/wmo/27/codetables/2164.table
new file mode 100644
index 0000000..01dc970
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2164.table
@@ -0,0 +1,4 @@
+0 0 LP - NORMS LEAST SQUARE MINIMUM
+1 1 EN - EUCLIDEAN NORM WITH RADIANCE CORRELATION
+2 2 CC - CROSS CORRELATION
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2165.table b/definitions/bufr/tables/0/wmo/27/codetables/2165.table
new file mode 100644
index 0000000..628be0e
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2165.table
@@ -0,0 +1,7 @@
+1 1 CLEAR PATH
+2 2 PARTLY CLOUDY PATH
+3 3 CLOUDY PATH
+4 4 APODIZED
+5 5 UNAPODIZED
+6 6 RECONSTRUCTED
+7 7 CLOUD CLEARED
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2166.table b/definitions/bufr/tables/0/wmo/27/codetables/2166.table
new file mode 100644
index 0000000..efac38f
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2166.table
@@ -0,0 +1,6 @@
+0 0 TYPE NOT DEFINED
+1 1 AUTOMATED STATISTICAL REGRESSION
+2 2 CLEAR PATH
+3 3 PARTLY CLOUDY PATH
+4 4 CLOUDY PATH
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2167.table b/definitions/bufr/tables/0/wmo/27/codetables/2167.table
new file mode 100644
index 0000000..acb2f9d
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2167.table
@@ -0,0 +1,4 @@
+0 0 METHOD NOT DEFINED
+1 1 1B RAW RADIANCE
+2 2 PROCESSED RADIANCE
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2169.table b/definitions/bufr/tables/0/wmo/27/codetables/2169.table
new file mode 100644
index 0000000..bd31667
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2169.table
@@ -0,0 +1,5 @@
+0 0 CUP ROTOR
+1 1 PROPELLER ROTOR
+2 2 WIND OBSERVATION THROUGH AMBIENT NOISE (WOTAN)
+3 3 SONIC
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2170.table b/definitions/bufr/tables/0/wmo/27/codetables/2170.table
new file mode 100644
index 0000000..05bab00
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2170.table
@@ -0,0 +1,5 @@
+0 0 SPECTRASENSORS WVSS-II, VERSION 1
+1 1 SPECTRASENSORS WVSS-II, VERSION 2
+2 2 SPECTRASENSORS WVSS-II, VERSION 3
+62 62 OTHER
+63 63 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2172.table b/definitions/bufr/tables/0/wmo/27/codetables/2172.table
new file mode 100644
index 0000000..3c3641a
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2172.table
@@ -0,0 +1,4 @@
+0 0 RESERVED
+1 1 RETRIEVAL FROM A NADIR SOUNDING
+2 2 RETRIEVAL FROM A LIMB SOUNDING
+255 255 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2175.table b/definitions/bufr/tables/0/wmo/27/codetables/2175.table
new file mode 100644
index 0000000..2cf2a3d
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2175.table
@@ -0,0 +1,9 @@
+0 0 MANUAL MEASUREMENT
+1 1 TIPPING BUCKET METHOD
+2 2 WEIGHING METHOD
+3 3 OPTICAL METHOD
+4 4 PRESSURE METHOD
+5 5 FLOAT METHOD
+6 6 DROP COUNTER METHOD
+14 14 OTHERS
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2176.table b/definitions/bufr/tables/0/wmo/27/codetables/2176.table
new file mode 100644
index 0000000..2c27a6f
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2176.table
@@ -0,0 +1,6 @@
+0 0 MANUAL OBSERVATION
+1 1 VIDEO CAMERA METHOD
+2 2 INFRARED METHOD
+3 3 LASER METHOD
+14 14 OTHERS
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2177.table b/definitions/bufr/tables/0/wmo/27/codetables/2177.table
new file mode 100644
index 0000000..e7bb67a
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2177.table
@@ -0,0 +1,6 @@
+0 0 MANUAL OBSERVATION
+1 1 ULTRASONIC METHOD
+2 2 VIDEO CAMERA METHOD
+3 3 LASER METHOD
+14 14 OTHERS
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2178.table b/definitions/bufr/tables/0/wmo/27/codetables/2178.table
new file mode 100644
index 0000000..f4f8b59
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2178.table
@@ -0,0 +1,5 @@
+0 0 MANUAL OBSERVATION
+1 1 OPTICAL METHOD
+2 2 CAPACITIVE METHOD
+14 14 OTHERS
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2179.table b/definitions/bufr/tables/0/wmo/27/codetables/2179.table
new file mode 100644
index 0000000..9e9ba18
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2179.table
@@ -0,0 +1,6 @@
+0 0 MANUAL OBSERVATION
+1 1 VAISALA ALGORITHM
+2 2 ASOS (FAA) ALGORITHM
+3 3 AWOS (CANADA) ALGORITHM
+14 14 OTHERS
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2180.table b/definitions/bufr/tables/0/wmo/27/codetables/2180.table
new file mode 100644
index 0000000..0b21b2c
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2180.table
@@ -0,0 +1,8 @@
+0 0 MANUAL OBSERVATION
+1 1 OPTICAL SCATTER SYSTEM COMBINED WITH PRECIPITATION OCCURRENCE SENSING SYSTEM
+2 2 FORWARD AND/OR BACKSCATTER SYSTEM OF VISIBLE LIGHT
+3 3 FORWARD AND/OR BACKSCATTER SYSTEM OF INFRARED LIGHT
+4 4 INFRARED LIGHT EMITTING DIODE (IRED) SYSTEM
+5 5 DOPPLER RADAR SYSTEM
+14 14 OTHERS
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2181.table b/definitions/bufr/tables/0/wmo/27/codetables/2181.table
new file mode 100644
index 0000000..5096dc4
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2181.table
@@ -0,0 +1,5 @@
+1 1 RAIN DETECTOR
+2 2 FREEZING RAIN SENSOR
+3 3 ICE DETECTION SENSOR
+4 4 HAIL AND ICE PELLET SENSOR
+20 20 OTHERS
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2182.table b/definitions/bufr/tables/0/wmo/27/codetables/2182.table
new file mode 100644
index 0000000..4ffab26
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2182.table
@@ -0,0 +1,7 @@
+0 0 MANUAL MEASUREMENT
+1 1 TRANSMISSOMETER SYSTEM (BASE > 25 M)
+2 2 TRANSMISSOMETER SYSTEM (BASE < 25 M)
+3 3 FORWARD SCATTER SYSTEM
+4 4 BACKSCATTER SYSTEM
+14 14 OTHERS
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2183.table b/definitions/bufr/tables/0/wmo/27/codetables/2183.table
new file mode 100644
index 0000000..a804ea1
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2183.table
@@ -0,0 +1,9 @@
+0 0 MANUAL OBSERVATION
+1 1 CEILOMETER SYSTEM
+2 2 INFRARED CAMERA SYSTEM
+3 3 MICROWAVE VISUAL CAMERA SYSTEM
+4 4 SKY IMAGER SYSTEM
+5 5 VIDEO TIME-LAPSED CAMERA SYSTEM
+6 6 MICROPULSE LIDAR (MPL) SYSTEM
+14 14 OTHERS
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2184.table b/definitions/bufr/tables/0/wmo/27/codetables/2184.table
new file mode 100644
index 0000000..cf5ee84
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2184.table
@@ -0,0 +1,9 @@
+0 0 MANUAL OBSERVATION
+1 1 LIGHTNING IMAGING SENSOR
+2 2 ELECTRICAL STORM IDENTIFICATION SENSOR
+3 3 MAGNETIC FINDER SENSOR
+4 4 LIGHTNING STRIKE SENSOR
+5 5 FLASH COUNTER
+6 6 ATDNET VLF WAVEFORM CORRELATED SENSOR
+14 14 OTHERS
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2185.table b/definitions/bufr/tables/0/wmo/27/codetables/2185.table
new file mode 100644
index 0000000..45b0810
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2185.table
@@ -0,0 +1,7 @@
+0 0 MANUAL MEASUREMENT
+1 1 BALANCED FLOATING METHOD
+2 2 PRESSURE METHOD
+3 3 ULTRASONIC METHOD
+4 4 HYDRAULIC METHOD
+14 14 OTHERS
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2186.table b/definitions/bufr/tables/0/wmo/27/codetables/2186.table
new file mode 100644
index 0000000..05e1a36
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2186.table
@@ -0,0 +1,23 @@
+1 1 PRECIPITATION-UNKNOWN TYPE
+2 2 LIQUID PRECIPITATION NOT FREEZING
+3 3 LIQUID FREEZING PRECIPITATION
+4 4 DRIZZLE
+5 5 RAIN
+6 6 SOLID PRECIPITATION
+7 7 SNOW
+8 8 SNOW GRAINS
+9 9 SNOW PELLETS
+10 10 ICE PELLETS
+11 11 ICE CRYSTALS
+12 12 DIAMOND DUST
+13 13 SMALL HAIL
+14 14 HAIL
+15 15 GLAZE
+16 16 RIME
+17 17 SOFT RIME
+18 18 HARD RIME
+19 19 CLEAR ICE
+20 20 WET SNOW
+21 21 HOAR FROST
+22 22 DEW
+23 23 WHITE DEW
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2187.table b/definitions/bufr/tables/0/wmo/27/codetables/2187.table
new file mode 100644
index 0000000..def3d2f
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2187.table
@@ -0,0 +1,11 @@
+1 1 DUST/SAND WHIRL
+2 2 SQUALLS
+3 3 SAND STORM
+4 4 DUST STORM
+5 5 LIGHTNING - CLOUD TO SURFACE
+6 6 LIGHTNING - CLOUD TO CLOUD
+7 7 LIGHTNING - DISTANT
+8 8 THUNDERSTORM
+9 9 FUNNEL CLOUD NOT TOUCHING SURFACE
+10 10 FUNNEL CLOUD TOUCHING SURFACE
+11 11 SPRAY
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2188.table b/definitions/bufr/tables/0/wmo/27/codetables/2188.table
new file mode 100644
index 0000000..bb8114c
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2188.table
@@ -0,0 +1,10 @@
+1 1 FOG
+2 2 ICE FOG
+3 3 STEAM FOG
+7 7 MIST
+8 8 HAZE
+9 9 SMOKE
+10 10 VOLCANIC ASH
+11 11 DUST
+12 12 SAND
+13 13 SNOW
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2189.table b/definitions/bufr/tables/0/wmo/27/codetables/2189.table
new file mode 100644
index 0000000..61ac9e3
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2189.table
@@ -0,0 +1,4 @@
+1 1 MANUAL OBSERVATION
+2 2 ALL LIGHTNING STRIKES WITHOUT DISCRIMINATION
+3 3 LIGHTNING STRIKES CLOUD TO GROUND ONLY
+4 4 ALL LIGHTNING STRIKES WITH DISCRIMINATION BETWEEN CLOUD TO GROUND AND CLOUD TO CLOUD
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/2191.table b/definitions/bufr/tables/0/wmo/27/codetables/2191.table
new file mode 100644
index 0000000..2e96256
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/2191.table
@@ -0,0 +1,4 @@
+0 0 GEOPOTENTIAL HEIGHT CALCULATED FROM PRESSURE
+1 1 GEOPOTENTIAL HEIGHT CALCULATED FROM GPS HEIGHT
+2 2 GEOPOTENTIAL HEIGHT CALCULATED FROM RADAR HEIGHT
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/22056.table b/definitions/bufr/tables/0/wmo/27/codetables/22056.table
new file mode 100644
index 0000000..28ddbf4
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/22056.table
@@ -0,0 +1,4 @@
+0 0 UPWARDS PROFILE
+1 1 DOWNWARDS PROFILE
+2 2 HORIZONTAL
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/22060.table b/definitions/bufr/tables/0/wmo/27/codetables/22060.table
new file mode 100644
index 0000000..b73ad32
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/22060.table
@@ -0,0 +1,4 @@
+0 0 DROGUE IS DETACHED
+1 1 DROGUE IS ATTACHED
+2 2 DROGUE STATUS UNKNOWN
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/22061.table b/definitions/bufr/tables/0/wmo/27/codetables/22061.table
new file mode 100644
index 0000000..aa8c62b
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/22061.table
@@ -0,0 +1,11 @@
+0 0 CALM (GLASSY)
+1 1 CALM (RIPPLED)
+2 2 SMOOTH (WAVELETS)
+3 3 SLIGHT
+4 4 MODERATE
+5 5 ROUGH
+6 6 VERY ROUGH
+7 7 HIGH
+8 8 VERY HIGH
+9 9 PHENOMENAL
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/22067.table b/definitions/bufr/tables/0/wmo/27/codetables/22067.table
new file mode 100644
index 0000000..621b7a4
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/22067.table
@@ -0,0 +1,101 @@
+1 1 SIPPICAN T-4
+2 2 SIPPICAN T-4
+11 11 SIPPICAN T-5
+21 21 SIPPICAN FAST DEEP
+31 31 SIPPICAN T-6
+32 32 SIPPICAN T-6
+41 41 SIPPICAN T-7
+42 42 SIPPICAN T-7
+51 51 SIPPICAN DEEP BLUE
+52 52 SIPPICAN DEEP BLUE
+61 61 SIPPICAN T-10
+71 71 SIPPICAN T-11
+81 81 SIPPICAN AXBT (300 M PROBES)
+201 201 TSK T-4
+202 202 TSK T-4
+211 211 TSK T-6
+212 212 TSK T-6
+221 221 TSK T-7
+222 222 TSK T-7
+231 231 TSK T-5
+241 241 TSK T-10
+251 251 TSK DEEP BLUE
+252 252 TSK DEEP BLUE
+261 261 TSK AXBT
+401 401 SPARTON XBT-1
+411 411 SPARTON XBT-3
+421 421 SPARTON XBT-4
+431 431 SPARTON XBT-5
+441 441 SPARTON XBT-5DB
+451 451 SPARTON XBT-6
+461 461 SPARTON XBT-7
+462 462 SPARTON XBT-7
+471 471 SPARTON XBT-7DB
+481 481 SPARTON XBT-10
+491 491 SPARTON XBT-20
+501 501 SPARTON XBT-20DB
+510 510 SPARTON 536 AXBT
+700 700 SIPPICAN XCTD STANDARD
+710 710 SIPPICAN XCTD DEEP
+720 720 SIPPICAN AXCTD
+730 730 SIPPICAN SXCTD
+741 741 TSK XCTD/XCTD-1
+742 742 TSK XCTD-2
+743 743 TSK XCTD-2F
+744 744 TSK XCTD-3
+745 745 TSK XCTD-4
+751 751 TSK AXCTD
+780 780 SEA-BIRD SBE21 SEACAT THERMOSALINOGRAPH
+781 781 SEA-BIRD SBE45 MICROTSG THERMOSALINOGRAPH
+800 800 MECHANICAL BT
+810 810 HYDROCAST
+820 820 THERMISTOR CHAIN
+825 825 TEMPERATURE (SONIC) AND PRESSURE PROBES
+830 830 CTD
+831 831 CTD-P-ALACE FLOAT
+837 837 ARVOR_C, SBE CONDUCTIVITY SENSOR
+838 838 ARVOR_D, SBE CONDUCTIVITY SENSOR
+839 839 PROVOR–II, SBE CONDUCTIVITY SENSOR
+840 840 PROVOR, NO CONDUCTIVITY SENSOR
+841 841 PROVOR, SEA-BIRD CONDUCTIVITY SENSOR
+842 842 PROVOR, FSI CONDUCTIVITY SENSOR
+843 843 POLAR OCEAN PROFILING SYSTEM (POPS), PROVOR, SBE CTD
+844 844 PROFILING FLOAT, ARVOR, SEA-BIRD CONDUCTIVITY SENSOR
+845 845 WEBB RESEARCH, NO CONDUCTIVITY SENSOR
+846 846 WEBB RESEARCH, SEA-BIRD CONDUCTIVITY SENSOR
+847 847 WEBB RESEARCH, FSI CONDUCTIVITY SENSOR
+848 848 APEX–EM, SBE CONDUCTIVITY SENSOR
+849 849 APEX_D, SBE CONDUCTIVITY SENSOR
+850 850 SOLO, NO CONDUCTIVITY SENSOR
+851 851 SOLO, SEA-BIRD CONDUCTIVITY SENSOR
+852 852 SOLO, FSI CONDUCTIVITY SENSOR
+853 853 PROFILING FLOAT, SOLO2 (SCRIPPS), SEA-BIRD CONDUCTIVITY SENSOR
+854 854 S2A, SBE CONDUCTIVITY SENSOR
+855 855 PROFILING FLOAT, NINJA, NO CONDUCTIVITY SENSOR
+856 856 PROFILING FLOAT, NINJA, SBE CONDUCTIVITY SENSOR
+857 857 PROFILING FLOAT, NINJA, FSI CONDUCTIVITY SENSOR
+858 858 PROFILING FLOAT, NINJA, TSK CONDUCTIVITY SENSOR
+859 859 PROFILING FLOAT, NEMO, NO CONDUCTIVITY SENSOR
+860 860 PROFILING FLOAT, NEMO, SBE CONDUCTIVITY SENSOR
+861 861 PROFILING FLOAT, NEMO, FSI CONDUCTIVITY SENSOR
+862 862 SOLO_D, SBE CONDUCTIVITY SENSOR
+863 863 NAVIS–A, SBE CONDUCTIVITY SENSOR
+864 864 NINJA_D, SBE CONDUCTIVITY SENSOR
+865 865 NOVA, SBE CONDUCTIVITY SENSOR
+866 866 ALAMO, NO CONDUCTIVITY SENSOR
+867 867 ALAMO, RBR CONDUCTIVITY SENSOR
+868 868 ALAMO, SBE CONDUCTIVITY SENSOR
+900 900 SIPPICAN LMP-5 XBT
+901 901 ICE-TETHERED PROFILER (ITP), SBE CTD
+902 902 BROOKE OCEAN MOVING VESSEL PROFILER (MVP)
+903 903 SEA-BIRD CTD
+904 904 AML OCEANOGRAPHIC CTD
+905 905 FALMOUTH SCIENTIFIC CTD
+906 906 OCEAN SENSORS CTD
+907 907 VALEPORT CTD
+908 908 OCEANSCIENCE MVP
+909 909 IDRONAUT CTD
+910 910 SEA-BIRD SBE 38
+995 995 INSTRUMENT ATTACHED TO MARINE MAMMALS
+996 996 INSTRUMENT ATTACHED TO ANIMALS OTHER THAN MARINE MAMMALS
+1023 1023 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/22068.table b/definitions/bufr/tables/0/wmo/27/codetables/22068.table
new file mode 100644
index 0000000..f6ddeb2
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/22068.table
@@ -0,0 +1,43 @@
+1 1 SIPPICAN STRIP CHART RECORDER
+2 2 SIPPICAN MK2A/SSQ-61
+3 3 SIPPICAN MK-9
+4 4 SIPPICAN AN/BHQ-7/MK8
+5 5 SIPPICAN MK-12
+6 6 SIPPICAN MK-21
+7 7 SIPPICAN MK-8 LINEAR RECORDER
+8 8 SIPPICAN MK-10
+10 10 SPARTON SOC BT/SV PROCESSOR MODEL 100
+11 11 LOCKHEED-SANDERS MODEL OL5005
+20 20 ARGOS XBT-ST
+21 21 CLS-ARGOS/PROTECNO XBT-ST MODEL-1
+22 22 CLS-ARGOS/PROTECNO XBT-ST MODEL-2
+30 30 BATHY SYSTEMS SA-810
+31 31 SCRIPPS METROBYTE CONTROLLER
+32 32 MURAYAMA DENKI Z-60-16 III
+33 33 MURAYAMA DENKI Z-60-16 II
+34 34 PROTECNO ETSM2
+35 35 NAUTILUS MARINE SERVICE NMS-XBT
+40 40 TSK MK-2A
+41 41 TSK MK-2S
+42 42 TSK MK-30
+43 43 TSK MK-30N
+45 45 TSK MK-100
+46 46 TSK MK-130 COMPATIBLE RECORDER FOR BOTH XBT AND XCTD
+47 47 TSK MK-130A XCTD RECORDER
+48 48 TSK AXBT RECEIVER MK-300
+49 49 TSK MK-150/MK-150N COMPATIBLE RECORDER FOR BOTH XBT AND XCTD
+50 50 JMA ASTOS
+60 60 ARGOS COMMUNICATIONS, SAMPLING ON UP TRANSIT
+61 61 ARGOS COMMUNICATIONS, SAMPLING ON DOWN TRANSIT
+62 62 ORBCOMM COMMUNICATIONS, SAMPLING ON UP TRANSIT
+63 63 ORBCOMM COMMUNICATIONS, SAMPLING ON DOWN TRANSIT
+64 64 IRIDIUM COMMUNICATIONS, SAMPLING ON UP TRANSIT
+65 65 IRIDIUM COMMUNICATIONS, SAMPLING ON DOWN TRANSIT
+70 70 CSIRO DEVIL-1 XBT ACQUISITION SYSTEM
+71 71 CSIRO DEVIL-2 XBT ACQUISITION SYSTEM
+72 72 TURO/CSIRO QUOLL XBT ACQUISITION SYSTEM
+80 80 APPLIED MICROSYSTEMS LTD., MICRO-SVT&P
+81 81 SEA MAMMAL RESEARCH UNIT, UNIV. ST. ANDREWS, UK, UNCORRECTED SALINITY FROM A SEA MAMMAL MOUNTED INSTRUMENT
+82 82 SEA MAMMAL RESEARCH UNIT, UNIV. ST. ANDREWS, UK, CORRECTED SALINITY FROM A SEA MAMMAL MOUNTED INSTRUMENT
+99 99 UNKNOWN
+127 127 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/22120.table b/definitions/bufr/tables/0/wmo/27/codetables/22120.table
new file mode 100644
index 0000000..8c747ce
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/22120.table
@@ -0,0 +1,13 @@
+0 0 GOOD DATA
+1 1 MAXIMUM (HIGH) WATER LEVEL LIMIT EXCEEDED
+2 2 MINIMUM (LOW) WATER LEVEL LIMIT EXCEEDED
+3 3 RATE OF CHANGE LIMIT FOR WATER LEVEL EXCEEDED
+4 4 FLAT LIMIT FOR WATER LEVEL EXCEEDED
+5 5 OBSERVED MINUS PREDICTED WATER LEVEL VALUE LIMIT EXCEEDED
+6 6 OBSERVED VALUE FROM PRIMARY WATER LEVEL SENSOR MINUS BACKUP WATER LEVEL SENSOR
+7 7 VALUE EXCEEDED SPECIFIED TOLERANCE FROM EXPECTED VALUE
+8 8 WATER LEVEL QA PARAMETER (SIGMAS AND/OR OUTLIERS) LIMITS EXCEEDED
+9 9 SEA TEMPERATURE OUTSIDE OF EXPECTED RANGE
+10 10 MULTIPLE QC CHECKS (ABOVE) FAILED
+11 11 NO AUTOMATED WATER LEVEL CHECKS PERFORMED
+31 31 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/22121.table b/definitions/bufr/tables/0/wmo/27/codetables/22121.table
new file mode 100644
index 0000000..7d4dfa8
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/22121.table
@@ -0,0 +1,9 @@
+0 0 OPERATIONAL
+1 1 POSSIBLE CLOGGING PROBLEM OR OTHERWISE DEGRADED WATER LEVEL DATA
+2 2 POSSIBLE DATUM SHIFT
+3 3 UNKNOWN STATUS OF WATER LEVEL SENSOR
+4 4 SUSPECTED OR KNOWN SEA TEMPERATURE SENSOR PROBLEM
+5 5 MULTIPLE POSSIBLE PROBLEMS (ABOVE)
+6 6 BAD DATA - DO NOT DISSEMINATE!
+7 7 NO MANUAL WATER LEVEL CHECKS PERFORMED
+31 31 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/22122.table b/definitions/bufr/tables/0/wmo/27/codetables/22122.table
new file mode 100644
index 0000000..aa9d5eb
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/22122.table
@@ -0,0 +1,8 @@
+0 0 GOOD DATA FROM ALL SENSORS
+1 1 WIND DIRECTION OUTSIDE OF ALLOWABLE RANGE
+2 2 WIND SPEED OUTSIDE OF EXPECTED RANGE
+3 3 BAROMETRIC PRESSURE OUTSIDE OF EXPECTED RANGE
+4 4 AIR TEMPERATURE OUTSIDE OF EXPECTED RANGE
+5 5 MULTIPLE SENSORS FAILED QC CHECKS
+6 6 NO AUTOMATED METEOROLOGICAL DATA CHECKS PERFORMED
+31 31 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/22123.table b/definitions/bufr/tables/0/wmo/27/codetables/22123.table
new file mode 100644
index 0000000..acfb616
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/22123.table
@@ -0,0 +1,9 @@
+0 0 OPERATIONAL
+1 1 SUSPECTED OR KNOWN PROBLEM WITH WIND SENSOR
+2 2 SUSPECTED OR KNOWN PROBLEM WITH BAROMETRIC PRESSURE SENSOR
+3 3 SUSPECTED OR KNOWN PROBLEM WITH AIR TEMPERATURE SENSOR
+4 4 UNKNOWN STATUS OF ALL SENSORS
+5 5 SUSPECTED OR KNOWN PROBLEMS WITH MULTIPLE SENSORS
+6 6 BAD DATA - DO NOT DISSEMINATE!
+7 7 NO MANUAL METEOROLOGICAL DATA CHECKS PERFORMED
+31 31 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/22178.table b/definitions/bufr/tables/0/wmo/27/codetables/22178.table
new file mode 100644
index 0000000..355848c
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/22178.table
@@ -0,0 +1,12 @@
+0 0 UNKNOWN
+1 1 LM-2A DECK-MOUNTED
+2 2 LM-3A HAND-HELD
+3 3 LM-4A THRU-HULL
+10 10 AL-12 TSK AUTOLAUNCHER (UP TO 12 PROBES)
+20 20 SIO XBT AUTOLAUNCHER (UP TO 6 PROBES)
+30 30 AOML XBT V6 AUTOLAUNCHER (UP TO 6 DEEP BLUE PROBES)
+31 31 AOML XBT V8.0 AUTOLAUNCHER (UP TO 8 DEEP BLUE PROBES)
+32 32 AOML XBT V8.1 AUTOLAUNCHER (UP TO 8 DEEP BLUE AND FAST DEEP PROBES)
+90 90 CSIRO DEVIL AUTOLAUNCHER
+100 100 MFSTEP AUTOLAUNCHER (MEDITERRANEAN)
+255 255 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/23001.table b/definitions/bufr/tables/0/wmo/27/codetables/23001.table
new file mode 100644
index 0000000..92ac5de
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/23001.table
@@ -0,0 +1,5 @@
+0 0 RESERVED
+1 1 ARTICLES 1 AND 2
+2 2 ARTICLE 3
+3 3 ARTICLE 5.2
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/23002.table b/definitions/bufr/tables/0/wmo/27/codetables/23002.table
new file mode 100644
index 0000000..12815c6
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/23002.table
@@ -0,0 +1,16 @@
+0 0 RESERVED
+1 1 NUCLEAR REACTOR ON GROUND
+2 2 NUCLEAR REACTOR AT SEA
+3 3 NUCLEAR REACTOR IN SPACE
+4 4 NUCLEAR FUEL FACILITY
+5 5 RADIOACTIVE WASTE MANAGEMENT FACILITY
+6 6 TRANSPORT OF NUCLEAR FUEL OR RADIOACTIVE WASTE
+7 7 STORAGE OF NUCLEAR FUEL OR RADIOACTIVE WASTE
+8 8 MANUFACTURE OF RADIO-ISOTOPES
+9 9 USE OF RADIO-ISOTOPES
+10 10 STORAGE OF RADIO-ISOTOPES
+11 11 DISPOSAL OF RADIO-ISOTOPES
+12 12 TRANSPORT OF RADIO-ISOTOPES
+13 13 USE OF RADIO-ISOTOPES FOR POWER GENERATION
+30 30 OTHER
+31 31 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/23003.table b/definitions/bufr/tables/0/wmo/27/codetables/23003.table
new file mode 100644
index 0000000..e3e891f
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/23003.table
@@ -0,0 +1,8 @@
+0 0 NO RELEASE
+1 1 RELEASE TO ATMOSPHERE
+2 2 RELEASE TO WATER
+3 3 RELEASE TO BOTH ATMOSPHERE AND WATER
+4 4 EXPECTED RELEASE TO ATMOSPHERE
+5 5 EXPECTED RELEASE TO WATER
+6 6 EXPECTED RELEASE TO BOTH ATMOSPHERE AND WATER
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/23004.table b/definitions/bufr/tables/0/wmo/27/codetables/23004.table
new file mode 100644
index 0000000..383731c
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/23004.table
@@ -0,0 +1,6 @@
+0 0 NO COUNTERMEASURES
+1 1 EVACUATION
+2 2 SHELTERING
+3 3 PROPHYLAXIS
+4 4 WATER
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/23005.table b/definitions/bufr/tables/0/wmo/27/codetables/23005.table
new file mode 100644
index 0000000..c5ff5ae
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/23005.table
@@ -0,0 +1,4 @@
+0 0 INCIDENT STATE DOES NOT UNDERSTAND WHAT HAPPENED
+1 1 INCIDENT STATE KNOWS THE CAUSE OF THE INCIDENT
+2 2 RESERVED
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/23006.table b/definitions/bufr/tables/0/wmo/27/codetables/23006.table
new file mode 100644
index 0000000..fe7706a
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/23006.table
@@ -0,0 +1,8 @@
+0 0 NO IMPROVEMENT
+1 1 UNSTABLE
+2 2 NO DETERIORATION
+3 3 IMPROVING
+4 4 STABLE
+5 5 DETERIORATING
+6 6 RESERVED
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/23007.table b/definitions/bufr/tables/0/wmo/27/codetables/23007.table
new file mode 100644
index 0000000..59fc043
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/23007.table
@@ -0,0 +1,5 @@
+0 0 NO RELEASE
+1 1 RELEASE HAS STOPPED
+2 2 RELEASE
+3 3 RELEASE IS CONTINUING
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/23008.table b/definitions/bufr/tables/0/wmo/27/codetables/23008.table
new file mode 100644
index 0000000..4ac5c58
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/23008.table
@@ -0,0 +1,4 @@
+0 0 GASEOUS
+1 1 PARTICULATE
+2 2 MIXTURE OF GASEOUS AND PARTICULATE
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/23009.table b/definitions/bufr/tables/0/wmo/27/codetables/23009.table
new file mode 100644
index 0000000..4ac5c58
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/23009.table
@@ -0,0 +1,4 @@
+0 0 GASEOUS
+1 1 PARTICULATE
+2 2 MIXTURE OF GASEOUS AND PARTICULATE
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/23016.table b/definitions/bufr/tables/0/wmo/27/codetables/23016.table
new file mode 100644
index 0000000..ae84bae
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/23016.table
@@ -0,0 +1,4 @@
+0 0 NO SIGNIFICANT CHEMICAL TOXIC HEALTH EFFECT
+1 1 SIGNIFICANT CHEMICAL TOXIC HEALTH EFFECT POSSIBLE
+2 2 RESERVED
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/23018.table b/definitions/bufr/tables/0/wmo/27/codetables/23018.table
new file mode 100644
index 0000000..ccdcc45
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/23018.table
@@ -0,0 +1,6 @@
+0 0 RELEASE NO LONGER OCCURRING
+1 1 RELEASE STILL OCCURRING
+2 2 RELEASE EXPECTED TO INCREASE IN NEXT SIX HOURS
+3 3 RELEASE EXPECTED TO REMAIN CONSTANT IN NEXT SIX HOURS
+4 4 RELEASE EXPECTED TO DECREASE IN NEXT SIX HOURS
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/23031.table b/definitions/bufr/tables/0/wmo/27/codetables/23031.table
new file mode 100644
index 0000000..cf20e26
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/23031.table
@@ -0,0 +1,4 @@
+0 0 PLUME WILL NOT ENCOUNTER RAIN IN INCIDENT STATE
+1 1 PLUME WILL ENCOUNTER RAIN IN INCIDENT STATE
+2 2 RESERVED
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/23032.table b/definitions/bufr/tables/0/wmo/27/codetables/23032.table
new file mode 100644
index 0000000..0f439b7
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/23032.table
@@ -0,0 +1,4 @@
+0 0 NO SIGNIFICANT CHANGE EXPECTED WITHIN THE NEXT SIX HOURS
+1 1 ANTICIPATED SIGNIFICANT CHANGE EXPECTED WITHIN THE NEXT SIX HOURS
+2 2 RESERVED
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/24003.table b/definitions/bufr/tables/0/wmo/27/codetables/24003.table
new file mode 100644
index 0000000..2daa810
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/24003.table
@@ -0,0 +1,5 @@
+0 0 NOBLE GASES
+1 1 IODINES
+2 2 CAESIUMS
+3 3 TRANSURANICS
+31 31 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25004.table b/definitions/bufr/tables/0/wmo/27/codetables/25004.table
new file mode 100644
index 0000000..dfe4517
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25004.table
@@ -0,0 +1,4 @@
+0 0 INCOHERENT
+1 1 COHERENT (DOPPLER)
+2 2 RESERVED
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25005.table b/definitions/bufr/tables/0/wmo/27/codetables/25005.table
new file mode 100644
index 0000000..bc693a7
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25005.table
@@ -0,0 +1,4 @@
+0 0 LOGARITHM - 2.5 DB
+1 1 LINEAR
+2 2 SPECIAL
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25006.table b/definitions/bufr/tables/0/wmo/27/codetables/25006.table
new file mode 100644
index 0000000..bf9d1f5
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25006.table
@@ -0,0 +1,5 @@
+0 0 ZH TO R CONVERSION
+1 1 (ZH, ZDR) TO (NO, DO) TO R
+2 2 (Z (F1), Z (F2)) TO ATTENUATION TO R
+6 6 OTHER
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25009.table b/definitions/bufr/tables/0/wmo/27/codetables/25009.table
new file mode 100644
index 0000000..bf34fb2
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25009.table
@@ -0,0 +1,4 @@
+1 1 NONE
+2 2 CALIBRATION TARGET OR SIGNAL
+3 3 AGAINST RAINGAUGES
+4 4 AGAINST OTHER INSTRUMENTS (DISDROMETER - ATTENUATION)
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25010.table b/definitions/bufr/tables/0/wmo/27/codetables/25010.table
new file mode 100644
index 0000000..e88b3ca
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25010.table
@@ -0,0 +1,8 @@
+0 0 NONE
+1 1 MAP
+2 2 INSERTION OF HIGHER ELEVATION DATA AND MAP
+3 3 ANALYSIS OF THE FLUCTUATING LOGARITHM SIGNAL (CLUTTER DETECTION)
+4 4 EXTRACTION OF THE FLUCTUATING PART OF LINEAR SIGNAL (CLUTTER SUPPRESSION)
+5 5 CLUTTER SUPPRESSION - DOPPLER
+6 6 MULTIPARAMETER ANALYSIS
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25011.table b/definitions/bufr/tables/0/wmo/27/codetables/25011.table
new file mode 100644
index 0000000..f739498
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25011.table
@@ -0,0 +1,4 @@
+0 0 NONE
+1 1 MAP OF CORRECTION FACTORS
+2 2 INTERPOLATION (AZIMUTH OR ELEVATION)
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25012.table b/definitions/bufr/tables/0/wmo/27/codetables/25012.table
new file mode 100644
index 0000000..c869a4a
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25012.table
@@ -0,0 +1,4 @@
+0 0 HARDWARE
+1 1 SOFTWARE
+2 2 HARDWARE AND SOFTWARE
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25013.table b/definitions/bufr/tables/0/wmo/27/codetables/25013.table
new file mode 100644
index 0000000..b91ea71
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25013.table
@@ -0,0 +1 @@
+1 1 BRIGHT-BAND CORRECTION
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25015.table b/definitions/bufr/tables/0/wmo/27/codetables/25015.table
new file mode 100644
index 0000000..043e587
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25015.table
@@ -0,0 +1 @@
+1 1 RADOME ATTENUATION CORRECTION
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25017.table b/definitions/bufr/tables/0/wmo/27/codetables/25017.table
new file mode 100644
index 0000000..ed48487
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25017.table
@@ -0,0 +1 @@
+1 1 PRECIPITATION ATTENUATION CORRECTION
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25020.table b/definitions/bufr/tables/0/wmo/27/codetables/25020.table
new file mode 100644
index 0000000..6133da3
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25020.table
@@ -0,0 +1,4 @@
+0 0 FFT (FAST FOURIER TRANSFORM)
+1 1 PPP (PULSE-PAIR PROCESSING)
+2 2 VPC (VECTOR-PHASE CHANGE)
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25021.table b/definitions/bufr/tables/0/wmo/27/codetables/25021.table
new file mode 100644
index 0000000..314716b
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25021.table
@@ -0,0 +1,5 @@
+1 1 SIMPLE AVERAGE
+2 2 CONSENSUS AVERAGE
+3 3 MEDIAN CHECK
+4 4 VERTICAL CONSISTENCY CHECK
+5 5 OTHER
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25022.table b/definitions/bufr/tables/0/wmo/27/codetables/25022.table
new file mode 100644
index 0000000..9584878
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25022.table
@@ -0,0 +1,8 @@
+1 1 UNPROCESSED
+2 2 LAND SUSPECTED
+3 3 WIND SPEED TOO LARGE
+4 4 ICE DETECTED
+5 5 RAIN DETECTED (MICROWAVE RETRIEVALS ONLY)
+6 6 CLOUDY DETECTED (INFRA-RED RETRIEVALS ONLY)
+7 7 COSMETIC VALUE
+8 8 SST OUT OF RANGE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25023.table b/definitions/bufr/tables/0/wmo/27/codetables/25023.table
new file mode 100644
index 0000000..e4840dc
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25023.table
@@ -0,0 +1,8 @@
+1 1 DEFAULT CONFIDENCE VALUE HAS BEEN USED
+2 2 DEFAULT BIAS AND STANDARD DEVIATION HAVE BEEN USED
+3 3 SUN GLINT SUSPECTED
+4 4 SEA ICE RETRIEVAL FOR MICROWAVE DATA
+5 5 HIGH WIND SPEED RETRIEVAL
+6 6 INACCURATE SST DUE TO LOW SST (< 285K) (ONLY APPLIES TO THE TMI INSTRUMENT)
+7 7 RELAXED RAIN CONTAMINATION SUSPECTED
+8 8 POTENTIAL SIDE LOBE CONTAMINATION
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25024.table b/definitions/bufr/tables/0/wmo/27/codetables/25024.table
new file mode 100644
index 0000000..81b2638
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25024.table
@@ -0,0 +1,13 @@
+0 0 UNPROCESSED INFRARED RETRIEVAL
+1 1 CLOUDY RETRIEVALS
+2 2 BAD: DATA THAT ARE PROBABLY CONTAMINATED BY CLOUD
+3 3 SUSPECT DATA
+4 4 ACCEPTABLE DATA
+5 5 EXCELLENT DATA
+6 6 COOL SKIN SUSPECTED
+10 10 UNPROCESSED MICROWAVE RETRIEVAL
+11 11 QUESTIONABLE MICROWAVE RETRIEVAL THAT MAY BE CONTAMINATED
+12 12 ACCEPTABLE MICROWAVE RETRIEVAL
+13 13 HIGH PROBABILITY OF DIURNAL VARIABILITY
+14 14 RESERVED
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25029.table b/definitions/bufr/tables/0/wmo/27/codetables/25029.table
new file mode 100644
index 0000000..fb00d01
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25029.table
@@ -0,0 +1,5 @@
+1 1 RESERVED
+2 2 CALIBRATION TARGET OR SIGNAL
+3 3 AGAINST RAINGAUGES
+4 4 AGAINST OTHER INSTRUMENTS (DISDROMETER - ATTENUATION)
+5 5 RESERVED
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25030.table b/definitions/bufr/tables/0/wmo/27/codetables/25030.table
new file mode 100644
index 0000000..c3235d6
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25030.table
@@ -0,0 +1,4 @@
+0 0 RUNNING MEAN SEA-SURFACE TEMPERATURE NOT USED BECAUSE USAGE CRITERIA NOT MET
+1 1 RUNNING MEAN SEA-SURFACE TEMPERATURE NOT USED BECAUSE DATA NOT AVAILABLE
+2 2 RUNNING MEAN SEA-SURFACE TEMPERATURE USED AS PREDICTOR
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25031.table b/definitions/bufr/tables/0/wmo/27/codetables/25031.table
new file mode 100644
index 0000000..16ff950
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25031.table
@@ -0,0 +1,6 @@
+0 0 RESERVED
+1 1 NO THINNING APPLIED (ALL NATIVE MODEL LEVELS ARE INCLUDED FROM BASE TO TOP OF PSEUDO-SOUNDING)
+2 2 NATIVE MODEL LEVELS ARE PRESENT ONLY IF THEY ARE SIGNIFICANT LEVELS AS PER REGULATIONS B/C 25 FOR CONVENTIONAL TEMP SOUNDINGS
+3 3 A PREDEFINED SUBSET OF NATIVE MODEL LEVELS IS PRESENT
+4 4 NO NATIVE MODEL LEVELS ARE PRESENT.  ALL PROFILE LEVELS ARE INTERPOLATED TO A PREDEFINED SET OF PRESSURE COORDINATE LEVELS
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25032.table b/definitions/bufr/tables/0/wmo/27/codetables/25032.table
new file mode 100644
index 0000000..9b894f4
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25032.table
@@ -0,0 +1,4 @@
+0 0 RESERVED
+1 1 DATA FROM LOW MODE
+2 2 DATA FROM HIGH MODE
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25033.table b/definitions/bufr/tables/0/wmo/27/codetables/25033.table
new file mode 100644
index 0000000..e7141c0
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25033.table
@@ -0,0 +1,4 @@
+0 0 WIND PROFILER OPERATING IN SUBMODE A
+1 1 WIND PROFILER OPERATING IN SUBMODE B
+2 2 RESERVED
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25034.table b/definitions/bufr/tables/0/wmo/27/codetables/25034.table
new file mode 100644
index 0000000..473338a
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25034.table
@@ -0,0 +1,3 @@
+1 1 TEST A PERFORMED AND FAILED
+2 2 TEST B PERFORMED AND FAILED
+3 3 TEST RESULTS INCONCLUSIVE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25035.table b/definitions/bufr/tables/0/wmo/27/codetables/25035.table
new file mode 100644
index 0000000..a0c8faa
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25035.table
@@ -0,0 +1,8 @@
+0 0 NOT DEFINED
+1 1 INDIVIDUAL VOLTAGE DEFLECTION
+2 2 CURRENT BASED, ABOVE A THRESHOLD
+3 3 VOLTAGE BASED, ABOVE A THRESHOLD
+4 4 CONSENSUS OF SENSORS, CURRENT ABOVE A THRESHOLD
+5 5 CONSENSUS OF SENSORS, VOLTAGE ABOVE A THRESHOLD
+6 6 RESERVED
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25036.table b/definitions/bufr/tables/0/wmo/27/codetables/25036.table
new file mode 100644
index 0000000..79ebd88
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25036.table
@@ -0,0 +1,4 @@
+0 0 NETWORK OF SEVERAL DIRECTION-FINDERS OPERATING ON THE SAME INDIVIDUAL ATMOSPHERICS
+1 1 NETWORK OF SEVERAL ARRIVAL-TIME STATIONS OPERATING ON THE SAME INDIVIDUAL ATMOSPHERICS
+6 6 SINGLE STATION RANGE BEARING TECHNIQUE
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25040.table b/definitions/bufr/tables/0/wmo/27/codetables/25040.table
new file mode 100644
index 0000000..3ddf12e
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25040.table
@@ -0,0 +1,10 @@
+0 0 NON-SPECIFIC MODE
+1 1 FIRST GUESS DATA
+2 2 CLOUD DATA
+3 3 AVERAGE VECTOR DATA
+4 4 PRIMARY DATA
+5 5 GUESS DATA
+6 6 VECTOR DATA
+7 7 TRACER DATA; THIS IMAGE
+8 8 TRACER DATA TO NEXT IMAGE
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25041.table b/definitions/bufr/tables/0/wmo/27/codetables/25041.table
new file mode 100644
index 0000000..f388da0
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25041.table
@@ -0,0 +1,4 @@
+0 0 DIRECTION ORIGINALLY REPORTED IN TRUE DEGREES
+1 1 DIRECTION ORIGINALLY REPORTED USING CODE TABLE 0700, FM 13
+2 2 RESERVED
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25042.table b/definitions/bufr/tables/0/wmo/27/codetables/25042.table
new file mode 100644
index 0000000..f3cf059
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25042.table
@@ -0,0 +1,4 @@
+0 0 SPEED ORIGINALLY REPORTED IN METRES PER SECOND
+1 1 SPEED ORIGINALLY REPORTED USING CODE TABLE 4451, FM 13
+2 2 RESERVED
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25053.table b/definitions/bufr/tables/0/wmo/27/codetables/25053.table
new file mode 100644
index 0000000..af34138
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25053.table
@@ -0,0 +1,6 @@
+1 1 GOOD
+2 2 REDUNDANT
+3 3 QUESTIONABLE
+4 4 BAD
+5 5 EXPERIMENTAL
+6 6 PRECIPITATING
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25063.table b/definitions/bufr/tables/0/wmo/27/codetables/25063.table
new file mode 100644
index 0000000..a8970ea
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25063.table
@@ -0,0 +1,4 @@
+0 0 NOT DEFINED
+1 1 MAIN PROCESSOR
+2 2 BACKUP PROCESSOR
+255 255 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25069.table b/definitions/bufr/tables/0/wmo/27/codetables/25069.table
new file mode 100644
index 0000000..e627613
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25069.table
@@ -0,0 +1,7 @@
+1 1 SMOOTHED
+2 2 BASELINE ADJUSTED
+3 3 NORMALIZED TIME INTERVAL
+4 4 OUTLIER CHECKED
+5 5 PLAUSIBILITY CHECKED
+6 6 CONSISTENCY CHECKED
+7 7 INTERPOLATED
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25086.table b/definitions/bufr/tables/0/wmo/27/codetables/25086.table
new file mode 100644
index 0000000..294fa69
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25086.table
@@ -0,0 +1,4 @@
+0 0 DEPTHS ARE NOT CORRECTED
+1 1 DEPTHS ARE CORRECTED
+2 2 RESERVED
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25090.table b/definitions/bufr/tables/0/wmo/27/codetables/25090.table
new file mode 100644
index 0000000..309fefc
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25090.table
@@ -0,0 +1,11 @@
+0 0 ORBIT COMPUTED DURING A MANOEUVRE
+1 1 ADJUSTED MISSION OPERATIONS ORBIT
+2 2 EXTRAPOLATED MISSION OPERATIONS ORBIT
+3 3 ADJUSTED (PRELIMINARY/PRECISE) ORBIT
+4 4 (PRELIMINARY/PRECISE) ORBIT IS ESTIMATED DURING A MANOEUVRE PERIOD
+5 5 (PRELIMINARY/PRECISE) ORBIT IS INTERPOLATED OVER A TRACKING DATA GAP
+6 6 (PRELIMINARY/PRECISE) ORBIT IS EXTRAPOLATED FOR A DURATION LESS THAN 1 DAY
+7 7 (PRELIMINARY/PRECISE) ORBIT IS EXTRAPOLATED FOR A DURATION THAT RANGES FROM 1 DAY TO 2 DAYS
+8 8 (PRELIMINARY/PRECISE) ORBIT IS EXTRAPOLATED FOR A DURATION LARGER THAN 2 DAYS, OR THAT THE ORBIT IS EXTRAPOLATED JUST AFTER A MANOEUVRE
+9 9 DORIS* DIODE** NAVIGATOR ORBIT
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25093.table b/definitions/bufr/tables/0/wmo/27/codetables/25093.table
new file mode 100644
index 0000000..e547e6c
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25093.table
@@ -0,0 +1,3 @@
+1 1 NO CORRECTION
+2 2 VERTICAL VELOCITY CORRECTION
+7 7 ALL CORRECTIONS
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25095.table b/definitions/bufr/tables/0/wmo/27/codetables/25095.table
new file mode 100644
index 0000000..c446a50
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25095.table
@@ -0,0 +1 @@
+1 1 ALTIMETER OPERATING (0 IF NOMINAL, 1 IF BACKUP)
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25096.table b/definitions/bufr/tables/0/wmo/27/codetables/25096.table
new file mode 100644
index 0000000..89dcc39
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25096.table
@@ -0,0 +1,4 @@
+1 1 MODE INDICATOR (0 IF MODE 2, 1 IF MODE 1)
+2 2 MODE 1 CALIBRATION SEQUENCE INDICATOR (0 IF NORMAL DATA TAKING EITHER MODE 1 OR 2, 1 IF MODE 1 CALIBRATION SEQUENCE)  BITS 3 AND 4 INDICATE ACTIVE 23.8 GHZ CHANNEL(S):
+3 3 CHANNEL 2 (0 IF ON, 1 IF OFF)
+4 4 CHANNEL 3 (0 IF ON, 1 IF OFF)
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25097.table b/definitions/bufr/tables/0/wmo/27/codetables/25097.table
new file mode 100644
index 0000000..d4e1e46
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25097.table
@@ -0,0 +1,11 @@
+0 0 RANGES BETWEEN 0 AND 30 CM
+1 1 RANGES BETWEEN 30 AND 60 CM
+2 2 RANGES BETWEEN 60 AND 90 CM
+3 3 RANGES BETWEEN 90 AND 120 CM
+4 4 RANGES BETWEEN 120 AND 150 CM
+5 5 RANGES BETWEEN 150 AND 180 CM
+6 6 RANGES BETWEEN 180 AND 210 CM
+7 7 RANGES BETWEEN 210 AND 240 CM
+8 8 RANGES BETWEEN 240 AND 270 CM
+9 9 RANGES LARGER THAN 270 CM
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25098.table b/definitions/bufr/tables/0/wmo/27/codetables/25098.table
new file mode 100644
index 0000000..9d505a5
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25098.table
@@ -0,0 +1,8 @@
+1 1 KU BAND RANGE
+2 2 C BAND RANGE
+3 3 KU BAND SWH*
+4 4 C BAND SWH*
+5 5 KU BAND BACKSCATTER COEFFICIENT
+6 6 C BAND BACKSCATTER COEFFICIENT
+7 7 OFF NADIR ANGLE FROM KU BAND WAVEFORM PARAMETERS
+8 8 OFF NADIR ANGLE FROM PLATFORM
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25099.table b/definitions/bufr/tables/0/wmo/27/codetables/25099.table
new file mode 100644
index 0000000..40f35b1
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25099.table
@@ -0,0 +1,6 @@
+1 1 KU BAND RANGE INSTRUMENTAL CORRECTION
+2 2 C BAND RANGE INSTRUMENTAL CORRECTION
+3 3 KU BAND SWH* INSTRUMENTAL CORRECTION
+4 4 C BAND SWH* INSTRUMENTAL CORRECTION
+5 5 KU BAND BACKSCATTER COEFFICIENT INSTRUMENTAL CORRECTION
+6 6 C BAND BACKSCATTER COEFFICIENT INSTRUMENTAL CORRECTION
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25110.table b/definitions/bufr/tables/0/wmo/27/codetables/25110.table
new file mode 100644
index 0000000..912e01f
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25110.table
@@ -0,0 +1,6 @@
+1 1 RAW DATA ANALYSIS USED FOR RAW DATA CORRECTION. CORRECTION DONE USING DEFAULT PARAMETERS
+2 2 RAW DATA ANALYSIS USED FOR RAW DATA CORRECTION. CORRECTION DONE USING RAW DATA ANALYSIS RESULTS
+3 3 ANTENNA ELEVATION PATTERN CORRECTION APPLIED
+4 4 NOMINAL CHIRP REPLICA USED
+5 5 RECONSTRUCTED CHIRP USED
+6 6 SLANT RANGE TO GROUND RANGE CONVERSION APPLIED
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25112.table b/definitions/bufr/tables/0/wmo/27/codetables/25112.table
new file mode 100644
index 0000000..a2a4ec9
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25112.table
@@ -0,0 +1,5 @@
+1 1 BAND SPECIFIC RANGE
+2 2 BAND SPECIFIC SIGNIFICANT WAVE HEIGHT
+3 3 BAND SPECIFIC BACKSCATTER COEFFICIENT
+4 4 OFF NADIR ANGLE FROM BAND SPECIFIC WAVEFORM PARAMETERS
+5 5 OFF NADIR ANGLE FROM PLATFORM
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25113.table b/definitions/bufr/tables/0/wmo/27/codetables/25113.table
new file mode 100644
index 0000000..ef394b6
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25113.table
@@ -0,0 +1,3 @@
+1 1 BAND SPECIFIC RANGE INSTRUMENTAL CORRECTION
+2 2 BAND SPECIFIC SIGNIFICANT WAVE HEIGHT INSTRUMENTAL CORRECTION
+3 3 BAND SPECIFIC BACKSCATTER COEFFICIENT INSTRUMENTAL CORRECTION
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25120.table b/definitions/bufr/tables/0/wmo/27/codetables/25120.table
new file mode 100644
index 0000000..bdb9f96
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25120.table
@@ -0,0 +1,4 @@
+0 0 PERCENTAGE OF DSRS* FREE OF PROCESSING ERRORS DURING LEVEL 2 PROCESSING IS GREATER THAN THE ACCEPTABLE THRESHOLD
+1 1 PERCENTAGE OF DSRS FREE OF PROCESSING ERRORS DURING LEVEL 2 PROCESSING IS LESS THAN THE ACCEPTABLE THRESHOLD
+2 2 RESERVED
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25122.table b/definitions/bufr/tables/0/wmo/27/codetables/25122.table
new file mode 100644
index 0000000..1085ef9
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25122.table
@@ -0,0 +1,4 @@
+0 0 HARDWARE CONFIGURATION FOR RF IS A
+1 1 HARDWARE CONFIGURATION FOR RF IS B
+2 2 RESERVED
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25123.table b/definitions/bufr/tables/0/wmo/27/codetables/25123.table
new file mode 100644
index 0000000..70f0670
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25123.table
@@ -0,0 +1,4 @@
+0 0 HARDWARE CONFIGURATION FOR HPA IS A
+1 1 HARDWARE CONFIGURATION FOR HPA IS B
+2 2 RESERVED
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25124.table b/definitions/bufr/tables/0/wmo/27/codetables/25124.table
new file mode 100644
index 0000000..dce5b04
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25124.table
@@ -0,0 +1,4 @@
+0 0 PERCENTAGE OF DSRS** FREE OF PROCESSING ERRORS DURING LEVEL 2 PROCESSING IS GREATER THAN THE ACCEPTABLE THRESHOLD
+1 1 PERCENTAGE OF DSRS** FREE OF PROCESSING ERRORS DURING LEVEL 2 PROCESSING IS LESS THAN THE ACCEPTABLE THRESHOLD
+2 2 RESERVED
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25150.table b/definitions/bufr/tables/0/wmo/27/codetables/25150.table
new file mode 100644
index 0000000..7b452c3
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25150.table
@@ -0,0 +1,3 @@
+1 1 THE DVORAK'S VIS (VISUAL IMAGERY) INTENSITY ANALYSIS
+2 2 THE DVORAK'S EIR (ENHANCED INFRARED IMAGERY) INTENSITY ANALYSIS
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25174.table b/definitions/bufr/tables/0/wmo/27/codetables/25174.table
new file mode 100644
index 0000000..c8a11b6
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25174.table
@@ -0,0 +1,13 @@
+1 1 PIXEL IS AFFECTED BY RFI EFFECTS
+2 2 PIXEL IS LOCATED IN THE HEXAGONAL ALIAS DIRECTION CENTRED ON SUN ALIAS
+3 3 PIXEL IS CLOSE TO THE BORDER DELIMITING THE EXTENDED ALIAS FREE ZONE
+4 4 PIXEL IS INSIDE THE EXTENDED ALIAS FREE ZONE
+5 5 PIXEL IS INSIDE THE EXCLUSIVE OF ALIAS FREE ZONE
+6 6 PIXEL IS LOCATED IN A ZONE WHERE A MOON ALIAS WAS RECONSTRUCTED
+7 7 PIXEL IS LOCATED IN A ZONE WHERE SUN REFLECTION HAS BEEN DETECTED
+8 8 PIXEL IS LOCATED IN A ZONE WHERE SUN ALIAS WAS RECONSTRUCTED
+9 9 FLAT TARGET TRANSFORMATION HAS BEEN PERFORMED DURING IMAGE RECONSTRUCTION OF THIS PIXEL
+10 10 SCENE HAS BEEN COMBINED WITH AN ADJUSTMENT SCENE IN OPPOSITE POLARIZATION DURING IMAGE RECONSTRUCTION TO ACCOUNT FOR CROSS-POLARIZATION LEAKAGE
+11 11 DIRECT MOON CORRECTION HAS BEEN PERFORMED DURING IMAGE RECONSTRUCTION OF THIS PIXEL
+12 12 REFLECTED SUN CORRECTION HAS BEEN PERFORMED DURING IMAGE RECONSTRUCTION OF THIS PIXEL
+13 13 DIRECT SUN CORRECTION HAS BEEN PERFORMED DURING IMAGE RECONSTRUCTION OF THIS IMAGE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25181.table b/definitions/bufr/tables/0/wmo/27/codetables/25181.table
new file mode 100644
index 0000000..2c1eabf
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25181.table
@@ -0,0 +1,3 @@
+0 0 OK
+1 1 PERCENTAGE OF L2B RECORDS FREE OF PROCESSING ERRORS IS LESS THAN ACCEPTABLE THRESHOLD
+2 2 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25182.table b/definitions/bufr/tables/0/wmo/27/codetables/25182.table
new file mode 100644
index 0000000..9827b1d
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25182.table
@@ -0,0 +1,3 @@
+0 0 OK
+1 1 PERCENTAGE OF L1B RECORDS FREE OF PROCESSING ERRORS IS LESS THAN ACCEPTABLE THRESHOLD
+2 2 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25184.table b/definitions/bufr/tables/0/wmo/27/codetables/25184.table
new file mode 100644
index 0000000..29005c1
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25184.table
@@ -0,0 +1,3 @@
+0 0 OK
+1 1 PRODUCT AS A DURATION SHORTER THAN THE INPUT PRODUCT
+2 2 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25185.table b/definitions/bufr/tables/0/wmo/27/codetables/25185.table
new file mode 100644
index 0000000..ac18aba
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25185.table
@@ -0,0 +1,2 @@
+0 0 AES 256
+255 255 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25187.table b/definitions/bufr/tables/0/wmo/27/codetables/25187.table
new file mode 100644
index 0000000..683c097
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25187.table
@@ -0,0 +1,3 @@
+0 0 VALID
+1 1 INVALID
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/25188.table b/definitions/bufr/tables/0/wmo/27/codetables/25188.table
new file mode 100644
index 0000000..75641e0
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/25188.table
@@ -0,0 +1,6 @@
+0 0 PRESSURE ADJUSTED TO MEAN SEA LEVEL FOLLOWING WMO 8 FOR LOW LEVEL (< 50M) STATIONS
+1 1 PRESSURE ADJUSTED TO MEAN SEA LEVEL FOLLOWING WMO 8 FOR STATIONS BELOW 750 M
+2 2 PRESSURE ADJUSTED TO SEA LEVEL FOLLOWING NATIONAL PRACTICE
+3 3 PRESSURE ADJUSTED TO LOCAL WATER LEVEL FOLLOWING NATIONAL PRACTICE
+4 4 PRESSURE NOT CORRECTED FOR HEIGHT
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/26010.table b/definitions/bufr/tables/0/wmo/27/codetables/26010.table
new file mode 100644
index 0000000..f825040
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/26010.table
@@ -0,0 +1,25 @@
+1 1 0100 INCLUDED
+2 2 0200 INCLUDED
+3 3 0300 INCLUDED
+4 4 0400 INCLUDED
+5 5 0500 INCLUDED
+6 6 0600 INCLUDED
+7 7 0700 INCLUDED
+8 8 0800 INCLUDED
+9 9 0900 INCLUDED
+10 10 1000 INCLUDED
+11 11 1100 INCLUDED
+12 12 1200 INCLUDED
+13 13 1300 INCLUDED
+14 14 1400 INCLUDED
+15 15 1500 INCLUDED
+16 16 1600 INCLUDED
+17 17 1700 INCLUDED
+18 18 1800 INCLUDED
+19 19 1900 INCLUDED
+20 20 2000 INCLUDED
+21 21 2100 INCLUDED
+22 22 2200 INCLUDED
+23 23 2300 INCLUDED
+24 24 2400 INCLUDED
+25 25 UNKNOWN MIXTURE OF HOURS
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/29001.table b/definitions/bufr/tables/0/wmo/27/codetables/29001.table
new file mode 100644
index 0000000..1481243
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/29001.table
@@ -0,0 +1,8 @@
+0 0 GNOMONIC PROJECTION
+1 1 POLAR STEREOGRAPHIC PROJECTION
+2 2 LAMBERT'S CONFORMAL CONIC PROJECTION
+3 3 MERCATOR'S PROJECTION
+4 4 SCANNING CONE (RADAR)*
+5 5 RESERVED
+6 6 NO PROJECTION
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/29002.table b/definitions/bufr/tables/0/wmo/27/codetables/29002.table
new file mode 100644
index 0000000..1d7efd0
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/29002.table
@@ -0,0 +1,4 @@
+0 0 CARTESIAN
+1 1 POLAR
+2 2 OTHER
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/3001.table b/definitions/bufr/tables/0/wmo/27/codetables/3001.table
new file mode 100644
index 0000000..cfa2c1a
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/3001.table
@@ -0,0 +1,11 @@
+0 0 LAND STATION (SYNOPTIC NETWORK)
+1 1 SHALLOW WATER STATION (FIXED TO SEA/LAKE FLOOR)
+2 2 SHIP
+3 3 RIG/PLATFORM
+4 4 MOORED BUOY
+5 5 DRIFTING BUOY (OR DRIFTER)
+6 6 ICE BUOY
+7 7 LAND STATION (LOCAL NETWORK)
+8 8 LAND VEHICLE
+9 9 AUTONOMOUS MARINE VEHICLE
+31 31 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/3003.table b/definitions/bufr/tables/0/wmo/27/codetables/3003.table
new file mode 100644
index 0000000..cf53023
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/3003.table
@@ -0,0 +1,8 @@
+0 0 SCREEN
+1 1 SLING/WHIRLING
+2 2 UNSCREENED
+3 3 RADIATION SHIELD
+4 4 ASPIRATED (E.G. ASSMANN)
+5 5 OTHER SHELTER
+6 6 HANDHELD
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/30031.table b/definitions/bufr/tables/0/wmo/27/codetables/30031.table
new file mode 100644
index 0000000..80cce26
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/30031.table
@@ -0,0 +1,13 @@
+0 0 PPI
+1 1 COMPOSITE
+2 2 CAPPL
+3 3 VERTICAL SECTION
+4 4 ALPHANUMERIC DATA
+5 5 MAP OF SUBJECT CLUTTER
+6 6 MAP
+7 7 TEST PICTURE
+8 8 COMMENTS
+9 9 MAP OF GROUND OCCULTATION
+10 10 MAP OF RADAR BEAM HEIGHT
+14 14 OTHER
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/30032.table b/definitions/bufr/tables/0/wmo/27/codetables/30032.table
new file mode 100644
index 0000000..942cb5d
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/30032.table
@@ -0,0 +1,9 @@
+1 1 MAP
+2 2 SATELLITE IR
+3 3 SATELLITE VIS
+4 4 SATELLITE WV
+5 5 SATELLITE MULTISPECTRAL
+6 6 SYNOPTIC OBSERVATIONS
+7 7 FORECAST PARAMETERS
+8 8 LIGHTNING DATA
+15 15 OTHER DATA
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/3004.table b/definitions/bufr/tables/0/wmo/27/codetables/3004.table
new file mode 100644
index 0000000..c3604a4
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/3004.table
@@ -0,0 +1,11 @@
+0 0 STEVENSON SCREEN
+1 1 MARINE STEVENSON SCREEN
+2 2 CYLINDRICAL SECTION PLATE SHIELD
+3 3 CONCENTRIC TUBE
+4 4 RECTANGULAR SECTION SHIELD
+5 5 SQUARE SECTION SHIELD
+6 6 TRIANGULAR SECTION SHIELD
+7 7 OPEN COVERED LEAN TO
+8 8 OPEN COVERED INVERTED V ROOF
+9 9 INTEGRATED (E.G. CHILLED MIRROR)
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/3008.table b/definitions/bufr/tables/0/wmo/27/codetables/3008.table
new file mode 100644
index 0000000..e321d55
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/3008.table
@@ -0,0 +1,4 @@
+0 0 NATURAL VENTILATION IN USE
+1 1 ARTIFICIAL ASPIRATION IN USE: CONSTANT FLOW AT TIME OF READING
+2 2 ARTIFICIAL ASPIRATION IN USE: VARIABLE FLOW AT TIME OF READING
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/3010.table b/definitions/bufr/tables/0/wmo/27/codetables/3010.table
new file mode 100644
index 0000000..75746a1
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/3010.table
@@ -0,0 +1,12 @@
+0 0 RESERVED
+1 1 ADCP
+2 2 GEK (GEOMAGNETIC ELECTROKINETOGRAPH)
+3 3 SHIP'S SET AND DRIFT DETERMINED BY FIXES 3-6 HOURS APART
+4 4 SHIP'S SET AND DRIFT DETERMINED BY FIXES MORE THAN 6 HOURS BUT LESS THAN 12 HOURS APART
+5 5 DRIFT OF BUOY
+6 6 ADCP
+7 7 ADCP BOTTOM TRACKING MODE
+8 8 ELECTROMAGNETIC SENSOR
+9 9 ROTOR AND VANE
+10 10 LOWERED ADCP
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/3011.table b/definitions/bufr/tables/0/wmo/27/codetables/3011.table
new file mode 100644
index 0000000..7488268
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/3011.table
@@ -0,0 +1,4 @@
+0 0 DEPTH CALCULATED USING FALL RATE EQUATION
+1 1 DEPTH CALCULATED FROM WATER PRESSURE/EQUATION OF STATE
+2 2 RESERVED
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/3012.table b/definitions/bufr/tables/0/wmo/27/codetables/3012.table
new file mode 100644
index 0000000..35bdead
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/3012.table
@@ -0,0 +1,3 @@
+0 0 ANDERRAA OXYGEN OPTODE
+1 1 WINKLER BOTTLE
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/3016.table b/definitions/bufr/tables/0/wmo/27/codetables/3016.table
new file mode 100644
index 0000000..792788f
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/3016.table
@@ -0,0 +1,9 @@
+0 0 FAST LANE BETWEEN THE WHEEL TRACKS
+1 1 FAST LANE BETWEEN THE WHEEL TRACKS IN THE OPPOSITE DIRECTION
+2 2 FAST LANE IN THE WHEEL TRACKS
+3 3 FAST LANE IN THE WHEEL TRACKS IN THE OPPOSITE DIRECTION
+4 4 SLOW LANE BETWEEN THE WHEEL TRACKS
+5 5 SLOW LANE BETWEEN THE WHEEL TRACKS IN THE OPPOSITE DIRECTION
+6 6 SLOW LANE IN THE WHEEL TRACKS
+7 7 SLOW LANE IN THE WHEEL TRACKS IN THE OPPOSITE DIRECTION
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/3017.table b/definitions/bufr/tables/0/wmo/27/codetables/3017.table
new file mode 100644
index 0000000..e94c0a4
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/3017.table
@@ -0,0 +1,5 @@
+1 1 AUTOMATIC
+2 2 MANNED
+3 3 EVENT TRIGGERED
+4 4 LONGER TIME PERIOD THAN THE STANDARD
+5 5 RESERVED
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/3018.table b/definitions/bufr/tables/0/wmo/27/codetables/3018.table
new file mode 100644
index 0000000..79e0375
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/3018.table
@@ -0,0 +1,22 @@
+0 0 FREE TRACK WITHOUT FURTHER INFORMATION
+1 1 FREE TRACK, EMBANKMENT
+2 2 FREE TRACK, FLAT RELATIVE TO SURROUNDINGS
+3 3 FREE TRACK, WATER BASIN(S) IN VICINITY
+4 4 FREE TRACK, FOREST
+5 5 FREE TRACK, CLEFT
+6 6 FREE TRACK, ON HILLTOP
+7 7 FREE TRACK, ON HILLTOP, FOREST
+8 8 FREE TRACK, IN VALLEY
+9 9 FREE TRACK, IN VALLEY, FOREST
+10 10 FREE TRACK, NORTH INCLINATION
+11 11 FREE TRACK, NORTH INCLINATION, FOREST
+12 12 FREE TRACK, SOUTH INCLINATION
+13 13 FREE TRACK, SOUTH INCLINATION, FOREST
+20 20 BRIDGE WITHOUT FURTHER INFORMATION
+21 21 BRIDGE ACROSS A VALLEY IN A URBAN AREA
+22 22 BRIDGE ACROSS A VALLEY WITH FOREST/MEADOWS/FIELDS
+23 23 BRIDGE ACROSS STREET/TRACK
+24 24 BRIDGE ACROSS BIG RIVER/CANAL
+25 25 BRIDGE ACROSS RIVER/CANAL OF MEDIUM SIZE
+26 26 BRIDGE ACROSS A SMALL STREAM/LOADING CANAL
+31 31 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/3019.table b/definitions/bufr/tables/0/wmo/27/codetables/3019.table
new file mode 100644
index 0000000..2f55b00
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/3019.table
@@ -0,0 +1,8 @@
+0 0 ASPHALT
+1 1 CONCRETE
+2 2 CONCRETE CONSTRUCTION
+3 3 STEEL-GIRDER CONSTRUCTION
+4 4 BOX GIRDER BRIDGE
+5 5 ORTHOTROPIC SLAB
+6 6 DRAIN ASPHALT
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/3020.table b/definitions/bufr/tables/0/wmo/27/codetables/3020.table
new file mode 100644
index 0000000..9f0feae
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/3020.table
@@ -0,0 +1,5 @@
+0 0 WOOD
+1 1 METAL ALLOY
+2 2 PLASTIC/GRP
+3 3 REED/GRASS/LEAF
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/3021.table b/definitions/bufr/tables/0/wmo/27/codetables/3021.table
new file mode 100644
index 0000000..27e1bfa
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/3021.table
@@ -0,0 +1,4 @@
+0 0 UNHEATED
+1 1 HEATED
+2 2 NOT APPLICABLE
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/3022.table b/definitions/bufr/tables/0/wmo/27/codetables/3022.table
new file mode 100644
index 0000000..7ecac34
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/3022.table
@@ -0,0 +1,4 @@
+0 0 NATIONAL HYDRO METEOROLOGICAL/WEATHER SERVICE
+1 1 OTHER
+2 2 STANDARDS INSTITUTE
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/3023.table b/definitions/bufr/tables/0/wmo/27/codetables/3023.table
new file mode 100644
index 0000000..8376a8d
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/3023.table
@@ -0,0 +1,8 @@
+0 0 SINGLE V SECTION LOUVERS
+1 1 OVERLAPPING LOUVERS
+2 2 DOUBLE V SECTION LOUVERS
+3 3 NON-OVERLAPPING LOUVERS
+4 4 VENTED, NON-LOUVERED
+5 5 NOT APPLICABLE
+6 6 RESERVED FOR FUTURE USE
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/31021.table b/definitions/bufr/tables/0/wmo/27/codetables/31021.table
new file mode 100644
index 0000000..fb70e1c
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/31021.table
@@ -0,0 +1,8 @@
+0 0 RESERVED
+1 1 1-BIT INDICATOR OF QUALITY
+2 2 2-BIT INDICATOR OF QUALITY
+6 6 4-BIT INDICATOR OF QUALITY CONTROL CLASS ACCORDING TO GTSPP
+7 7 PERCENTAGE CONFIDENCE
+8 8 0 = NOT SUSPECTED, 1 = SUSPECTED, 2 = RESERVED, 3 = INFORMATION NOT REQUIRED
+21 21 1-BIT INDICATOR OF CORRECTION
+63 63 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/31031.table b/definitions/bufr/tables/0/wmo/27/codetables/31031.table
new file mode 100644
index 0000000..1f27429
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/31031.table
@@ -0,0 +1 @@
+1 1 
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33002.table b/definitions/bufr/tables/0/wmo/27/codetables/33002.table
new file mode 100644
index 0000000..4177c05
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33002.table
@@ -0,0 +1,4 @@
+0 0 DATA NOT SUSPECT
+1 1 DATA SUSPECT
+2 2 RESERVED
+3 3 QUALITY INFORMATION NOT GIVEN
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33003.table b/definitions/bufr/tables/0/wmo/27/codetables/33003.table
new file mode 100644
index 0000000..7577129
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33003.table
@@ -0,0 +1,5 @@
+0 0 DATA NOT SUSPECT
+1 1 DATA SLIGHTLY SUSPECT
+2 2 DATA HIGHLY SUSPECT
+3 3 DATA CONSIDERED UNFIT FOR USE
+7 7 QUALITY INFORMATION NOT GIVEN
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33005.table b/definitions/bufr/tables/0/wmo/27/codetables/33005.table
new file mode 100644
index 0000000..8d7569a
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33005.table
@@ -0,0 +1,23 @@
+1 1 NO AUTOMATED METEOROLOGICAL DATA CHECKS PERFORMED
+2 2 PRESSURE DATA SUSPECT
+3 3 WIND DATA SUSPECT
+4 4 AIR TEMPERATURE DATA SUSPECT
+5 5 WET-BULB TEMPERATURE DATA SUSPECT
+6 6 HUMIDITY DATA SUSPECT
+7 7 GROUND TEMPERATURE DATA SUSPECT
+8 8 SOIL TEMPERATURE (DEPTH 1) DATA SUSPECT
+9 9 SOIL TEMPERATURE (DEPTH 2) DATA SUSPECT
+10 10 SOIL TEMPERATURE (DEPTH 3) DATA SUSPECT
+11 11 SOIL TEMPERATURE (DEPTH 4) DATA SUSPECT
+12 12 SOIL TEMPERATURE (DEPTH 5) DATA SUSPECT
+13 13 CLOUD DATA SUSPECT
+14 14 VISIBILITY DATA SUSPECT
+15 15 PRESENT WEATHER DATA SUSPECT
+16 16 LIGHTNING DATA SUSPECT
+17 17 ICE DEPOSIT DATA SUSPECT
+18 18 PRECIPITATION DATA SUSPECT
+19 19 STATE OF GROUND DATA SUSPECT
+20 20 SNOW DATA SUSPECT
+21 21 WATER CONTENT DATA SUSPECT
+22 22 EVAPORATION/EVAPOTRANSPIRATION DATA SUSPECT
+23 23 SUNSHINE DATA SUSPECT
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33006.table b/definitions/bufr/tables/0/wmo/27/codetables/33006.table
new file mode 100644
index 0000000..0ea44a5
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33006.table
@@ -0,0 +1,5 @@
+0 0 SELF-CHECK OK
+1 1 AT LEAST ONE WARNING ACTIVE, NO ALARMS
+2 2 AT LEAST ONE ALARM ACTIVE
+3 3 SENSOR FAILURE
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33015.table b/definitions/bufr/tables/0/wmo/27/codetables/33015.table
new file mode 100644
index 0000000..f585808
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33015.table
@@ -0,0 +1,16 @@
+0 0 PASSED ALL CHECKS
+1 1 MISSING DATA CHECK
+2 2 DESCENDING/REASCENDING BALLOON CHECK
+3 3 DATA PLAUSIBILITY CHECK (ABOVE LIMITS)
+4 4 DATA PLAUSIBILITY CHECK (BELOW LIMITS)
+5 5 SUPERADIABATIC LAPSE RATE CHECK
+6 6 LIMITING ANGLES CHECK
+7 7 ASCENSION RATE CHECK
+8 8 EXCESSIVE CHANGE FROM PREVIOUS FLIGHT
+9 9 BALLOON OVERHEAD CHECK
+10 10 WIND SPEED CHECK
+11 11 WIND DIRECTION CHECK
+12 12 DEPENDENCY CHECK
+13 13 DATA VALID BUT MODIFIED
+14 14 DATA OUTLIER CHECK
+63 63 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33020.table b/definitions/bufr/tables/0/wmo/27/codetables/33020.table
new file mode 100644
index 0000000..ba7a4d4
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33020.table
@@ -0,0 +1,8 @@
+0 0 GOOD
+1 1 INCONSISTENT
+2 2 DOUBTFUL
+3 3 WRONG
+4 4 NOT CHECKED
+5 5 HAS BEEN CHANGED
+6 6 ESTIMATED
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33021.table b/definitions/bufr/tables/0/wmo/27/codetables/33021.table
new file mode 100644
index 0000000..e3e67ae
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33021.table
@@ -0,0 +1,4 @@
+0 0 WITHIN LIMITS
+1 1 OUTSIDE LIMITS
+2 2 RESERVED
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33022.table b/definitions/bufr/tables/0/wmo/27/codetables/33022.table
new file mode 100644
index 0000000..50ef65f
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33022.table
@@ -0,0 +1,4 @@
+0 0 GOOD (SEVERAL IDENTICAL REPORTS HAVE BEEN RECEIVED)
+1 1 DUBIOUS (NO IDENTICAL REPORTS HAVE BEEN RECEIVED)
+2 2 RESERVED
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33023.table b/definitions/bufr/tables/0/wmo/27/codetables/33023.table
new file mode 100644
index 0000000..896c816
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33023.table
@@ -0,0 +1,4 @@
+0 0 RELIABLE (LOCATION WAS MADE OVER TWO SATELLITE PASSES)
+1 1 LATEST KNOWN (NO LOCATION OVER THE CORRESPONDING PASS)
+2 2 DUBIOUS (LOCATION MADE OVER ONE PASS ONLY; A SECOND SOLUTION IS POSSIBLE IN 5 PER CENT OF THE CASES)
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33024.table b/definitions/bufr/tables/0/wmo/27/codetables/33024.table
new file mode 100644
index 0000000..771e04b
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33024.table
@@ -0,0 +1,10 @@
+0 0 RESERVED
+1 1 EXCELLENT - WITHIN 3 METRES
+2 2 GOOD - WITHIN 10 METRES
+3 3 FAIR - WITHIN 20 METRES
+4 4 POOR - MORE THAN 20 METRES
+5 5 EXCELLENT - WITHIN 10 FEET
+6 6 GOOD - WITHIN 30 FEET
+7 7 FAIR - WITHIN 60 FEET
+8 8 POOR - MORE THAN 60 FEET
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33025.table b/definitions/bufr/tables/0/wmo/27/codetables/33025.table
new file mode 100644
index 0000000..4da695a
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33025.table
@@ -0,0 +1,5 @@
+0 0 TIME INTERPOLATED, LATITUDE AND LONGITUDE REPORTED
+1 1 TIME REPORTED, LATITUDE AND LONGITUDE INTERPOLATED
+2 2 TIME, LATITUDE, AND LONGITUDE INTERPOLATED
+3 3 TIME, LATITUDE, AND LONGITUDE REPORTED
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33026.table b/definitions/bufr/tables/0/wmo/27/codetables/33026.table
new file mode 100644
index 0000000..08c6125
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33026.table
@@ -0,0 +1,17 @@
+0 0 NORMAL OPERATIONS - MEASUREMENT MODE
+1 1 NORMAL OPERATIONS - NON-MEASUREMENT MODE
+2 2 SMALL RH
+3 3 HUMIDITY ELEMENT IS WET
+4 4 HUMIDITY ELEMENT CONTAMINATED
+5 5 HEATER FAIL
+6 6 HEATER FAIL AND WET/CONTAMINATED HUMIDITY ELEMENT
+7 7 AT LEAST ONE OF THE INPUT PARAMETERS USED IN THE CALCULATION OF MIXING RATIO IS INVALID
+8 8 NUMERIC ERROR
+9 9 SENSOR NOT INSTALLED
+10 10 CALCULATED RH > 100%
+11 11 INPUT LASER POWER TOO LOW
+12 12 PROBE WV TEMPERATURE OUT OF RANGE
+13 13 PROBE WV PRESSURE OUT OF RANGE
+14 14 SPECTRAL LINE OUT OF RANGE
+15 15 NO LASER OUTPUT
+63 63 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33027.table b/definitions/bufr/tables/0/wmo/27/codetables/33027.table
new file mode 100644
index 0000000..8997392
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33027.table
@@ -0,0 +1,6 @@
+0 0 RADIUS >= 1500 M
+1 1 500 M =< RADIUS <1500 M
+2 2 250 M =< RADIUS < 500 M
+3 3 RADIUS < 250 M
+4 4 <= 100 M
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33028.table b/definitions/bufr/tables/0/wmo/27/codetables/33028.table
new file mode 100644
index 0000000..84bd666
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33028.table
@@ -0,0 +1,5 @@
+1 1 NOMINAL
+2 2 DEGRADED BY SW ERROR; ANY ERROR REPORTED BY THE ALGORITHMS
+3 3 DEGRADED BY INSTRUMENT ERROR
+4 4 DEGRADED BY CORRUPTED /MISSING ADF
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33030.table b/definitions/bufr/tables/0/wmo/27/codetables/33030.table
new file mode 100644
index 0000000..c9e36c0
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33030.table
@@ -0,0 +1,7 @@
+1 1 DO NOT USE SCAN FOR PRODUCT GENERATION
+2 2 TIME SEQUENCE ERROR DETECTED WITH THIS SCAN
+3 3 DATA GAP PRECEDES THIS SCAN
+4 4 NO CALIBRATION
+5 5 NO EARTH LOCATION
+6 6 FIRST GOOD TIME FOLLOWING A CLOCK UPDATE
+7 7 INSTRUMENT STATUS CHANGED WITH THIS SCAN
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33031.table b/definitions/bufr/tables/0/wmo/27/codetables/33031.table
new file mode 100644
index 0000000..c11fd4a
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33031.table
@@ -0,0 +1,21 @@
+1 1 TIME FIELD IS BAD BUT CAN PROBABLY BE INFERRED FROM THE PREVIOUS GOOD TIME
+2 2 TIME FIELD IS BAD AND CANNOT BE INFERRED FROM THE PREVIOUS GOOD TIME
+3 3 THIS RECORD STARTS A SEQUENCE THAT IS INCONSISTENT WITH PREVIOUS TIMES (I.E. THERE IS A TIME DISCONTINUITY). THIS MAY OR MAY NOT BE ASSOCIATED WITH A SPACECRAFT CLOCK UPDATE (SEE SCAN LINE STATUS FLAGS FOR ATOVS)
+4 4 START OF A SEQUENCE THAT APPARENTLY REPEATS SCAN TIMES THAT HAVE BEEN PREVIOUSLY ACCEPTED
+5 5 SCAN LINE WAS NOT CALIBRATED BECAUSE OF BAD TIME
+6 6 SCAN LINE WAS CALIBRATED USING FEWER THAN THE PREFERRED NUMBER OF SCAN LINES BECAUSE OF PROXIMITY TO START OR END OF DATA OR TO A DATA GAP
+7 7 SCAN LINE WAS NOT CALIBRATED BECAUSE OF BAD OR INSUFFICIENT PRT DATA
+8 8 SCAN LINE WAS CALIBRATED BUT WITH MARGINAL PRT DATA
+9 9 SOME UNCALIBRATED CHANNELS ON THIS SCAN
+10 10 UNCALIBRATED DUE TO INSTRUMENT MODE
+11 11 QUESTIONABLE CALIBRATION BECAUSE OF ANTENNA POSITION ERROR OF SPACE VIEW
+12 12 QUESTIONABLE CALIBRATION BECAUSE OF ANTENNA POSITION ERROR OF BLACK BODY
+13 13 NOT EARTH LOCATED BECAUSE OF BAD TIME
+14 14 EARTH LOCATION QUESTIONABLE BECAUSE OF QUESTIONABLE TIME CODE (SEE TIME PROBLEM CODE BITS)
+15 15 EARTH LOCATION QUESTIONABLE - ONLY MARGINAL AGREEMENT WITH REASONABLENESS CHECK
+16 16 EARTH LOCATION QUESTIONABLE - FAILS REASONABLENESS CHECK
+17 17 EARTH LOCATION QUESTIONABLE BECAUSE OF ANTENNA POSITION CHECK
+18 18 SCAN LINE CALIBRATION COLD BLACK BODY
+19 19 SCAN LINE CALIBRATION WARM BLACK BODY
+20 20 SCAN LINE CALIBRATION SPACE VIEW
+21 21 EARTH VIEW
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33032.table b/definitions/bufr/tables/0/wmo/27/codetables/33032.table
new file mode 100644
index 0000000..33307f5
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33032.table
@@ -0,0 +1,7 @@
+1 1 NO GOOD BLACKBODY COUNTS FOR SCAN LINE
+2 2 NO GOOD SPACE VIEW COUNTS FOR THIS LINE
+3 3 NO GOOD PRTS FOR THIS LINE
+4 4 SOME BAD BLACKBODY VIEW COUNTS FOR THIS LINE
+5 5 SOME BAD SPACE VIEW COUNTS FOR THIS LINE
+6 6 SOME BAD PRT TEMPS ON THIS LINE
+7 7 QUALITY FOR THIS SCAN IS REDUCED
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33033.table b/definitions/bufr/tables/0/wmo/27/codetables/33033.table
new file mode 100644
index 0000000..6fd3205
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33033.table
@@ -0,0 +1,3 @@
+1 1 SET IF SECONDARY CALIBRATION USED
+22 22 SET IF ALL THE CHANNELS ARE MISSING
+23 23 SUSPECT
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33035.table b/definitions/bufr/tables/0/wmo/27/codetables/33035.table
new file mode 100644
index 0000000..01996ba
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33035.table
@@ -0,0 +1,10 @@
+0 0 AUTOMATIC QUALITY CONTROL PASSED AND NOT MANUALLY CHECKED
+1 1 AUTOMATIC QUALITY CONTROL PASSED AND MANUALLY CHECKED AND PASSED
+2 2 AUTOMATIC QUALITY CONTROL PASSED AND MANUALLY CHECKED AND DELETED
+3 3 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY NOT CHECKED
+4 4 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND FAILED
+5 5 AUTOMATIC QUALITY CONTROL FAILED AND MANUALLY CHECKED AND RE-INSERTED
+6 6 AUTOMATIC QUALITY CONTROL FLAGGED DATA AS QUESTIONABLE AND NOT MANUALLY CHECKED
+7 7 AUTOMATIC QUALITY CONTROL FLAGGED DATA AS QUESTIONABLE AND MANUALLY CHECKED AND FAILED
+8 8 MANUALLY CHECKED AND FAILED
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33037.table b/definitions/bufr/tables/0/wmo/27/codetables/33037.table
new file mode 100644
index 0000000..9f26652
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33037.table
@@ -0,0 +1,19 @@
+1 1 U DEPARTURE FROM GUESS
+2 2 V DEPARTURE FROM GUESS
+3 3 U AND V DEPARTURE FROM GUESS
+4 4 U ACCELERATION
+5 5 V ACCELERATION
+6 6 U AND V ACCELERATION
+7 7 POSSIBLE LAND FEATURE
+8 8 U ACCELERATION AND POSSIBLE LAND FEATURE
+9 9 V ACCELERATION AND POSSIBLE LAND FEATURE
+10 10 U AND V ACCELERATION AND POSSIBLE LAND FEATURE
+11 11 BAD WIND GUESS
+12 12 CORRELATION FAILURE
+13 13 SEARCH BOX OFF EDGE OF AREA
+14 14 TARGET BOX OFF EDGE OF AREA
+15 15 PIXEL BRIGHTNESS OUT OF BOUNDS (NOISY LINE)
+16 16 TARGET OUTSIDE OF LATITUDE/LONGITUDE BOX
+17 17 TARGET OUTSIDE OF PRESSURE MINIMUM/MAXIMUM
+18 18 AUTOEDITOR FLAGGED SLOW VECTOR
+19 19 AUTOEDITOR FLAGGED VECTORS
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33038.table b/definitions/bufr/tables/0/wmo/27/codetables/33038.table
new file mode 100644
index 0000000..3dc1192
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33038.table
@@ -0,0 +1,9 @@
+1 1 TOTAL ZENITH DELAY QUALITY IS CONSIDERED POOR
+2 2 GALILEO SATELLITES USED
+3 3 GLONASS SATELLITES USED
+4 4 GPS SATELLITES USED
+5 5 METEOROLOGICAL DATA APPLIED
+6 6 ATMOSPHERIC LOADING CORRECTION APPLIED
+7 7 OCEAN TIDE LOADING APPLIED
+8 8 CLIMATE QUALITY DATA PROCESSING
+9 9 NEAR-REAL TIME DATA PROCESSING
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33039.table b/definitions/bufr/tables/0/wmo/27/codetables/33039.table
new file mode 100644
index 0000000..50ff126
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33039.table
@@ -0,0 +1,9 @@
+1 1 NON-NOMINAL QUALITY
+2 2 OFFLINE PRODUCT
+3 3 ASCENDING OCCULTATION FLAG
+4 4 EXCESS PHASE PROCESSING NON-NOMINAL
+5 5 BENDING ANGLE PROCESSING NON-NOMINAL
+6 6 REFRACTIVITY PROCESSING NON-NOMINAL
+7 7 METEOROLOGICAL PROCESSING NON-NOMINAL
+14 14 BACKGROUND PROFILE NON-NOMINAL
+15 15 BACKGROUND (I.E. NOT RETRIEVED) PROFILE PRESENT
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33041.table b/definitions/bufr/tables/0/wmo/27/codetables/33041.table
new file mode 100644
index 0000000..8bbdba9
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33041.table
@@ -0,0 +1,4 @@
+0 0 THE FOLLOWING VALUE IS THE TRUE VALUE
+1 1 THE FOLLOWING VALUE IS HIGHER THAN THE TRUE VALUE (THE MEASUREMENT HIT THE LOWER LIMIT OF THE INSTRUMENT)
+2 2 THE FOLLOWING VALUE IS LOWER THAN THE TRUE VALUE (THE MEASUREMENT HIT THE HIGHER LIMIT OF THE INSTRUMENT)
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33042.table b/definitions/bufr/tables/0/wmo/27/codetables/33042.table
new file mode 100644
index 0000000..b75447a
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33042.table
@@ -0,0 +1,5 @@
+0 0 EXCLUSIVE LOWER LIMIT (>)
+1 1 INCLUSIVE LOWER LIMIT (>=)
+2 2 EXCLUSIVE UPPER LIMIT (<)
+3 3 INCLUSIVE UPPER LIMIT (=<)
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33043.table b/definitions/bufr/tables/0/wmo/27/codetables/33043.table
new file mode 100644
index 0000000..398d9ab
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33043.table
@@ -0,0 +1,4 @@
+1 1 SEA MDS.  NADIR ONLY SST RETRIEVAL USED 3.7 MICRON CHANNEL.  LAND MDS RESERVED
+2 2 SEA MDS.  DUAL VIEW SST RETRIEVAL USED 3.7 MICRON CHANNEL.  LAND MDS RESERVED
+3 3 NADIR VIEW CONTAINS DAY TIME DATA
+4 4 FORWARD VIEW CONTAINS DAY TIME DATA
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33044.table b/definitions/bufr/tables/0/wmo/27/codetables/33044.table
new file mode 100644
index 0000000..01746c7
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33044.table
@@ -0,0 +1,14 @@
+1 1 INPUT DATA MEAN OUTSIDE NOMINAL RANGE FLAG
+2 2 INPUT DATA STANDARD DEVIATION OUTSIDE NOMINAL RANGE FLAG
+3 3 NUMBER OF INPUT DATA GAPS > THRESHOLD VALUE
+4 4 PERCENTAGE OF MISSING LINES > THRESHOLD VALUE
+5 5 DOPPLER CENTROID UNCERTAIN. CONFIDENCE MEASURE < SPECIFIC VALUE
+6 6 DOPPLER AMBIGUITY ESTIMATE UNCERTAIN. CONFIDENCE MEASURE < SPECIFIC VALUE
+7 7 OUTPUT DATA MEAN OUTSIDE NOMINAL RANGE FLAG
+8 8 OUTPUT DATA STANDARD DEVIATION OUTSIDE NOMINAL RANGE FLAG
+9 9 CHIRP RECONSTRUCTION FAILED OR IS OF LOW QUALITY FLAG
+10 10 DATA SET MISSING
+11 11 INVALID DOWNLINK PARAMETERS
+12 12 AZIMUTH CUT-OFF ITERATION COUNT. THE AZIMUTH CUT-OFF FIT DID NOT CONVERGE WITHIN A MINIMUM NUMBER OF ITERATIONS
+13 13 AZIMUTH CUT-OFF FIT DID NOT CONVERGE WITHIN A MINIMUM NUMBER OF ITERATIONS
+14 14 PHASE INFORMATION CONFIDENCE MEASURE. THE IMAGINARY SPECTRAL PEAK IS LESS THAN A MINIMUM THRESHOLD, OR THE ZERO LAG SHIFT IS GREATER THAN A MINIMUM THRESHOLD
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33047.table b/definitions/bufr/tables/0/wmo/27/codetables/33047.table
new file mode 100644
index 0000000..f69b56e
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33047.table
@@ -0,0 +1,27 @@
+1 1 ERROR DETECTED AND ATTEMPTS TO RECOVER MADE
+2 2 ANOMALY IN ON-BOARD DATA HANDLING (OBDH) VALUE DETECTED
+3 3 ANOMALY IN ULTRA STABLE OSCILLATOR PROCESSING (USOP) VALUE DETECTED
+4 4 ERRORS DETECTED BY ON-BOARD COMPUTER
+5 5 AUTOMATIC GAIN CONTROL (AGC) OUT OF RANGE
+6 6 RECEPTION (RX) DELAY FAULT.  RX DISTANCE OUT OF RANGE
+7 7 WAVE FORM SAMPLES FAULT IDENTIFIER. ERROR
+8 8 S BAND ANOMALY/ERROR DETECTED
+12 12 BRIGHTNESS TEMPERATURE (CHANNEL 1) OUT OF RANGE
+13 13 BRIGHTNESS TEMPERATURE (CHANNEL 2) OUT OF RANGE
+14 14 RESERVED
+15 15 KU BAND OCEAN RETRACKING ERROR
+16 16 S BAND OCEAN RETRACKING ERROR
+17 17 KU BAND ICE 1 RETRACKING ERROR
+18 18 S BAND ICE 1 RETRACKING ERROR
+19 19 KU BAND ICE 2 RETRACKING ERROR
+20 20 S BAND ICE 2 RETRACKING ERROR
+21 21 KU BAND SEA ICE RETRACKING ERROR
+22 22 ARITHMETIC FAULT ERROR
+23 23 METEO DATA STATE. NO MAP
+24 24 METEO DATA STATE. 1 MAP
+25 25 METEO DATA STATE. 2 MAPS DEGRADED
+26 26 METEO DATA STATE. 2 MAPS NOMINAL
+27 27 ORBIT PROPAGATOR STATUS FOR PROPAGATION MODE, SEVERAL ERRORS
+28 28 ORBIT PROPAGATOR STATUS FOR PROPAGATION MODE, WARNING DETECTED
+29 29 ORBIT PROPAGATOR STATUS FOR INITIALIZATION MODE, SEVERAL ERRORS
+30 30 ORBIT PROPAGATOR STATUS FOR INITIALIZATION MODE, WARNING DETECTED
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33048.table b/definitions/bufr/tables/0/wmo/27/codetables/33048.table
new file mode 100644
index 0000000..312ba40
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33048.table
@@ -0,0 +1,4 @@
+0 0 INVERSION SUCCESSFUL
+1 1 INVERSION NOT SUCCESSFUL
+2 2 RESERVED
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33049.table b/definitions/bufr/tables/0/wmo/27/codetables/33049.table
new file mode 100644
index 0000000..bdde061
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33049.table
@@ -0,0 +1,4 @@
+0 0 EXTERNAL WIND DIRECTION USED DURING INVERSION
+1 1 EXTERNAL WIND DIRECTION NOT USED DURING INVERSION
+2 2 RESERVED
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33050.table b/definitions/bufr/tables/0/wmo/27/codetables/33050.table
new file mode 100644
index 0000000..ee7bb6d
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33050.table
@@ -0,0 +1,9 @@
+0 0 UNQUALIFIED
+1 1 CORRECT VALUE (ALL CHECKS PASSED)
+2 2 PROBABLY GOOD BUT VALUE INCONSISTENT WITH STATISTICS (DIFFER FROM CLIMATOLOGY)
+3 3 PROBABLY BAD (SPIKE, GRADIENT, ETC., IF OTHER TESTS PASSED)
+4 4 BAD VALUE, IMPOSSIBLE VALUE (OUT OF SCALE, VERTICAL INSTABILITY, CONSTANT PROFILE)
+5 5 VALUE MODIFIED DURING QUALITY CONTROL
+8 8 INTERPOLATED VALUE
+9 9 GOOD FOR OPERATIONAL USE; CAUTION; CHECK LITERATURE FOR OTHER USES
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33060.table b/definitions/bufr/tables/0/wmo/27/codetables/33060.table
new file mode 100644
index 0000000..7414302
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33060.table
@@ -0,0 +1,4 @@
+0 0 GOOD
+1 1 BAD
+2 2 RESERVED
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33070.table b/definitions/bufr/tables/0/wmo/27/codetables/33070.table
new file mode 100644
index 0000000..8a0467b
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33070.table
@@ -0,0 +1,14 @@
+0 0 GOOD RETRIEVAL
+1 1 BAD AEROSOL INFORMATION FLAG OR NOAA-16 RADIANCE ANOMALY
+2 2 SOLAR ZENITH ANGLE GREATER THAN 84 DEGREES
+3 3 380 NM RESIDUE GREATER THAN LIMIT
+4 4 OZONE INCONSISTENCY
+5 5 DIFFERENCE BETWEEN PROFILE OZONE AND STEP 3 TOTAL OZONE EXCEEDS THRESHOLD (SET TO 25 DU)
+6 6 STEP 1 OZONE ITERATION DID NOT CONVERGE
+7 7 ANY CHANNEL RESIDUE GREATER THAN 16 OR BAD RADIANCE
+8 8 INSUFFICIENT PIXELS - NOT PROCESSED
+9 9 FIRST GUESS GOOD - OZONE FORECAST DATA USED
+10 10 HIGH CLOUD IN PIXEL - NOT PROCESSED
+11 11 SUCCESSFUL OZONE RETRIEVAL
+12 12 UNSUCCESSFUL OZONE RETRIEVAL
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33071.table b/definitions/bufr/tables/0/wmo/27/codetables/33071.table
new file mode 100644
index 0000000..8c9d4de
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33071.table
@@ -0,0 +1,10 @@
+0 0 GOOD RETRIEVAL
+1 1 SOLAR ZENITH ANGLE GREATER THAN 84 DEGREES
+2 2 DIFFERENCE BETWEEN STEP 3 AND PROFILE TOTAL OZONE GREATER THAN LIMIT (25 DU)
+3 3 AVERAGE FINAL RESIDUE FOR WAVELENGTHS USED IN RETRIEVAL GREATER THAN THRESHOLD
+4 4 FINAL RESIDUE GREATER THAN 3 TIMES A PRIORI ERROR
+5 5 DIFFERENCE BETWEEN RETRIEVED AND A PRIORI GREATER THAN 3 TIMES A PRIORI ERROR
+6 6 NON-CONVERGENT SOLUTION
+7 7 UPPER LEVEL PROFILE ANOMALY OR STRAY LIGHT ANOMALY
+8 8 INITIAL RESIDUE GREATER THAN 18.0 N-VALUE UNITS
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33072.table b/definitions/bufr/tables/0/wmo/27/codetables/33072.table
new file mode 100644
index 0000000..fcc7f09
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33072.table
@@ -0,0 +1,18 @@
+0 0 GOOD RETRIEVAL
+1 1 REFLECTIVITY OUT OF RANGE
+2 2 LARGER PIXELS (NUMBER OF CROSS-TRACK PIXELS LESS THAN 32) OR BACKWARD SCANS ERROR
+3 3 SOLAR ZENITH ANGLE GREATER THAN 88 DEGREES
+4 4 LATITUDE/LONGITUDE OUT OF RANGE
+5 5 VIEWING ZENITH ANGLE OR SOLAR ZENITH ANGLE OUT OF RANGE
+6 6 STEP-ONE PROCESS FAILED IN GENERAL
+7 7 FIRST GUESS OZONE OUT OF RANGE
+8 8 TOO MANY ITERATIONS (EXCEED 8)
+9 9 STEP-ONE RESIDUE CALCULATION FAILED
+10 10 STEP-TWO PROCESS FAILED IN GENERAL
+11 11 FIRST GUESS OZONE PROFILE OUT OF RANGE
+12 12 STEP-TWO OZONE VALUE OUT OF RANGE
+13 13 STEP-TWO RESIDUE CALCULATION FAILED
+14 14 STEP-THREE PROCESS FAILED IN GENERAL
+15 15 POLARIZATION CORRECTION ACCURACY ALERT
+16 16 RADIANCE OR IRRADIANCE LESS OR EQUAL TO ZERO
+31 31 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33075.table b/definitions/bufr/tables/0/wmo/27/codetables/33075.table
new file mode 100644
index 0000000..23edae6
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33075.table
@@ -0,0 +1,5 @@
+1 1 GAP IN RAW DATA RECORD (RDR) DATA DETECTED (I.E., MISSING SCAN(S) PRECEDING THE CURRENT SCAN)
+2 2 RECORDED TIME IS NOT IN SEQUENCE (I.E., THE SCAN START TIME IS OUT OF SEQUENCE)
+3 3 LAMBDA MONITORED CALCULATION CANNOT BE UPDATED
+4 4 THE MEASURED TEMPERATURES OF ANY INSTRUMENT COMPONENTS (E.G., BEAM-SPLITTER, SCAN MIRROR, SCAN BAFFLE) ARE OUTSIDE THE ALLOWABLE RANGES
+5 5 AT LEAST ONE OF THE MONITORED INSTRUMENT TEMPERATURES HAS DRIFTED MORE THAN A SPECIFIED TOLERANCE VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33076.table b/definitions/bufr/tables/0/wmo/27/codetables/33076.table
new file mode 100644
index 0000000..7100c4a
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33076.table
@@ -0,0 +1,2 @@
+1 1 LUNAR INTRUSION ON FIRST DEEP SPACE VIEW
+2 2 LUNAR INTRUSION ON SECOND DEEP SPACE VIEW
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33077.table b/definitions/bufr/tables/0/wmo/27/codetables/33077.table
new file mode 100644
index 0000000..742c83c
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33077.table
@@ -0,0 +1,12 @@
+1 1 DEGRADED SDR* QUALITY
+2 2 INVALID SDR* QUALITY
+3 3 INVALID SDR* GEOLOCATION INFORMATION
+4 4 DEGRADED RADIOMETRIC CALIBRATION
+5 5 INVALID RADIOMETRIC CALIBRATION
+6 6 DEGRADED SPECTRAL CALIBRATION
+7 7 INVALID SPECTRAL CALIBRATION
+8 8 FRINGE COUNT ERROR DETECTED AND CORRECTED
+9 9 DAY/NIGHT INDICATOR
+10 10 INVALID RDR** DATA
+11 11 SIGNIFICANT FRINGE COUNT ERROR DETECTED
+12 12 BIT TRIM FAILED
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33078.table b/definitions/bufr/tables/0/wmo/27/codetables/33078.table
new file mode 100644
index 0000000..f3a2180
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33078.table
@@ -0,0 +1,5 @@
+0 0 NOMINAL - ALTITUDE AND EPHEMERIS DATA AVAILABLE
+1 1 MISSING AT MOST A SMALL GAP OF ALTITUDE AND EPHEMERIS DATA
+2 2 MISSING MORE THAN A SMALL GAP OF ALTITUDE AND EPHEMERIS DATA, BUT NO MORE THAN A GRANULE BOUNDARY
+3 3 MISSING MORE THAN A GRANULE BOUNDARY OF ALTITUDE AND EPHEMERIS DATA
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33079.table b/definitions/bufr/tables/0/wmo/27/codetables/33079.table
new file mode 100644
index 0000000..0875143
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33079.table
@@ -0,0 +1,10 @@
+6 6 THE NO. 1-NO. 7 HEALTH CHECKS FAILED
+7 7 THE NO. 8-NO. 15 HEALTH CHECKS FAILED
+8 8 THE NO. 16-NO. 23 HEALTH CHECKS FAILED
+9 9 THE NO. 24-NO. 31 HEALTH CHECKS FAILED
+10 10 THE NO. 32-NO. 39 HEALTH CHECKS FAILED
+11 11 THE NO. 40-NO. 47 HEALTH CHECKS FAILED
+12 12 THE NO. 48-NO. 55 HEALTH CHECKS FAILED
+13 13 THE NO. 56-NO. 63 HEALTH CHECKS FAILED
+14 14 THE NO. 64-NO. 70 HEALTH CHECKS FAILED
+15 15 QUADRATIC CORRECTION APPLIED TO THE RADIOMETRIC TRANSFER FUNCTION FOR NON-LINEARITY CORRECTION
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33080.table b/definitions/bufr/tables/0/wmo/27/codetables/33080.table
new file mode 100644
index 0000000..a39dd47
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33080.table
@@ -0,0 +1,13 @@
+7 7 DIVIDE-BY-ZERO CONDITION OR COMPUTATION LOOP FAILED TO CONVERGE IN THE K/KA AND V (KAV) BAND PRT
+8 8 DIVIDE-BY-ZERO CONDITION OR COMPUTATION LOOP FAILED TO CONVERGE IN THE WG BAND PRT
+9 9 DIVIDE-BY-ZERO CONDITION OR COMPUTATION LOOP FAILED TO CONVERGE IN THE K/KA, V, W, G BAND RECEIVER SHELF PRT K TEMPERATURE COMPUTATION
+10 10 OUT OF RANGE CONDITION FOR THE K/KA AND V BAND PRT
+11 11 OUT OF RANGE CONDITION FOR THE WG BAND PRT
+12 12 KAV PRT TEMPERATURE INCONSISTENCY
+13 13 WG PRT TEMPERATURE INCONSISTENCY
+14 14 TIME SEQUENCE ERROR
+15 15 DATA GAP - MISSING SCAN(S) PRECEDING THE CURRENT SCAN
+16 16 KAV PRT SUFFICIENCY - INSUFFICIENT KAV PRT DATA ARE AVAILABLE
+17 17 WG PRT SUFFICIENCY - INSUFFICIENT WG PRT DATA ARE AVAILABLE
+18 18 SPACE VIEW ANTENNA POSITION ERROR
+19 19 BLACKBODY ANTENNA POSITION ERROR
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33081.table b/definitions/bufr/tables/0/wmo/27/codetables/33081.table
new file mode 100644
index 0000000..f8759e0
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33081.table
@@ -0,0 +1,9 @@
+3 3 MOON IN SPACE VIEW
+4 4 GAIN ERROR - THE LOWEST BLACKBODY COUNT IS SMALLER THAN OR EQUAL TO THE HIGHEST SPACE VIEW COUNT IN A SCAN
+5 5 CALIBRATION WITH FEWER THAN PREFERRED SAMPLES
+6 6 SPACE VIEW DATA SUFFICIENCY CHECK - INSUFFICIENT SPACE VIEW SAMPLES ARE AVAILABLE
+7 7 BLACKBODY VIEW DATA SUFFICIENCY CHECK - INSUFFICIENT BLACKBODY VIEW SAMPLES ARE AVAILABLE
+8 8 OUT OF RANGE CONDITION FOR THE SPACE VIEW
+9 9 OUT OF RANGE CONDITION FOR THE BLACKBODY VIEW
+10 10 SPACE VIEW INCONSISTENCY
+11 11 BLACKBODY VIEW INCONSISTENCY
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33082.table b/definitions/bufr/tables/0/wmo/27/codetables/33082.table
new file mode 100644
index 0000000..4671574
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33082.table
@@ -0,0 +1,10 @@
+6 6 WITHIN SOUTH ATLANTIC ANOMALY
+7 7 INVALID INPUT DATA (INDICATES THAT ANY OF THE SPACECRAFT EPHEMERIS OR ATTITUDE DATA ARE INVALID)
+8 8 BAD POINTING (INDICATES THAT THE SENSOR LOS DOES NOT INTERSECT THE GEOID, IS NEAR THE LIMB, HAS INVALID SENSOR ANGLES OR OTHER SIMILAR CONDITION)
+9 9 BAD TERRAIN (INDICATES THAT THE ALGORITHM COULD NOT OBTAIN A VALID TERRAIN VALUE)
+10 10 INVALID SOLAR ANGLES
+11 11 MISSING AT MOST A SMALL GAP OF ALTITUDE AND EPHEMERIS DATA
+12 12 MISSING MORE THAN A SMALL GAP OF ALTITUDE AND EPHEMERIS DATA, BUT NO MORE THAN A GRANULE BOUNDARY
+13 13 MISSING MORE THAN A GRANULE BOUNDARY OF ALTITUDE AND EPHEMERIS DATA
+14 14 THE NUMBER OF ENCODER PULSE VALUES PER DELTA TIME IS NOT AS EXPECTED
+15 15 SOLAR ECLIPSE DURING EARTH VIEW SCAN
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33083.table b/definitions/bufr/tables/0/wmo/27/codetables/33083.table
new file mode 100644
index 0000000..6fe63f6
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33083.table
@@ -0,0 +1,10 @@
+6 6 PIXEL IS AFFECTED BY RADIO-FREQUENCY INTERFERENCE
+7 7 POOR CALIBRATION QUALITY DUE TO BAD SPACE VIEW OFFSETS, OBC * VIEW OFFSETS, ETC. OR USE OF A PREVIOUS CALIBRATION VIEW
+8 8 SATURATED PIXEL
+9 9 MISSING DATA -DATA REQUIRED FOR CALIBRATION PROCESSING ARE NOT AVAILABLE FOR PROCESSING
+10 10 CALIBRATED PIXEL RADIANCE OUT OF RANGE
+11 11 CALIBRATED PIXEL REFLECTANCE OR EBBT OUT OF RANGE
+12 12 THE MOON HAS CORRUPTED THE SPACE VIEW
+13 13 SCAN DATA IS NOT PRESENT (NO VALID DATA)
+14 14 QUALITY FOR THIS SCAN-LINE IS REDUCED. THE VALUE IS DETERMINED BY THE COMBINED NUMBER OF STEPS REQUIRED TO FIND A REPLACEMENT FOR THERMISTOR OR CALIBRATION SOURCE DATA
+15 15 BAD DETECTOR
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33084.table b/definitions/bufr/tables/0/wmo/27/codetables/33084.table
new file mode 100644
index 0000000..accb209
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33084.table
@@ -0,0 +1,10 @@
+6 6 BULK SST OUTSIDE OF VALIDATION RANGE
+7 7 SKIN SST OUTSIDE OF VALIDATION RANGE
+8 8 SENSOR ZENITH ANGLE > 40 DEGREES (PIXEL IS NOT WITHIN 40 DEGREES OF NADIR AND THEREFORE IS NOT OF HIGH QUALITY)
+9 9 DEGRADATION - HORIZONTAL CELL SIZE (HCS) > 1.3 KM (HCS > 1.3 KM, SWATH WIDTH > 1 700 KM, SENSOR ZENITH ANGLE > 50.3 DEGREES)
+10 10 EXCLUSION: NO OCEAN IN PIXEL
+11 11 DEGRADATION: AEROSOL OPTICAL THICKNESS (AOT) > 0.6 (AOT IN HORIZONTAL CELL > 0.6 ON THE SLANT PATH (AOT @550 NM))
+12 12 EXCLUSION: AOT > 1.0 (AOT IN HORIZONTAL CELL > 1.0 ON THE SLANT PATH (AOT @550 NM))
+13 13 SUN GLINT PRESENT IN PIXEL
+14 14 ICE CONCENTRATION THRESHOLD EXCEEDED (SST NOT RETRIEVED DUE TO ICE CONCENTRATION EXCEEDING THRESHOLD IN SYSTEM SPEC)
+15 15 THIN CIRRUS DETECTED IN PIXEL
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33085.table b/definitions/bufr/tables/0/wmo/27/codetables/33085.table
new file mode 100644
index 0000000..7962ec5
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33085.table
@@ -0,0 +1,14 @@
+4 4 ANGSTROM EXPONENT IS OUTSIDE OF THE SYSTEM SPECIFICATION RANGE
+5 5 EXCLUDED, ANGSTROM EXPONENT FOR AOT* AT 550 NM < 0.15
+6 6 BRIGHT SURFACE IN CELL (IF OVER LAND), OR SHALLOW OR TURBID WATER IN CELL (IF OVER OCEAN)
+7 7 LOW SUN, EXCLUDED, SOLAR ZENITH ANGLE > 80 DEGREES
+8 8 LOW SUN, DEGRADED, 65 DEGREES < SOLAR ZENITH ANGLE <= 80 DEGREES
+9 9 FIRE DETECTED IN CELL
+10 10 SNOW/ICE IN CELL
+11 11 CLOUD SHADOW IN CELL
+12 12 SUN GLINT IN CELL
+13 13 BAD SDR** DATA PRESENT IN HORIZONTAL CELL (QUALITY OF AOT/APSP*** DEGRADED OR AOT/APSP NOT RETRIEVED DUE TO BAD SDR DATA IN HORIZONTAL CELL)
+14 14 CIRRUS CONTAMINATION IN CELL
+15 15 CLOUD ADJACENT TO CELL
+16 16 CLOUD CONTAMINATION IN CELL
+17 17 AOT IS OUTSIDE OF THE SYSTEM SPECIFICATION RANGE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33086.table b/definitions/bufr/tables/0/wmo/27/codetables/33086.table
new file mode 100644
index 0000000..b7cda32
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33086.table
@@ -0,0 +1,5 @@
+0 0 NOT RETRIEVED
+1 1 EXCLUDED
+2 2 DEGRADED
+3 3 HIGH QUALITY
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33087.table b/definitions/bufr/tables/0/wmo/27/codetables/33087.table
new file mode 100644
index 0000000..f3000e2
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33087.table
@@ -0,0 +1,10 @@
+0 0 LESS THAN OR EQUAL TO 10%
+1 1 GREATER THAN 10% BUT LESS THAN OR EQUAL TO 20%
+2 2 GREATER THAN 20% BUT LESS THAN OR EQUAL TO 30%
+3 3 GREATER THAN 30% BUT LESS THAN OR EQUAL TO 40%
+4 4 GREATER THAN 40% BUT LESS THAN OR EQUAL TO 50%
+5 5 GREATER THAN 50% BUT LESS THAN OR EQUAL TO 60%
+6 6 GREATER THAN 60% BUT LESS THAN OR EQUAL TO 70%
+7 7 GREATER THAN 70% BUT LESS THAN OR EQUAL TO 80%
+8 8 GREATER THAN 80%
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/33088.table b/definitions/bufr/tables/0/wmo/27/codetables/33088.table
new file mode 100644
index 0000000..8f7b539
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/33088.table
@@ -0,0 +1,12 @@
+6 6 SURFACE REFLECTIVITY OUT OF RANGE
+7 7 RESIDUAL TOO LARGE
+8 8 AEROSOL INDEX LIMIT EXCEEDED
+9 9 SOLAR ECLIPSE PRESENT (ALL OR PART OF THE IFOV* IS AFFECTED BY A SOLAR ECLIPSE, UMBRA OR PENUMBRA VIEWING)
+10 10 SUN GLINT PRESENT WITHIN IFOV
+11 11 SNOW OR ICE SURFACE IS WITHIN THE IFOV
+12 12 SOLAR ZENITH ANGLE IN EXCLUDED (NIGHT) CONDITION (SOLAR ZENITH ANGLE >= 88 DEGREES)
+13 13 SOLAR ZENITH ANGLE IN DEGRADED CONDITION (80 DEGREES <= SOLAR ZENITH ANGLE < 88 DEGREES)
+14 14 SO2 INDEX > 6 DU (DEGRADED CONDITION)
+15 15 RESIDUES ARE NOT CONSISTENT (INDICATES WHETHER THE RESIDUES FROM THE 22 WAVELENGTHS ARE CONSISTENT)
+16 16 O3 TRIPLET SELECTION IS NOT CONSISTENT WITHIN RETRIEVAL (OZONE TRIPLET CONSISTENCY)
+17 17 INPUT DATA QUALITY IS NOT GOOD
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/35000.table b/definitions/bufr/tables/0/wmo/27/codetables/35000.table
new file mode 100644
index 0000000..8c57023
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/35000.table
@@ -0,0 +1 @@
+1023 1023 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/35001.table b/definitions/bufr/tables/0/wmo/27/codetables/35001.table
new file mode 100644
index 0000000..bba0c81
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/35001.table
@@ -0,0 +1,4 @@
+0 0 REAL TIME
+1 1 NEAR-REAL TIME
+2 2 NON-REAL TIME
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/35030.table b/definitions/bufr/tables/0/wmo/27/codetables/35030.table
new file mode 100644
index 0000000..5b83f8b
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/35030.table
@@ -0,0 +1,10 @@
+0 0 NO DISCREPANCIES
+1 1 NON-COMPLIANCE WITH STANDARD AND RECOMMENDED PRACTICES AND PROCEDURES INCLUDING THOSE OF MONITORING
+2 2 CATALOGUES OF METEOROLOGICAL BULLETINS NOT UPDATED IN A TIMELY MANNER
+3 3 INCORRECT ROUTING DIRECTORIES
+4 4 LACK OF FLEXIBILITY IN THE ROUTING ARRANGEMENTS
+5 5 DEFICIENCIES IN THE OPERATION OF GTS CENTRES AND CIRCUITS
+6 6 LOSS OF DATA OR DELAYS IN RELAYING DATA ON THE GTS
+7 7 ROUTING OF DATA DIFFERENT FROM THE ROUTING PROVIDED IN THE PLAN
+8 8 VARIOUS MALPRACTICES
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/35031.table b/definitions/bufr/tables/0/wmo/27/codetables/35031.table
new file mode 100644
index 0000000..bdd705d
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/35031.table
@@ -0,0 +1,20 @@
+1 1 SUFFICIENT AND ALL OF ACCEPTABLE QUALITY
+2 2 SUFFICIENT BUT PARTLY OF ACCEPTABLE QUALITY
+3 3 INSUFFICIENT BUT ALL OF ACCEPTABLE QUALITY
+4 4 INSUFFICIENT AND OF UNACCEPTABLE QUALITY
+5 5 SOME MESSAGES NOT COMPLETE
+6 6 SUSPECT OR WRONGLY CODED GROUPS COULD NOT BE INTERPRETED CONFIDENTLY
+7 7 GROSS CODING ERRORS
+8 8 TRANSMISSION SEQUENTIAL ORDER NOT OBSERVED
+9 9 REPORT COMPLETELY GARBLED AND THUS DISCARDED
+10 10 DEFICIENCIES IDENTIFIED AND RECTIFIED
+11 11 DEFICIENCIES IDENTIFIED BUT NOT RECTIFIED
+12 12 DEFICIENCIES NOT IDENTIFIED
+13 13 MEASURING ERRORS
+14 14 MUTUAL INCONSISTENCY
+15 15 TEMPORAL INCONSISTENCY
+16 16 FORECAST ERROR
+17 17 BIAS
+18 18 IMPROVE SYSTEM OF QUALITY CONTROL
+19 19 EXPAND TRAINING PROGRAMMES
+127 127 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/35032.table b/definitions/bufr/tables/0/wmo/27/codetables/35032.table
new file mode 100644
index 0000000..7f53a05
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/35032.table
@@ -0,0 +1,10 @@
+1 1 DATA GROUPS MISSING DUE TO RADIO FADING
+2 2 DATA GROUPS MISSING DUE TO OUTAGE OF CENTRE
+3 3 DATA GROUPS MISSING DUE TO OUTAGE OF CIRCUIT
+4 4 NON-IMPLEMENTATION OR MAINTENANCE OF REQUIRED RBSN DENSITY
+5 5 SHORTAGE OF QUALIFIED STAFF TO MAN STATIONS
+6 6 LACK OF CONSUMABLES
+7 7 INSTRUMENT FAILURE
+8 8 NON-ADHERENCE TO TELECOMMUNICATION PROCEDURES
+9 9 SOME OBSERVING PROGRAMMES CEASED
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/35033.table b/definitions/bufr/tables/0/wmo/27/codetables/35033.table
new file mode 100644
index 0000000..86e9592
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/35033.table
@@ -0,0 +1,12 @@
+1 1 NO DEFICIENCY
+2 2 OBSERVATIONS NOT MADE REGULARLY
+3 3 OBSERVATIONS NOT MADE AT RIGHT TIME
+4 4 OBSERVATIONS MADE BUT NOT DISSEMINATED
+5 5 OBSERVATIONS MADE AND SENT TO INCORRECT USERS
+6 6 COLLECTION NOT RECEIVED
+7 7 COLLECTION TRANSMITTED LATE
+8 8 COLLECTION NOT TRANSMITTED
+9 9 DIFFICULTIES IN HF PROPAGATION AND SELECTION OF SUITABLE FREQUENCY
+10 10 DIFFICULTIES IN MAINTENANCE OF COMMUNICATION EQUIPMENT AT REMOTE STATIONS
+11 11 NO ALTERNATIVE ARRANGEMENT FOR ROUTING METEOROLOGICAL OBSERVATION
+123 123 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/35034.table b/definitions/bufr/tables/0/wmo/27/codetables/35034.table
new file mode 100644
index 0000000..7297664
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/35034.table
@@ -0,0 +1,7 @@
+1 1 SLIGHT IMPROVEMENT
+2 2 SIGNIFICANT IMPROVEMENT
+3 3 MOST SIGNIFICANT IMPROVEMENT
+4 4 STEADY
+5 5 DECREASING
+6 6 EFFORTS REQUIRED TO IMPROVE NIGHT-TIME OBSERVATIONS
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/35035.table b/definitions/bufr/tables/0/wmo/27/codetables/35035.table
new file mode 100644
index 0000000..0fce6dd
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/35035.table
@@ -0,0 +1,20 @@
+0 0 RESERVED
+1 1 BALLOON BURST
+2 2 BALLOON FORCED DOWN BY ICING
+3 3 LEAKING OR FLOATING BALLOON
+4 4 WEAK OR FADING SIGNAL
+5 5 BATTERY FAILURE
+6 6 GROUND EQUIPMENT FAILURE
+7 7 SIGNAL INTERFERENCE
+8 8 RADIOSONDE FAILURE
+9 9 EXCESSIVE MISSING DATA FRAMES
+10 10 RESERVED
+11 11 EXCESSIVE MISSING TEMPERATURE
+12 12 EXCESSIVE MISSING PRESSURE
+13 13 USER TERMINATED
+14 14 SUDDEN LOSS OF SIGNAL
+15 15 TRACKING LOST
+16 16 INCREASING PRESSURE
+17 17 INVALID AND/OR MISSED DATA TIME LIMITS EXCEEDED
+30 30 OTHER
+31 31 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/40005.table b/definitions/bufr/tables/0/wmo/27/codetables/40005.table
new file mode 100644
index 0000000..045a4f1
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/40005.table
@@ -0,0 +1,5 @@
+1 1 SOIL MOISTURE BETWEEN -20% AND 0%
+2 2 SOIL MOISTURE BETWEEN 100% AND 120%
+3 3 CORRECTION OF WET BACKSCATTER REFERENCE
+4 4 CORRECTION OF DRY BACKSCATTER REFERENCE
+5 5 CORRECTION OF VOLUME SCATTERING IN SAND
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/40006.table b/definitions/bufr/tables/0/wmo/27/codetables/40006.table
new file mode 100644
index 0000000..d53382e
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/40006.table
@@ -0,0 +1,8 @@
+1 1 NOT SOIL
+2 2 SENSITIVITY TO SOIL MOISTURE BELOW LIMIT
+3 3 AZIMUTHAL NOISE ABOVE LIMIT
+4 4 BACKSCATTER FORE-AFT BEAM OUT OF RANGE
+5 5 SLOPE MID-FORE BEAM OUT OF RANGE
+6 6 SLOPE MID-AFT BEAM OUT OF RANGE
+7 7 SOIL MOISTURE BELOW -20%
+8 8 SOIL MOISTURE ABOVE 120%
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/40011.table b/definitions/bufr/tables/0/wmo/27/codetables/40011.table
new file mode 100644
index 0000000..ddc7e86
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/40011.table
@@ -0,0 +1,4 @@
+1 1 MEAN SEA-SURFACE (MSS) INTERPOLATION FLAG
+2 2 OCEAN TIDE SOLUTION 1 INTERPOLATION FLAG (0 = 4 POINTS OVER OCEAN, 1 = LESS THAN 4 POINTS)
+3 3 OCEAN TIDE SOLUTION 2 INTERPOLATION FLAG (0 = 4 POINTS OVER OCEAN, 1 = LESS THAN 4 POINTS)
+4 4 METEOROLOGICAL DATA INTERPOLATION FLAG (0 = 4 POINTS OVER OCEAN, 1 = LESS THAN 4 POINTS)
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/40012.table b/definitions/bufr/tables/0/wmo/27/codetables/40012.table
new file mode 100644
index 0000000..d8ce14d
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/40012.table
@@ -0,0 +1,3 @@
+1 1 18.7 GHZ BRIGHTNESS TEMPERATURE
+2 2 23.8 GHZ BRIGHTNESS TEMPERATURE
+3 3 34 GHZ BRIGHTNESS TEMPERATURE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/40013.table b/definitions/bufr/tables/0/wmo/27/codetables/40013.table
new file mode 100644
index 0000000..79b991a
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/40013.table
@@ -0,0 +1,5 @@
+0 0 INTERPOLATION WITH NO GAP BETWEEN JMR* DATA
+1 1 INTERPOLATION WITH GAPS BETWEEN JMR* DATA
+2 2 EXTRAPOLATION OF JMR* DATA
+3 3 FAILURE OF EXTRAPOLATION AND INTERPOLATION
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/40020.table b/definitions/bufr/tables/0/wmo/27/codetables/40020.table
new file mode 100644
index 0000000..fa1d1f5
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/40020.table
@@ -0,0 +1,16 @@
+1 1 NZPD AND COMPLEX CALIBRATION ERROR
+2 2 BAND 3 AFFECTED BY SPIKE
+3 3 BAND 3 AFFECTED BY SATURATION
+4 4 BAND 2 AFFECTED BY SPIKE
+5 5 BAND 1 AFFECTED BY SPIKE
+6 6 OVERFLOW/UNDER FLOW
+7 7 ON-BOARD PROCESSING ERROR
+8 8 SPECTRAL CALIBRATION ERROR
+9 9 RADIOMETRIC CALIBRATION ERROR
+10 10 MISSING AVHRR DATA
+11 11 MISSING IIS DATA
+12 12 MISSING SOUNDER DATA
+13 13 GQISFLAGQUAL SUMMARY FLAG FOR ALL BANDS
+14 14 ON-GROUND PROCESSING ERROR
+15 15 INTER-CALIBRATION ERROR IASI/AVHRR
+16 16 SPARE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/40023.table b/definitions/bufr/tables/0/wmo/27/codetables/40023.table
new file mode 100644
index 0000000..2e4cbfb
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/40023.table
@@ -0,0 +1,4 @@
+1 1 BAND SEQUENCE (0 = 3KU_1C_3KU, 1 = 2KU_1C_2KU)
+2 2 C BAND FREQUENCY (0 = 320 MHZ, 1 = 100 MHZ)
+3 3 C BAND STATUS (0 = ON, 1 = OFF)
+4 4 KU BAND STATUS (0 = ON, 1 = OFF)
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/40024.table b/definitions/bufr/tables/0/wmo/27/codetables/40024.table
new file mode 100644
index 0000000..c8421e5
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/40024.table
@@ -0,0 +1,5 @@
+0 0 2 MAPS AVAILABLE (6 HOURS APART)
+1 1 2 MAPS AVAILABLE (> 6 HOURS APART)
+2 2 1 MAP AVAILABLE; DATA EXTRAPOLATED
+3 3 NO MAPS USED
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/40025.table b/definitions/bufr/tables/0/wmo/27/codetables/40025.table
new file mode 100644
index 0000000..7414302
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/40025.table
@@ -0,0 +1,4 @@
+0 0 GOOD
+1 1 BAD
+2 2 RESERVED
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/40028.table b/definitions/bufr/tables/0/wmo/27/codetables/40028.table
new file mode 100644
index 0000000..e094f29
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/40028.table
@@ -0,0 +1,16 @@
+0 0 GOOD DATA
+1 1 POSSIBLE SUN GLINT
+2 2 POSSIBLE RADIO-FREQUENCY INTERFERENCE
+3 3 DEGRADED GEOLOCATION DATA
+4 4 DATA CORRECTED FOR WARM LOAD INTRUSION
+5 5 SCAN BLANKING ON
+6 6 DATA IS MISSING FROM FILE OR UNREADABLE
+7 7 UNPHYSICAL BRIGHTNESS TEMPERATURE
+8 8 ERROR IN GEOLOCATION DATA
+9 9 DATA MISSING IN ONE CHANNEL
+10 10 DATA MISSING IN MULTIPLE CHANNELS
+11 11 LAT/LON VALUES ARE OUT OF RANGE
+12 12 NON-NORMAL STATUS MODES
+13 13 DISTANCE TO CORRESPONDING LOW FREQUENCY PIXEL > 7 KM
+14 14 RESERVED
+15 15 MISSING VALUE (NO QUALITY INFORMATION AVAILABLE)
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/40036.table b/definitions/bufr/tables/0/wmo/27/codetables/40036.table
new file mode 100644
index 0000000..9a5418e
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/40036.table
@@ -0,0 +1,3 @@
+0 0 CLEAR
+1 1 CLOUD
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/4059.table b/definitions/bufr/tables/0/wmo/27/codetables/4059.table
new file mode 100644
index 0000000..91fc6f4
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/4059.table
@@ -0,0 +1,5 @@
+1 1 0000 UTC
+2 2 0600 UTC
+3 3 1200 UTC
+4 4 1800 UTC
+5 5 OTHER HOURS
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/4080.table b/definitions/bufr/tables/0/wmo/27/codetables/4080.table
new file mode 100644
index 0000000..84caf21
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/4080.table
@@ -0,0 +1,6 @@
+0 0 SPOT VALUES
+1 1 LESS THAN 15 MINUTES
+2 2 FROM 15 TO 45 MINUTES
+3 3 MORE THAN 45 MINUTES
+9 9 DATA NOT AVAILABLE
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/42004.table b/definitions/bufr/tables/0/wmo/27/codetables/42004.table
new file mode 100644
index 0000000..a846810
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/42004.table
@@ -0,0 +1,3 @@
+0 0 WAVE DIRECTION RESOLVED
+1 1 180-DEGREE AMBIGUITY NOT RESOLVE
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/5069.table b/definitions/bufr/tables/0/wmo/27/codetables/5069.table
new file mode 100644
index 0000000..e267747
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/5069.table
@@ -0,0 +1,4 @@
+0 0 MIE
+1 1 RAYLEIGH
+2 2 RESERVED
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8001.table b/definitions/bufr/tables/0/wmo/27/codetables/8001.table
new file mode 100644
index 0000000..6210da3
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8001.table
@@ -0,0 +1,6 @@
+1 1 SURFACE
+2 2 STANDARD LEVEL
+3 3 TROPOPAUSE LEVEL
+4 4 MAXIMUM WIND LEVEL
+5 5 SIGNIFICANT LEVEL, TEMPERATURE AND/OR RELATIVE HUMIDITY
+6 6 SIGNIFICANT LEVEL, WIND
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8002.table b/definitions/bufr/tables/0/wmo/27/codetables/8002.table
new file mode 100644
index 0000000..6ab4fd7
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8002.table
@@ -0,0 +1,19 @@
+0 0 OBSERVING RULES FOR BASE OF LOWEST CLOUD AND CLOUD TYPES OF FM 12 SYNOP AND FM 13 SHIP APPLY
+1 1 FIRST NON-CUMULONIMBUS SIGNIFICANT LAYER
+2 2 SECOND NON-CUMULONIMBUS SIGNIFICANT LAYER
+3 3 THIRD NON-CUMULONIMBUS SIGNIFICANT LAYER
+4 4 CUMULONIMBUS LAYER
+5 5 CEILING
+6 6 CLOUDS NOT DETECTED BELOW THE FOLLOWING HEIGHT(S)
+7 7 LOW CLOUD
+8 8 MIDDLE CLOUD
+9 9 HIGH CLOUD
+10 10 CLOUD LAYER WITH BASE BELOW AND TOP ABOVE THE STATION
+11 11 CLOUD LAYER WITH BASE AND TOP BELOW THE STATION LEVEL
+20 20 NO CLOUDS DETECTED BY THE CLOUD DETECTION SYSTEM
+21 21 FIRST INSTRUMENT DETECTED CLOUD LAYER
+22 22 SECOND INSTRUMENT DETECTED CLOUD LAYER
+23 23 THIRD INSTRUMENT DETECTED CLOUD LAYER
+24 24 FOURTH INSTRUMENT DETECTED CLOUD LAYER
+62 62 VALUE NOT APPLICABLE
+63 63 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8003.table b/definitions/bufr/tables/0/wmo/27/codetables/8003.table
new file mode 100644
index 0000000..3731351
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8003.table
@@ -0,0 +1,12 @@
+0 0 SURFACE
+1 1 BASE OF SATELLITE SOUNDING
+2 2 CLOUD TOP
+3 3 TROPOPAUSE
+4 4 PRECIPITABLE WATER
+5 5 SOUNDING RADIANCES
+6 6 MEAN TEMPERATURES
+7 7 OZONE
+8 8 LOW CLOUD
+9 9 MED CLOUD
+10 10 HIGH CLOUD
+63 63 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8004.table b/definitions/bufr/tables/0/wmo/27/codetables/8004.table
new file mode 100644
index 0000000..2a8925e
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8004.table
@@ -0,0 +1,6 @@
+2 2 UNSTEADY (UNS)
+3 3 LEVEL FLIGHT, ROUTINE OBSERVATION (LVR)
+4 4 LEVEL FLIGHT, HIGHEST WIND ENCOUNTERED (LVW)
+5 5 ASCENDING (ASC)
+6 6 DESCENDING (DES)
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8005.table b/definitions/bufr/tables/0/wmo/27/codetables/8005.table
new file mode 100644
index 0000000..587ea99
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8005.table
@@ -0,0 +1,7 @@
+0 0 RESERVED
+1 1 STORM CENTRE
+2 2 OUTER LIMIT OR EDGE OF STORM
+3 3 LOCATION OF MAXIMUM WIND
+4 4 LOCATION OF THE STORM IN THE PERTURBED ANALYSIS
+5 5 LOCATION OF THE STORM IN THE ANALYSIS
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8006.table b/definitions/bufr/tables/0/wmo/27/codetables/8006.table
new file mode 100644
index 0000000..9f56c62
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8006.table
@@ -0,0 +1,8 @@
+1 1 SURFACE
+2 2 STANDARD LEVEL
+3 3 TROPOPAUSE LEVEL
+4 4 PROMINENT MAXIMUM LEVEL
+5 5 PROMINENT MINIMUM LEVEL
+6 6 MINIMUM PRESSURE LEVEL
+7 7 RESERVED
+8 8 LEVEL OF UNDETERMINED SIGNIFICANCE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8007.table b/definitions/bufr/tables/0/wmo/27/codetables/8007.table
new file mode 100644
index 0000000..3e4d2cc
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8007.table
@@ -0,0 +1,5 @@
+0 0 POINT
+1 1 LINE
+2 2 AREA
+3 3 VOLUME
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8008.table b/definitions/bufr/tables/0/wmo/27/codetables/8008.table
new file mode 100644
index 0000000..2714b5a
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8008.table
@@ -0,0 +1,8 @@
+1 1 SURFACE
+2 2 STANDARD LEVEL
+3 3 TROPOPAUSE LEVEL
+4 4 LEVEL OF BETA RADIATION MAXIMUM
+5 5 LEVEL OF GAMMA RADIATION MAXIMUM
+6 6 MINIMUM PRESSURE LEVEL
+7 7 RESERVED
+8 8 LEVEL OF UNDETERMINED SIGNIFICANCE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8009.table b/definitions/bufr/tables/0/wmo/27/codetables/8009.table
new file mode 100644
index 0000000..b033982
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8009.table
@@ -0,0 +1,16 @@
+0 0 LEVEL FLIGHT, ROUTINE OBSERVATION, UNSTEADY
+1 1 LEVEL FLIGHT, HIGHEST WIND ENCOUNTERED, UNSTEADY
+2 2 UNSTEADY (UNS)
+3 3 LEVEL FLIGHT, ROUTINE OBSERVATION (LVR)
+4 4 LEVEL FLIGHT, HIGHEST WIND ENCOUNTERED (LVW)
+5 5 ASCENDING (ASC)
+6 6 DESCENDING (DES)
+7 7 ASCENDING, OBSERVATION INTERVALS SELECTED BY TIME INCREMENTS
+8 8 ASCENDING, OBSERVATION INTERVALS SELECTED BY TIME INCREMENTS, UNSTEADY
+9 9 ASCENDING, OBSERVATION INTERVALS SELECTED BY PRESSURE INCREMENTS
+10 10 ASCENDING, OBSERVATION INTERVALS SELECTED BY PRESSURE INCREMENTS, UNSTEADY
+11 11 DESCENDING, OBSERVATION INTERVALS SELECTED BY TIME INCREMENTS
+12 12 DESCENDING, OBSERVATION INTERVALS SELECTED BY TIME INCREMENTS, UNSTEADY
+13 13 DESCENDING, OBSERVATION INTERVALS SELECTED BY PRESSURE INCREMENTS
+14 14 DESCENDING, OBSERVATION INTERVALS SELECTED BY PRESSURE INCREMENTS, UNSTEADY
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8010.table b/definitions/bufr/tables/0/wmo/27/codetables/8010.table
new file mode 100644
index 0000000..3c5fe71
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8010.table
@@ -0,0 +1,14 @@
+0 0 RESERVED
+1 1 BARE SOIL
+2 2 BARE ROCK
+3 3 LAND GRASS COVER
+4 4 WATER (LAKE, SEA)
+5 5 FLOOD WATER UNDERNEATH
+6 6 SNOW
+7 7 ICE
+8 8 RUNWAY OR ROAD
+9 9 SHIP OR PLATFORM DECK IN STEEL
+10 10 SHIP OR PLATFORM DECK IN WOOD
+11 11 SHIP OR PLATFORM DECK PARTLY COVERED WITH RUBBER MAT
+12 12 BUILDING ROOF
+31 31 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8011.table b/definitions/bufr/tables/0/wmo/27/codetables/8011.table
new file mode 100644
index 0000000..e7a8221
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8011.table
@@ -0,0 +1,27 @@
+0 0 QUASI-STATIONARY FRONT AT THE SURFACE
+1 1 QUASI-STATIONARY FRONT ABOVE THE SURFACE
+2 2 WARM FRONT AT THE SURFACE
+3 3 WARM FRONT ABOVE THE SURFACE
+4 4 COLD FRONT AT THE SURFACE
+5 5 COLD FRONT ABOVE THE SURFACE
+6 6 OCCLUSION
+7 7 INSTABILITY LINE
+8 8 INTERTROPICAL FRONT
+9 9 CONVERGENCE LINE
+10 10 JET STREAM
+11 11 CLOUD CLEAR
+12 12 CLOUD
+13 13 TURBULENCE
+14 14 STORM
+15 15 AIRFRAME ICING
+16 16 PHENOMENON
+17 17 VOLCANO
+18 18 ATMOSPHERICS
+19 19 RESERVED
+20 20 SPECIAL CLOUDS
+21 21 THUNDERSTORM
+22 22 TROPICAL CYCLONE
+23 23 MOUNTAIN WAVE
+24 24 DUSTSTORM
+25 25 SANDSTORM
+63 63 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8012.table b/definitions/bufr/tables/0/wmo/27/codetables/8012.table
new file mode 100644
index 0000000..769bc0b
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8012.table
@@ -0,0 +1,4 @@
+0 0 LAND
+1 1 SEA
+2 2 COAST
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8013.table b/definitions/bufr/tables/0/wmo/27/codetables/8013.table
new file mode 100644
index 0000000..e18d295
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8013.table
@@ -0,0 +1,4 @@
+0 0 NIGHT
+1 1 DAY
+2 2 TWILIGHT
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8014.table b/definitions/bufr/tables/0/wmo/27/codetables/8014.table
new file mode 100644
index 0000000..e6f2e46
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8014.table
@@ -0,0 +1,10 @@
+0 0 10-MINUTE MEAN VALUE - NORMAL VALUE
+1 1 10-MINUTE MEAN VALUE - ABOVE THE UPPER LIMIT FOR ASSESSMENTS OF RVR (P)
+2 2 10-MINUTE MEAN VALUE - BELOW THE LOWER LIMIT FOR ASSESSMENTS OF RVR (M)
+3 3 ONE-MINUTE MINIMUM VALUE - NORMAL VALUE
+4 4 ONE-MINUTE MINIMUM VALUE - ABOVE THE UPPER LIMIT FOR ASSESSMENTS OF RVR (P)
+5 5 ONE-MINUTE MINIMUM VALUE - BELOW THE LOWER LIMIT FOR ASSESSMENTS OF RVR (M)
+6 6 ONE-MINUTE MAXIMUM VALUE - NORMAL VALUE
+7 7 ONE-MINUTE MAXIMUM VALUE - ABOVE THE UPPER LIMIT FOR ASSESSMENTS OF RVR (P)
+8 8 ONE-MINUTE MAXIMUM VALUE - BELOW THE LOWER LIMIT FOR ASSESSMENTS OF RVR (M)
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8015.table b/definitions/bufr/tables/0/wmo/27/codetables/8015.table
new file mode 100644
index 0000000..6830b95
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8015.table
@@ -0,0 +1,4 @@
+0 0 SINGLE SENSOR
+1 1 PRIMARY SENSOR
+2 2 SECONDARY SENSOR (BACKUP)
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8016.table b/definitions/bufr/tables/0/wmo/27/codetables/8016.table
new file mode 100644
index 0000000..6b8a1fa
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8016.table
@@ -0,0 +1,5 @@
+0 0 NOSIG
+1 1 BECMG
+2 2 TEMPO
+3 3 FM
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8017.table b/definitions/bufr/tables/0/wmo/27/codetables/8017.table
new file mode 100644
index 0000000..b3156f8
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8017.table
@@ -0,0 +1,4 @@
+0 0 FM
+1 1 TL
+2 2 AT
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8018.table b/definitions/bufr/tables/0/wmo/27/codetables/8018.table
new file mode 100644
index 0000000..f91e554
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8018.table
@@ -0,0 +1,4 @@
+1 1 LAND IS PRESENT
+2 2 SURFACE ICE MAP INDICATES ICE IS PRESENT
+11 11 ICE MAP DATA NOT AVAILABLE
+12 12 ATTENUATION MAP DATA NOT AVAILABLE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8019.table b/definitions/bufr/tables/0/wmo/27/codetables/8019.table
new file mode 100644
index 0000000..4ed4133
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8019.table
@@ -0,0 +1,8 @@
+0 0 RESERVED
+1 1 ATS (AIR TRAFFIC SERVICE) UNIT SERVING FIR (FLIGHT INFORMATION REGION)
+2 2 FIR (FLIGHT INFORMATION REGION)
+3 3 UIR (UPPER FLIGHT INFORMATION REGION)
+4 4 CTA (CONTROL AREA)
+5 5 VAAC (VOLCANIC ASH ADVISORY CENTRE)
+6 6 MWO (METEOROLOGICAL WATCH OFFICE) ISSUING SIGMET
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8021.table b/definitions/bufr/tables/0/wmo/27/codetables/8021.table
new file mode 100644
index 0000000..20fd793
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8021.table
@@ -0,0 +1,32 @@
+0 0 RESERVED
+1 1 TIME SERIES
+2 2 TIME AVERAGED (SEE NOTE 1)
+3 3 ACCUMULATED
+4 4 FORECAST
+5 5 FORECAST TIME SERIES
+6 6 FORECAST TIME AVERAGED
+7 7 FORECAST ACCUMULATED
+8 8 ENSEMBLE MEAN (SEE NOTE 2)
+9 9 ENSEMBLE MEAN TIME SERIES
+10 10 ENSEMBLE MEAN TIME AVERAGED
+11 11 ENSEMBLE MEAN ACCUMULATED
+12 12 ENSEMBLE MEAN FORECAST
+13 13 ENSEMBLE MEAN FORECAST TIME SERIES
+14 14 ENSEMBLE MEAN FORECAST TIME AVERAGED
+15 15 ENSEMBLE MEAN FORECAST ACCUMULATED
+16 16 ANALYSIS
+17 17 START OF PHENOMENON
+18 18 RADIOSONDE LAUNCH TIME
+19 19 START OF ORBIT
+20 20 END OF ORBIT
+21 21 TIME OF ASCENDING NODE
+22 22 TIME OF OCCURRENCE OF WIND SHIFT
+23 23 MONITORING PERIOD
+24 24 AGREED TIME LIMIT FOR REPORT RECEPTION
+25 25 NOMINAL REPORTING TIME
+26 26 TIME OF LAST KNOWN POSITION
+27 27 FIRST GUESS
+28 28 START OF SCAN
+29 29 END OF SCAN OR TIME OF ENDING
+30 30 TIME OF OCCURRENCE
+31 31 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8023.table b/definitions/bufr/tables/0/wmo/27/codetables/8023.table
new file mode 100644
index 0000000..2125e23
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8023.table
@@ -0,0 +1,14 @@
+2 2 MAXIMUM VALUE
+3 3 MINIMUM VALUE
+4 4 MEAN VALUE
+5 5 MEDIAN VALUE
+6 6 MODAL VALUE
+7 7 MEAN ABSOLUTE ERROR
+8 8 RESERVED
+9 9 BEST ESTIMATE OF STANDARD DEVIATION (N-1)
+10 10 STANDARD DEVIATION (N)
+11 11 HARMONIC MEAN
+12 12 ROOT-MEAN-SQUARE VECTOR ERROR
+13 13 ROOT-MEAN-SQUARE
+32 32 VECTOR MEAN
+63 63 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8024.table b/definitions/bufr/tables/0/wmo/27/codetables/8024.table
new file mode 100644
index 0000000..377858b
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8024.table
@@ -0,0 +1,12 @@
+2 2 OBSERVED MINUS MAXIMUM
+3 3 OBSERVED MINUS MINIMUM
+4 4 OBSERVED MINUS MEAN
+5 5 OBSERVED MINUS MEDIAN
+6 6 OBSERVED MINUS MODE
+11 11 OBSERVED MINUS CLIMATOLOGY (ANOMALY)
+12 12 OBSERVED MINUS ANALYSED VALUE
+13 13 OBSERVED MINUS INITIALIZED ANALYSED VALUE
+14 14 OBSERVED MINUS FORECAST VALUE
+21 21 OBSERVED MINUS INTERPOLATED VALUE
+22 22 OBSERVED MINUS HYDROSTATICALLY CALCULATED VALUE
+63 63 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8025.table b/definitions/bufr/tables/0/wmo/27/codetables/8025.table
new file mode 100644
index 0000000..1d88fa5
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8025.table
@@ -0,0 +1,5 @@
+0 0 UNIVERSAL TIME COORDINATED (UTC) MINUS LOCAL STANDARD TIME (LST)
+1 1 LOCAL STANDARD TIME
+2 2 UNIVERSAL TIME COORDINATED (UTC) MINUS SATELLITE CLOCK
+5 5 TIME DIFFERENCE FROM EDGE OF PROCESSING SEGMENT
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8026.table b/definitions/bufr/tables/0/wmo/27/codetables/8026.table
new file mode 100644
index 0000000..9bcef78
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8026.table
@@ -0,0 +1,5 @@
+0 0 AVERAGING KERNEL MATRIX
+1 1 CORRELATION MATRIX (C)
+2 2 LOWER TRIANGULAR CORRELATION MATRIX SQUARE ROOT (L FROM C=LLT)
+3 3 INVERSE OF LOWER TRIANGULAR CORRELATION MATRIX SQUARE ROOT (L-1)
+63 63 MISSING OR UNDEFINED SIGNIFICANCE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8029.table b/definitions/bufr/tables/0/wmo/27/codetables/8029.table
new file mode 100644
index 0000000..d0eae5a
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8029.table
@@ -0,0 +1,16 @@
+0 0 OPEN OCEAN OR SEMI-ENCLOSED SEA
+1 1 ENCLOSED SEA OR LAKE
+2 2 CONTINENTAL ICE
+3 3 LAND
+4 4 LOW INLAND (BELOW SEA LEVEL)
+5 5 MIX OF LAND AND WATER
+6 6 MIX OF LAND AND LOW INLAND
+11 11 RIVER
+12 12 LAKE
+13 13 SEA
+14 14 GLACIER
+15 15 URBAN LAND
+16 16 RURAL LAND
+17 17 SUBURBAN LAND
+18 18 SEA ICE
+255 255 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8032.table b/definitions/bufr/tables/0/wmo/27/codetables/8032.table
new file mode 100644
index 0000000..712400d
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8032.table
@@ -0,0 +1,7 @@
+0 0 ROUTINE OPERATION
+1 1 EVENT TRIGGERED BY STORM SURGE
+2 2 EVENT TRIGGERED BY TSUNAMI
+3 3 EVENT TRIGGERED MANUALLY
+4 4 INSTALLATION TESTING
+5 5 MAINTENANCE TESTING
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8033.table b/definitions/bufr/tables/0/wmo/27/codetables/8033.table
new file mode 100644
index 0000000..1c69537
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8033.table
@@ -0,0 +1,6 @@
+0 0 RESERVED
+1 1 PERCENTAGE CONFIDENCE CALCULATED USING CLOUD FRACTION
+2 2 PERCENTAGE CONFIDENCE CALCULATED USING STANDARD DEVIATION OF TEMPERATURE
+3 3 PERCENTAGE CONFIDENCE CALCULATED USING PROBABILITY OF CLOUD CONTAMINATION
+4 4 PERCENTAGE CONFIDENCE CALCULATED USING NORMALITY OF DISTRIBUTION
+127 127 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8034.table b/definitions/bufr/tables/0/wmo/27/codetables/8034.table
new file mode 100644
index 0000000..879f274
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8034.table
@@ -0,0 +1,10 @@
+0 0 SECONDARY SAMPLING: AVERAGED
+1 1 SECONDARY SAMPLING: DISCRETE
+2 2 SECONDARY SAMPLING: MIXED
+3 3 NEAR-SURFACE SAMPLING: AVERAGED, PUMPED
+4 4 NEAR-SURFACE SAMPLING: AVERAGED, UNPUMPED
+5 5 NEAR-SURFACE SAMPLING: DISCRETE, PUMPED
+6 6 NEAR-SURFACE SAMPLING: DISCRETE, UNPUMPED
+7 7 NEAR-SURFACE SAMPLING: MIXED, PUMPED
+8 8 NEAR-SURFACE SAMPLING: MIXED, UNPUMPED
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8035.table b/definitions/bufr/tables/0/wmo/27/codetables/8035.table
new file mode 100644
index 0000000..3d641fd
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8035.table
@@ -0,0 +1,8 @@
+0 0 GLOBAL
+1 1 REGIONAL
+2 2 NATIONAL
+3 3 SPECIAL
+4 4 BILATERAL
+5 5 RESERVED
+6 6 RESERVED
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8036.table b/definitions/bufr/tables/0/wmo/27/codetables/8036.table
new file mode 100644
index 0000000..6436989
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8036.table
@@ -0,0 +1,8 @@
+0 0 WMO SECRETARIAT
+1 1 WMO
+2 2 RSMC
+3 3 NMC
+4 4 RTH
+5 5 OBSERVING SITE
+6 6 OTHER
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8039.table b/definitions/bufr/tables/0/wmo/27/codetables/8039.table
new file mode 100644
index 0000000..f4403c6
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8039.table
@@ -0,0 +1,8 @@
+0 0 ISSUE TIME OF FORECAST
+1 1 TIME OF COMMENCEMENT OF PERIOD OF THE FORECAST
+2 2 TIME OF ENDING OF PERIOD OF THE FORECAST
+3 3 FORECAST TIME OF MAXIMUM TEMPERATURE
+4 4 FORECAST TIME OF MINIMUM TEMPERATURE
+5 5 TIME OF BEGINNING OF THE FORECAST CHANGE
+6 6 TIME OF ENDING OF THE FORECAST CHANGE
+63 63 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8040.table b/definitions/bufr/tables/0/wmo/27/codetables/8040.table
new file mode 100644
index 0000000..42c5af0
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8040.table
@@ -0,0 +1,49 @@
+0 0 HIGH-RESOLUTION DATA SAMPLE
+1 1 WITHIN 20 HPA OF SURFACE
+2 2 PRESSURE LESS THAN 10 HPA (I.E., 9, 8, 7, ETC.) WHEN NO OTHER REASON APPLIES
+3 3 BASE PRESSURE LEVEL FOR STABILITY INDEX
+4 4 BEGIN DOUBTFUL TEMPERATURE, HEIGHT DATA
+5 5 BEGIN MISSING DATA (ALL ELEMENTS)
+6 6 BEGIN MISSING RELATIVE HUMIDITY DATA
+7 7 BEGIN MISSING TEMPERATURE DATA
+8 8 HIGHEST LEVEL REACHED BEFORE BALLOON DESCENT BECAUSE OF ICING OR TURBULENCE
+9 9 END DOUBTFUL TEMPERATURE, HEIGHT DATA
+10 10 END MISSING DATA (ALL ELEMENTS)
+11 11 END MISSING RELATIVE HUMIDITY DATA
+12 12 END MISSING TEMPERATURE DATA
+13 13 ZERO DEGREES CELSIUS CROSSING(S) FOR RADAT
+14 14 STANDARD PRESSURE LEVEL
+15 15 OPERATOR-ADDED LEVEL
+16 16 OPERATOR-DELETED LEVEL
+17 17 BALLOON RE-ASCENDED BEYOND PREVIOUS HIGHEST ASCENT LEVEL
+18 18 SIGNIFICANT RELATIVE HUMIDITY LEVEL
+19 19 RELATIVE HUMIDITY LEVEL SELECTION TERMINATED
+20 20 SURFACE LEVEL
+21 21 SIGNIFICANT TEMPERATURE LEVEL
+22 22 MANDATORY TEMPERATURE LEVEL
+23 23 FLIGHT TERMINATION LEVEL
+24 24 TROPOPAUSE(S)
+25 25 AIRCRAFT REPORT
+26 26 INTERPOLATED (GENERATED) LEVEL
+27 27 MANDATORY WIND LEVEL
+28 28 SIGNIFICANT WIND LEVEL
+29 29 MAXIMUM WIND LEVEL
+30 30 INCREMENTAL WIND LEVEL (FIXED REGIONAL)
+31 31 INCREMENTAL HEIGHT LEVEL (GENERATED)
+32 32 WIND TERMINATION LEVEL
+33 33 PRESSURE 100 TO 110 HPA, WHEN NO OTHER REASON APPLIES
+34 34 FREEZING LEVEL BASE
+35 35 FREEZING LEVEL TOP
+36 36 FLIGHT LEVEL BASE
+37 37 FLIGHT LEVEL TOP
+38 38 TOP OF WIND SOUNDING
+39 39 BOTTOM OF WIND SOUNDING
+40 40 SIGNIFICANT THERMODYNAMIC LEVEL (INVERSION)
+41 41 SIGNIFICANT RELATIVE HUMIDITY LEVEL (ACCORDING TO NCDC CRITERIA)
+42 42 SIGNIFICANT TEMPERATURE LEVEL (ACCORDING TO NCDC)
+43 43 BEGIN MISSING WIND DATA
+44 44 END MISSING WIND DATA
+60 60 LEVEL OF 80-KNOT ISOTACH ABOVE JET
+61 61 LEVEL OF 80-KNOT ISOTACH BELOW JET
+62 62 OTHER
+63 63 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8041.table b/definitions/bufr/tables/0/wmo/27/codetables/8041.table
new file mode 100644
index 0000000..1f48fbe
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8041.table
@@ -0,0 +1,15 @@
+0 0 PARENT SITE
+1 1 OBSERVATION SITE
+2 2 BALLOON MANUFACTURE DATE
+3 3 BALLOON LAUNCH POINT
+4 4 SURFACE OBSERVATION
+5 5 SURFACE OBSERVATION DISPLACEMENT FROM LAUNCH POINT
+6 6 FLIGHT LEVEL OBSERVATION
+7 7 FLIGHT LEVEL TERMINATION POINT
+8 8 IFR CEILING AND VISIBILITY
+9 9 MOUNTAIN OBSCURATION
+10 10 STRONG SURFACE WIND
+11 11 FREEZING LEVEL
+12 12 MULTIPLE FREEZING LEVEL
+13 13 INSTRUMENT MANUFACTURE DATE
+31 31 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8042.table b/definitions/bufr/tables/0/wmo/27/codetables/8042.table
new file mode 100644
index 0000000..c71709a
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8042.table
@@ -0,0 +1,17 @@
+1 1 SURFACE
+2 2 STANDARD LEVEL
+3 3 TROPOPAUSE LEVEL
+4 4 MAXIMUM WIND LEVEL
+5 5 SIGNIFICANT TEMPERATURE LEVEL
+6 6 SIGNIFICANT HUMIDITY LEVEL
+7 7 SIGNIFICANT WIND LEVEL
+8 8 BEGINNING OF MISSING TEMPERATURE DATA
+9 9 END OF MISSING TEMPERATURE DATA
+10 10 BEGINNING OF MISSING HUMIDITY DATA
+11 11 END OF MISSING HUMIDITY DATA
+12 12 BEGINNING OF MISSING WIND DATA
+13 13 END OF MISSING WIND DATA
+14 14 TOP OF WIND SOUNDING
+15 15 LEVEL DETERMINED BY REGIONAL DECISION
+16 16 FREEZING LEVEL
+17 17 PRESSURE LEVEL ORIGINALLY INDICATED BY HEIGHT AS THE VERTICAL COORDINATE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8043.table b/definitions/bufr/tables/0/wmo/27/codetables/8043.table
new file mode 100644
index 0000000..249fd0e
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8043.table
@@ -0,0 +1,17 @@
+0 0 OZONE
+1 1 WATER VAPOUR
+2 2 METHANE
+3 3 CARBON DIOXIDE
+4 4 CARBON MONOXIDE
+5 5 NITROGEN DIOXIDE
+6 6 NITROUS OXIDE
+7 7 FORMALDEHYDE
+8 8 SULPHUR DIOXIDE
+25 25 PARTICULATE MATTER < 1.0 MICRONS
+26 26 PARTICULATE MATTER < 2.5 MICRONS
+27 27 PARTICULATE MATTER < 10 MICRONS
+28 28 AEROSOLS (GENERIC)
+29 29 SMOKE (GENERIC)
+30 30 CRUSTAL MATERIAL (GENERIC DUST)
+31 31 VOLCANIC ASH
+255 255 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8050.table b/definitions/bufr/tables/0/wmo/27/codetables/8050.table
new file mode 100644
index 0000000..4b401f1
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8050.table
@@ -0,0 +1,11 @@
+0 0 RESERVED
+1 1 PRESSURE
+2 2 TEMPERATURE
+3 3 EXTREME TEMPERATURE
+4 4 VAPOUR PRESSURE
+5 5 PRECIPITATION
+6 6 SUNSHINE DURATION
+7 7 MAXIMUM TEMPERATURE
+8 8 MINIMUM TEMPERATURE
+9 9 WIND
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8051.table b/definitions/bufr/tables/0/wmo/27/codetables/8051.table
new file mode 100644
index 0000000..5249fe6
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8051.table
@@ -0,0 +1,7 @@
+1 1 PRESSURE
+2 2 TEMPERATURE
+3 3 EXTREME TEMPERATURE
+4 4 VAPOUR PRESSURE
+5 5 PRECIPITATION
+6 6 SUNSHINE DURATION
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8052.table b/definitions/bufr/tables/0/wmo/27/codetables/8052.table
new file mode 100644
index 0000000..46dcbbe
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8052.table
@@ -0,0 +1,26 @@
+0 0 MEAN WIND SPEED OVER A 10-MINUTE PERIOD OBSERVED OR RECORDED EQUAL TO OR MORE THAN 10 M S-1 OR 20 KNOTS
+1 1 MEAN WIND SPEED OVER A 10-MINUTE PERIOD OBSERVED OR RECORDED EQUAL TO OR MORE THAN 20 M S-1 OR 40 KNOTS
+2 2 MEAN WIND SPEED OVER A 10-MINUTE PERIOD OBSERVED OR RECORDED EQUAL TO OR MORE THAN 30 M S-1 OR 60 KNOTS
+3 3 MAXIMUM TEMPERATURE LESS THAN 273.15 K
+4 4 MAXIMUM TEMPERATURE EQUAL TO OR MORE THAN 298.15 K
+5 5 MAXIMUM TEMPERATURE EQUAL TO OR MORE THAN 303.15 K
+6 6 MAXIMUM TEMPERATURE EQUAL TO OR MORE THAN 308.15 K
+7 7 MAXIMUM TEMPERATURE EQUAL TO OR MORE THAN 313.15 K
+8 8 MINIMUM TEMPERATURE LESS THAN 273.15 K
+9 9 MAXIMUM TEMPERATURE EQUAL TO OR MORE THAN 273.15 K
+10 10 PRECIPITATION EQUAL TO OR MORE THAN 1.0 KG M-2
+11 11 PRECIPITATION EQUAL TO OR MORE THAN 5.0 KG M-2
+12 12 PRECIPITATION EQUAL TO OR MORE THAN 10.0 KG M-2
+13 13 PRECIPITATION EQUAL TO OR MORE THAN 50.0 KG M-2
+14 14 PRECIPITATION EQUAL TO OR MORE THAN 100.0 KG M-2
+15 15 PRECIPITATION EQUAL TO OR MORE THAN 150.0 KG M-2
+16 16 SNOW DEPTH MORE THAN 0.00 M
+17 17 SNOW DEPTH MORE THAN 0.01 M
+18 18 SNOW DEPTH MORE THAN 0.10 M
+19 19 SNOW DEPTH MORE THAN 0.50 M
+20 20 HORIZONTAL VISIBILITY LESS THAN 50 M
+21 21 HORIZONTAL VISIBILITY LESS THAN 100 M
+22 22 HORIZONTAL VISIBILITY LESS THAN 1000 M
+23 23 HAIL
+24 24 THUNDERSTORM
+31 31 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8053.table b/definitions/bufr/tables/0/wmo/27/codetables/8053.table
new file mode 100644
index 0000000..cbc11c9
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8053.table
@@ -0,0 +1,4 @@
+0 0 VALUE OCCURRED ON ONLY ONE DAY IN THE MONTH
+1 1 VALUE OCCURRED ON MORE THAN ONE DAY IN THE MONTH
+2 2 RESERVED
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8054.table b/definitions/bufr/tables/0/wmo/27/codetables/8054.table
new file mode 100644
index 0000000..51b908e
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8054.table
@@ -0,0 +1,3 @@
+0 0 WIND SPEED OR GUST IS AS REPORTED
+1 1 WIND SPEED IS GREATER THAN THAT REPORTED (P IN METAR/TAF/SPECI)
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8060.table b/definitions/bufr/tables/0/wmo/27/codetables/8060.table
new file mode 100644
index 0000000..2865fec
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8060.table
@@ -0,0 +1,8 @@
+0 0 RESERVED
+1 1 RANGE
+2 2 AZIMUTH
+3 3 HORIZONTAL
+4 4 VERTICAL
+5 5 NORTH/SOUTH
+6 6 EAST/WEST
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8065.table b/definitions/bufr/tables/0/wmo/27/codetables/8065.table
new file mode 100644
index 0000000..69b80ea
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8065.table
@@ -0,0 +1,4 @@
+0 0 NO SUN-GLINT
+1 1 SUN-GLINT
+2 2 RESERVED
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8066.table b/definitions/bufr/tables/0/wmo/27/codetables/8066.table
new file mode 100644
index 0000000..fcc0252
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8066.table
@@ -0,0 +1,4 @@
+0 0 OPAQUE
+1 1 SEMI-TRANSPARENT
+2 2 RESERVED
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8070.table b/definitions/bufr/tables/0/wmo/27/codetables/8070.table
new file mode 100644
index 0000000..f580617
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8070.table
@@ -0,0 +1,6 @@
+0 0 RESERVED
+1 1 RESERVED
+2 2 EARTH LOCATED INSTRUMENT COUNTS, CALIBRATION COEFFICIENTS AND HOUSEKEEPING (LEVEL 1B)
+3 3 EARTH LOCATED CALIBRATED RADIANCES (LEVEL 1C)
+4 4 MAPPED TO A COMMON FOOTPRINT, EARTH LOCATED CALIBRATED RADIANCES (LEVEL 1D)
+15 15 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8072.table b/definitions/bufr/tables/0/wmo/27/codetables/8072.table
new file mode 100644
index 0000000..7dcd961
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8072.table
@@ -0,0 +1,6 @@
+0 0 MIXED
+1 1 CLEAR
+2 2 CLOUDY
+3 3 PROBABLY CLEAR
+4 4 PROBABLY CLOUDY
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8074.table b/definitions/bufr/tables/0/wmo/27/codetables/8074.table
new file mode 100644
index 0000000..5778e65
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8074.table
@@ -0,0 +1,4 @@
+0 0 OPEN OCEAN OR SEMI-ENCLOSED SEA
+1 1 NON-OCEAN LIKE
+2 2 RESERVED
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8075.table b/definitions/bufr/tables/0/wmo/27/codetables/8075.table
new file mode 100644
index 0000000..5f5e3a2
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8075.table
@@ -0,0 +1,4 @@
+0 0 ASCENDING ORBIT
+1 1 DESCENDING ORBIT
+2 2 RESERVED
+3 3 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8076.table b/definitions/bufr/tables/0/wmo/27/codetables/8076.table
new file mode 100644
index 0000000..431496f
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8076.table
@@ -0,0 +1,9 @@
+0 0 KU
+1 1 C
+2 2 LONG-WAVE INFRARED
+3 3 MEDIUM-WAVE INFRARED
+4 4 SHORT-WAVE INFRARED
+5 5 M
+6 6 I
+7 7 DAY/NIGHT
+63 63 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8077.table b/definitions/bufr/tables/0/wmo/27/codetables/8077.table
new file mode 100644
index 0000000..2c7902b
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8077.table
@@ -0,0 +1,7 @@
+0 0 LAND
+1 1 SEA
+2 2 COASTAL
+3 3 OPEN OCEAN OR SEMI-ENCLOSED SEA
+4 4 ENCLOSED SEA OR LAKE
+5 5 CONTINENTAL ICE
+127 127 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8079.table b/definitions/bufr/tables/0/wmo/27/codetables/8079.table
new file mode 100644
index 0000000..735a09c
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8079.table
@@ -0,0 +1,9 @@
+0 0 NORMAL ISSUE
+1 1 CORRECTION TO A PREVIOUSLY ISSUED PRODUCT (COR)
+2 2 AMENDMENT TO A PREVIOUSLY ISSUED PRODUCT (AMD)
+3 3 CORRECTION TO A PREVIOUSLY ISSUED AMENDED PRODUCT (COR AMD)
+4 4 CANCELLATION OF A PREVIOUSLY ISSUED PRODUCT (CNL)
+5 5 NO PRODUCT AVAILABLE (NIL)
+6 6 SPECIAL REPORT (SPECI)
+7 7 CORRECTED SPECIAL REPORT (SPECI COR)
+15 15 MISSING OR NOT APPLICABLE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8080.table b/definitions/bufr/tables/0/wmo/27/codetables/8080.table
new file mode 100644
index 0000000..1a0f3a5
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8080.table
@@ -0,0 +1,14 @@
+0 0 TOTAL WATER PRESSURE PROFILE
+1 1 TOTAL WATER TEMPERATURE PROFILE
+2 2 TOTAL WATER SALINITY PROFILE
+3 3 TOTAL WATER CONDUCTIVITY PROFILE
+4 4 TOTAL WATER DEPTH
+10 10 WATER PRESSURE AT A LEVEL
+11 11 WATER TEMPERATURE AT A LEVEL
+12 12 SALINITY AT A LEVEL
+13 13 WATER DEPTH AT A LEVEL
+14 14 SEA/WATER CURRENT SPEED AT A LEVEL
+15 15 SEA/WATER CURRENT DIRECTION AT A LEVEL
+16 16 DISSOLVED OXYGEN AT A LEVEL
+20 20 POSITION
+63 63 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8081.table b/definitions/bufr/tables/0/wmo/27/codetables/8081.table
new file mode 100644
index 0000000..75d2887
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8081.table
@@ -0,0 +1,5 @@
+0 0 SENSOR
+1 1 TRANSMITTER
+2 2 RECEIVER
+3 3 OBSERVING PLATFORM
+63 63 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8082.table b/definitions/bufr/tables/0/wmo/27/codetables/8082.table
new file mode 100644
index 0000000..1f24db8
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8082.table
@@ -0,0 +1,3 @@
+0 0 SENSOR HEIGHT IS NOT MODIFIED
+1 1 SENSOR HEIGHT IS MODIFIED TO STANDARD LEVEL
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8083.table b/definitions/bufr/tables/0/wmo/27/codetables/8083.table
new file mode 100644
index 0000000..174ef34
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8083.table
@@ -0,0 +1,9 @@
+1 1 ADJUSTED TO OR WITH RESPECT TO REPRESENTATIVE HEIGHT OF SENSOR ABOVE LOCAL GROUND (OR DECK OF MARINE PLATFORM)
+2 2 ADJUSTED TO OR WITH RESPECT TO REPRESENTATIVE HEIGHT OF SENSOR ABOVE WATER SURFACE
+3 3 ADJUSTED WITH RESPECT TO STANDARD SURFACE ROUGHNESS
+4 4 ADJUSTED WITH RESPECT TO WIND SPEED
+5 5 ADJUSTED WITH RESPECT TO TEMPERATURE
+6 6 ADJUSTED WITH RESPECT TO PRESSURE
+7 7 ADJUSTED WITH RESPECT TO HUMIDITY
+8 8 ADJUSTED WITH RESPECT TO EVAPORATION
+9 9 ADJUSTED WITH RESPECT TO WETTING LOSSES
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8085.table b/definitions/bufr/tables/0/wmo/27/codetables/8085.table
new file mode 100644
index 0000000..79e1a3d
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8085.table
@@ -0,0 +1,4 @@
+0 0 FORE BEAM
+1 1 MID BEAM
+2 2 AFT BEAM
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8086.table b/definitions/bufr/tables/0/wmo/27/codetables/8086.table
new file mode 100644
index 0000000..47665e9
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8086.table
@@ -0,0 +1,9 @@
+1 1 MODEL GROUND SURFACE
+2 2 STANDARD LEVEL
+3 3 TROPOPAUSE LEVEL
+4 4 MAXIMUM WIND LEVEL
+5 5 SIGNIFICANT TEMPERATURE LEVEL
+6 6 SIGNIFICANT HUMIDITY LEVEL
+7 7 SIGNIFICANT WIND LEVEL
+8 8 VERTICALLY INTERPOLATED LEVEL (THIS SHOULD BE SET TO 1 FOR POINTS ON THE VERTICAL PROFILE THAT FALL BETWEEN THE MODEL'S NATIVE VERTICAL LEVELS.)
+9 9 VIRTUAL STATION HEIGHT
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8087.table b/definitions/bufr/tables/0/wmo/27/codetables/8087.table
new file mode 100644
index 0000000..d556c98
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8087.table
@@ -0,0 +1,5 @@
+0 0 UPPER LEFT
+1 1 UPPER RIGHT
+2 2 LOWER RIGHT
+3 3 LOWER LEFT
+7 7 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8088.table b/definitions/bufr/tables/0/wmo/27/codetables/8088.table
new file mode 100644
index 0000000..7791d33
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8088.table
@@ -0,0 +1,4 @@
+0 0 TOP VIEW (GEOGRAPHICAL LONGITUDE ON X AXIS AND LATITUDE ON Y AXIS)
+1 1 NORTH-SOUTH VIEW (TRANSECT WITH GEOGRAPHICAL LONGITUDE ON X AXIS AND VERTICAL HEIGHT ON Y AXIS)
+2 2 EAST-WEST VIEW (TRANSECT WITH GEOGRAPHICAL LATITUDE ON X AXIS AND VERTICAL HEIGHT ON Y AXIS)
+63 63 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/codetables/8091.table b/definitions/bufr/tables/0/wmo/27/codetables/8091.table
new file mode 100644
index 0000000..3a8c44d
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/codetables/8091.table
@@ -0,0 +1,11 @@
+0 0 SATELLITE COORDINATES
+1 1 OBSERVATION COORDINATES
+2 2 START OF OBSERVATION
+3 3 END OF OBSERVATION
+4 4 HORIZONTAL CENTRE OF GRAVITY OF THE OBSERVATION
+5 5 VERTICAL CENTRE OF GRAVITY OF THE OBSERVATION
+6 6 TOP OF THE OBSERVATION
+7 7 BOTTOM OF THE OBSERVATION
+8 8 PROJECTION ORIGIN
+9 9 COORDINATES OF TRUE SCALE
+255 255 MISSING VALUE
diff --git a/definitions/bufr/tables/0/wmo/27/element.table b/definitions/bufr/tables/0/wmo/27/element.table
new file mode 100644
index 0000000..9841331
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/element.table
@@ -0,0 +1,1616 @@
+#code|abbreviation|type|name|unit|scale|reference|width|crex_unit|crex_scale|crex_width
+000001|tableAEntry|string|TABLE A: ENTRY|CCITT IA5|0|0|24|Character|0|3
+000002|tableALine1|string|TABLE A: DATA CATEGORY DESCRIPTION, LINE 1|CCITT IA5|0|0|256|Character|0|32
+000003|tableALine2|string|TABLE A: DATA CATEGORY DESCRIPTION, LINE 2|CCITT IA5|0|0|256|Character|0|32
+000004|masterTable|string|BUFR/CREX MASTER TABLE|CCITT IA5|0|0|16|Character|0|2
+000005|editionNumber|string|BUFR/CREX EDITION NUMBER|CCITT IA5|0|0|24|Character|0|3
+000006|bufrMasterTableVersionNumber|string|BUFR MASTER TABLE VERSION NUMBER|CCITT IA5|0|0|16|Character|0|2
+000007|crexMasterTableVersionNumber|string|CREX MASTER TABLE VERSION NUMBER|CCITT IA5|0|0|16|Character|0|2
+000008|bufrLocalTableVersionNumber|string|BUFR LOCAL TABLE VERSION NUMBER|CCITT IA5|0|0|16|Character|0|2
+000010|fDescriptorToBeAddedOrDefined|string|F DESCRIPTOR TO BE ADDED OR DEFINED|CCITT IA5|0|0|8|Character|0|1
+000011|xDescriptorToBeAddedOrDefined|string|X DESCRIPTOR TO BE ADDED OR DEFINED|CCITT IA5|0|0|16|Character|0|2
+000012|yDescriptorToBeAddedOrDefined|string|Y DESCRIPTOR TO BE ADDED OR DEFINED|CCITT IA5|0|0|24|Character|0|3
+000013|elementNameLine1|string|ELEMENT NAME, LINE 1|CCITT IA5|0|0|256|Character|0|32
+000014|elementNameLine2|string|ELEMENT NAME, LINE 2|CCITT IA5|0|0|256|Character|0|32
+000015|unitsName|string|UNITS NAME|CCITT IA5|0|0|192|Character|0|24
+000016|unitsScaleSign|string|UNITS SCALE SIGN|CCITT IA5|0|0|8|Character|0|1
+000017|unitsScale|string|UNITS SCALE|CCITT IA5|0|0|24|Character|0|3
+000018|unitsReferenceSign|string|UNITS REFERENCE SIGN|CCITT IA5|0|0|8|Character|0|1
+000019|unitsReferenceValue|string|UNITS REFERENCE VALUE|CCITT IA5|0|0|80|Character|0|10
+000020|elementDataWidth|string|ELEMENT DATA WIDTH|CCITT IA5|0|0|24|Character|0|3
+000024|codeFigure|string|CODE FIGURE|CCITT IA5|0|0|64|Character|0|8
+000025|codeFigureMeaning|string|CODE FIGURE MEANING|CCITT IA5|0|0|496|Character|0|62
+000026|bitNumber|string|BIT NUMBER|CCITT IA5|0|0|48|Character|0|6
+000027|bitNumberMeaning|string|BIT NUMBER MEANING|CCITT IA5|0|0|496|Character|0|62
+000030|descriptorDefiningSequence|string|DESCRIPTOR DEFINING SEQUENCE|CCITT IA5|0|0|48|Character|0|6
+001001|blockNumber|long|WMO BLOCK NUMBER|Numeric|0|0|7|Numeric|0|2
+001002|stationNumber|long|WMO STATION NUMBER|Numeric|0|0|10|Numeric|0|3
+001003|regionNumber|table|WMO REGION NUMBER/GEOGRAPHICAL AREA|CODE TABLE|0|0|3|CODE TABLE|0|1
+001004|wmoRegionSubArea|long|WMO REGION SUB-AREA|Numeric|0|0|3|Numeric|0|1
+001005|buoyOrPlatformIdentifier|long|BUOY/PLATFORM IDENTIFIER|Numeric|0|0|17|Numeric|0|5
+001006|aircraftFlightNumber|string|AIRCRAFT FLIGHT NUMBER|CCITT IA5|0|0|64|Character|0|8
+001007|satelliteIdentifier|table|SATELLITE IDENTIFIER|CODE TABLE|0|0|10|CODE TABLE|0|4
+001008|aircraftRegistrationNumberOrOtherIdentification|string|AIRCRAFT REGISTRATION NUMBER OR OTHER IDENTIFICATION|CCITT IA5|0|0|64|Character|0|8
+001009|commercialAircraftType|string|TYPE OF COMMERCIAL AIRCRAFT|CCITT IA5|0|0|64|Character|0|8
+001010|stationaryBuoyPlatformIdentifierEGCManBuoys|string|STATIONARY BUOY PLATFORM IDENTIFIER; E.G. C-MAN BUOYS|CCITT IA5|0|0|64|Character|0|8
+001011|shipOrMobileLandStationIdentifier|string|SHIP OR MOBILE LAND STATION IDENTIFIER|CCITT IA5|0|0|72|Character|0|9
+001012|directionOfMotionOfMovingObservingPlatform|long|DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM|deg|0|0|9|deg|0|3
+001013|movingObservingPlatformSpeed|long|SPEED OF MOTION OF MOVING OBSERVING PLATFORM|m/s|0|0|10|m/s|0|3
+001014|platformDriftSpeed|double|PLATFORM DRIFT SPEED (HIGH PRECISION)|m/s|2|0|10|m/s|2|4
+001015|stationOrSiteName|string|STATION OR SITE NAME|CCITT IA5|0|0|160|Character|0|20
+001018|shortStationName|string|SHORT STATION OR SITE NAME|CCITT IA5|0|0|40|Character|0|5
+001019|longStationName|string|LONG STATION OR SITE NAME|CCITT IA5|0|0|256|Character|0|32
+001020|wmoRegionSubArea|long|WMO REGION SUB-AREA|Numeric|0|0|4|Numeric|0|2
+001021|synopticFeatureIdentifier|long|SYNOPTIC FEATURE IDENTIFIER|Numeric|0|0|14|Numeric|0|4
+001022|featureName|string|NAME OF FEATURE|CCITT IA5|0|0|224|Character|0|28
+001023|observationSequenceNumber|long|OBSERVATION SEQUENCE NUMBER|Numeric|0|0|9|Numeric|0|3
+001024|windSpeedSource|table|WIND SPEED SOURCE|CODE TABLE|0|0|5|CODE TABLE|0|2
+001025|stormIdentifier|string|STORM IDENTIFIER|CCITT IA5|0|0|24|Character|0|3
+001026|stormName|string|WMO STORM NAME|CCITT IA5|0|0|64|Character|0|8
+001027|longStormName|string|WMO LONG STORM NAME|CCITT IA5|0|0|80|Character|0|10
+001028|aerosolOpticalDepthSource|table|AEROSOL OPTICAL DEPTH (AOD) SOURCE|CODE TABLE|0|0|5|CODE TABLE|0|2
+001029|ssiSource|table|SSI SOURCE|CODE TABLE|0|0|5|CODE TABLE|0|2
+001030|numericalModelIdentifier|string|NUMERICAL MODEL IDENTIFIER|CCITT IA5|0|0|128|Character|0|16
+001031|centre|table|IDENTIFICATION OF ORIGINATING/GENERATING CENTRE|CODE TABLE|0|0|16|CODE TABLE|0|5
+001032|generatingApplication|table|GENERATING APPLICATION|CODE TABLE defined by originating/generating centre|0|0|8|CODE TABLE|0|3
+001033|centre|table|IDENTIFICATION OF ORIGINATING/GENERATING CENTRE|Common CODE TABLE C-1|0|0|8|Common CODE TABLE C-1|0|3
+001034|subCentre|table|IDENTIFICATION OF ORIGINATING/GENERATING SUB-CENTRE|Common CODE TABLE C-12|0|0|8|Common CODE TABLE C-12|0|3
+001035|centre|table|ORIGINATING CENTRE|Common CODE TABLE C-11|0|0|16|Common CODE TABLE C-11|0|5
+001036|agencyInChargeOfOperatingObservingPlatform|table|AGENCY IN CHARGE OF OPERATING THE OBSERVING PLATFORM|CODE TABLE|0|0|20|CODE TABLE|0|7
+001037|sigmetSequenceIdentifier|string|SIGMET SEQUENCE IDENTIFIER|CCITT IA5|0|0|24|Character|0|3
+001038|sourceOfSeaIceFraction|table|SOURCE OF SEA ICE FRACTION|CODE TABLE|0|0|5|CODE TABLE|0|2
+001039|graphicalAreaForecastSequenceIdentifier|string|GRAPHICAL AREA FORECAST (GFA) SEQUENCE IDENTIFIER|CCITT IA5|0|0|40|Character|0|5
+001040|processingCentreIdCode|string|PROCESSING CENTRE ID CODE|CCITT IA5|0|0|48|Character|0|6
+001041|absolutePlatformVelocityFirstComponent|double|ABSOLUTE PLATFORM VELOCITY - FIRST COMPONENT|m/s|5|-1073741824|31|m/s|5|10
+001042|absolutePlatformVelocitySecondComponent|double|ABSOLUTE PLATFORM VELOCITY - SECOND COMPONENT|m/s|5|-1073741824|31|m/s|5|10
+001043|absolutePlatformVelocityThirdComponent|double|ABSOLUTE PLATFORM VELOCITY - THIRD COMPONENT|m/s|5|-1073741824|31|m/s|5|10
+001050|platformTransmitterIdNumber|long|PLATFORM TRANSMITTER ID NUMBER|Numeric|0|0|17|Numeric|0|6
+001051|platformTransmitterIdNumber|string|PLATFORM TRANSMITTER ID NUMBER|CCITT IA5|0|0|96|Character|0|12
+001052|platformTransmitterId|table|PLATFORM TRANSMITTER ID|CODE TABLE|0|0|3|CODE TABLE|0|1
+001053|tsunameterReportSequenceNumber|long|TSUNAMETER REPORT SEQUENCE NUMBER TRIGGERED BY A TSUNAMI EVENT|Numeric|0|0|7|Numeric|0|2
+001060|aircraftReportingPointBeaconIdentifier|string|AIRCRAFT REPORTING POINT (BEACON IDENTIFIER)|CCITT IA5|0|0|64|Character|0|8
+001062|shortIcaoLocationIndicator|string|SHORT ICAO LOCATION INDICATOR|CCITT IA5|0|0|32|Character|0|4
+001063|icaoLocationIndicator|string|ICAO LOCATION INDICATOR|CCITT IA5|0|0|64|Character|0|8
+001064|runwayDesignator|string|RUNWAY DESIGNATOR|CCITT IA5|0|0|32|Character|0|4
+001065|icaoRegionIdentifier|string|ICAO REGION IDENTIFIER|CCITT IA5|0|0|256|Character|0|32
+001075|tideStationIdentification|string|TIDE STATION IDENTIFICATION|CCITT IA5|0|0|40|Character|0|5
+001079|uniqueIdentifierForProfile|string|UNIQUE IDENTIFIER FOR THE PROFILE|CCITT IA5|0|0|64|Character|0|8
+001080|shipLineNumberAccordingToSoop|string|SHIP LINE NUMBER ACCORDING TO SOOP|CCITT IA5|0|0|32|Character|0|4
+001081|radiosondeSerialNumber|string|RADIOSONDE SERIAL NUMBER|CCITT IA5|0|0|160|Character|0|20
+001082|radiosondeAscensionNumber|long|RADIOSONDE ASCENSION NUMBER|Numeric|0|0|14|Numeric|0|4
+001083|radiosondeReleaseNumber|long|RADIOSONDE RELEASE NUMBER|Numeric|0|0|3|Numeric|0|1
+001085|observingPlatformManufacturerModel|string|OBSERVING PLATFORM MANUFACTURER'S MODEL|CCITT IA5|0|0|160|Character|0|20
+001086|observingPlatformManufacturerSerialNumber|string|OBSERVING PLATFORM MANUFACTURER'S SERIAL NUMBER|CCITT IA5|0|0|256|Character|0|32
+001087|marineObservingPlatformIdentifier|long|WMO MARINE OBSERVING PLATFORM EXTENDED IDENTIFIER|Numeric|0|0|23|Numeric|0|7
+001090|techniqueForMakingUpInitialPerturbations|table|TECHNIQUE FOR MAKING UP INITIAL PERTURBATIONS|CODE TABLE|0|0|8|CODE TABLE|0|3
+001091|ensembleMemberNumber|long|ENSEMBLE MEMBER NUMBER|Numeric|0|0|10|Numeric|0|4
+001092|ensembleForecastType|table|TYPE OF ENSEMBLE FORECAST|CODE TABLE|0|0|8|CODE TABLE|0|3
+001093|balloonLotNumber|string|BALLOON LOT NUMBER|CCITT IA5|0|0|96|Character|0|12
+001094|wbanNumber|long|WBAN NUMBER|Numeric|0|0|17|Numeric|0|5
+001095|observerIdentification|string|OBSERVER IDENTIFICATION|CCITT IA5|0|0|32|Character|0|4
+001096|stationAcquisition|string|STATION ACQUISITION|CCITT IA5|0|0|160|Character|0|20
+001099|uniqueProductDefinition|string|UNIQUE PRODUCT DEFINITION|CCITT IA5|0|0|248|Character|0|31
+001101|stateIdentifier|table|STATE IDENTIFIER|CODE TABLE|0|0|10|CODE TABLE|0|3
+001102|nationalStationNumber|long|NATIONAL STATION NUMBER|Numeric|0|0|30|Numeric|0|9
+001103|imoNumber|long|IMO NUMBER. UNIQUE LLOYD'S REGISTER|Numeric|0|0|24|Numeric|0|7
+001104|stateOrFederalStateIdentifier|string|STATE/FEDERAL STATE IDENTIFIER|CCITT IA5|0|0|32|Character|0|4
+001105|highwayDesignator|string|HIGHWAY DESIGNATOR|CCITT IA5|0|0|40|Character|0|5
+001106|locationAlongHighwayAsIndicatedByPositionMarkers|long|LOCATION ALONG HIGHWAY AS INDICATED BY POSITION MARKERS|m|-2|0|14|m|-2|5
+001110|aircraftTailNumber|string|AIRCRAFT TAIL NUMBER|CCITT IA5|0|0|48|Character|0|6
+001111|originationAirport|string|ORIGINATION AIRPORT|CCITT IA5|0|0|24|Character|0|3
+001112|destinationAirport|string|DESTINATION AIRPORT|CCITT IA5|0|0|24|Character|0|3
+001113|templateVersionNumberDefinedByOriginatingCentre|long|TEMPLATE VERSION NUMBER DEFINED BY ORIGINATING CENTRE|Numeric|1|0|9|Numeric|1|3
+001114|encryptedStationIdentifierBase64Encoding|string|ENCRYPTED SHIP OR MOBILE LAND STATION IDENTIFIER (BASE64 ENCODING)|CCITT IA5|0|0|352|Character|0|44
+001115|identifierOfTheCruiseOrMission|string|IDENTIFIER OF THE CRUISE OR MISSION UNDER WHICH THE DATA WERE COLLECTED|CCITT IA5|0|0|160|Character|0|20
+001124|gridPointIdentifier|long|GRID POINT IDENTIFIER|Numeric|0|0|24|Numeric|0|8
+001144|snapshotIdentifier|long|SNAPSHOT IDENTIFIER|Numeric|0|0|31|Numeric|0|10
+001150|coordinateReferenceSystem|table|COORDINATE REFERENCE SYSTEM|CODE TABLE|0|0|16|CODE TABLE|0|5
+001151|fixedMeanSeaLevelReferenceDatum|table|FIXED MEAN SEA LEVEL REFERENCE DATUM|CODE TABLE|0|0|12|CODE TABLE|0|4
+001152|semiMajorAxisOfRotationEllipsoid|double|SEMI-MAJOR AXIS OF ROTATION ELLIPSOID|m|2|0|31|m|2|11
+001153|semiMinorAxisOfRotationEllipsoid|double|SEMI-MINOR AXIS OF ROTATION ELLIPSOID|m|2|0|31|m|2|11
+002001|stationType|table|TYPE OF STATION|CODE TABLE|0|0|2|CODE TABLE|0|1
+002002|instrumentationForWindMeasurement|flag|TYPE OF INSTRUMENTATION FOR WIND MEASUREMENT|FLAG TABLE|0|0|4|FLAG TABLE|0|2
+002003|measuringEquipmentType|table|TYPE OF MEASURING EQUIPMENT USED|CODE TABLE|0|0|4|CODE TABLE|0|2
+002004|typeOfInstrumentationForEvaporationMeasurement|table|TYPE OF INSTRUMENTATION FOR EVAPORATION MEASUREMENT OR TYPE OF CROP FOR WHICH EVAPOTRANSPIRATION IS REPORTED|CODE TABLE|0|0|4|CODE TABLE|0|2
+002005|temperatureObservationPrecision|double|PRECISION OF TEMPERATURE OBSERVATION|K|2|0|7|K|2|3
+002007|sensorForWaterLevelMeasuringInstrumentType|table|TYPE OF SENSOR FOR WATER LEVEL MEASURING INSTRUMENT|CODE TABLE|0|0|6|CODE TABLE|0|2
+002011|radiosondeType|table|RADIOSONDE TYPE|CODE TABLE|0|0|8|CODE TABLE|0|3
+002012|radiosondeComputationalMethod|table|RADIOSONDE COMPUTATIONAL METHOD|CODE TABLE|0|0|4|CODE TABLE|0|2
+002013|solarAndInfraredRadiationCorrection|table|SOLAR AND INFRARED RADIATION CORRECTION|CODE TABLE|0|0|4|CODE TABLE|0|2
+002014|trackingTechniqueOrStatusOfSystem|table|TRACKING TECHNIQUE/STATUS OF SYSTEM USED|CODE TABLE|0|0|7|CODE TABLE|0|3
+002015|radiosondeCompleteness|table|RADIOSONDE COMPLETENESS|CODE TABLE|0|0|4|CODE TABLE|0|2
+002016|radiosondeConfiguration|flag|RADIOSONDE CONFIGURATION|FLAG TABLE|0|0|5|FLAG TABLE|0|2
+002017|correctionAlgorithmsForHumidityMeasurements|table|CORRECTION ALGORITHMS FOR HUMIDITY MEASUREMENTS|CODE TABLE|0|0|5|CODE TABLE|0|2
+002019|satelliteInstruments|table|SATELLITE INSTRUMENTS|CODE TABLE|0|0|11|CODE TABLE|0|4
+002020|satelliteClassification|table|SATELLITE CLASSIFICATION|CODE TABLE|0|0|9|CODE TABLE|0|3
+002021|satelliteInstrumentDataUsedInProcessing|flag|SATELLITE INSTRUMENT DATA USED IN PROCESSING|FLAG TABLE|0|0|9|FLAG TABLE|0|3
+002022|satelliteDataProcessingTechnique|flag|SATELLITE DATA-PROCESSING TECHNIQUE USED|FLAG TABLE|0|0|8|FLAG TABLE|0|3
+002023|satelliteDerivedWindComputationMethod|table|SATELLITE-DERIVED WIND COMPUTATION METHOD|CODE TABLE|0|0|4|CODE TABLE|0|2
+002024|meanHumidityComputationalMethod|table|INTEGRATED MEAN HUMIDITY COMPUTATIONAL METHOD|CODE TABLE|0|0|4|CODE TABLE|0|2
+002025|satelliteChannelsUsedInComputation|flag|SATELLITE CHANNEL(S) USED IN COMPUTATION|FLAG TABLE|0|0|25|FLAG TABLE|0|9
+002026|crossTrackResolution|double|CROSS-TRACK RESOLUTION|m|2|0|12|m|2|4
+002027|alongTrackResolution|double|ALONG-TRACK RESOLUTION|m|2|0|12|m|2|4
+002028|segmentSizeAtNadirInXDirection|long|SEGMENT SIZE AT NADIR IN X-DIRECTION|m|0|0|18|m|0|6
+002029|segmentSizeAtNadirInYDirection|long|SEGMENT SIZE AT NADIR IN Y-DIRECTION|m|0|0|18|m|0|6
+002030|methodOfCurrentMeasurement|table|METHOD OF CURRENT MEASUREMENT|CODE TABLE|0|0|3|CODE TABLE|0|1
+002031|durationAndTimeOfCurrentMeasurement|table|DURATION AND TIME OF CURRENT MEASUREMENT|CODE TABLE|0|0|5|CODE TABLE|0|2
+002032|indicatorForDigitization|table|INDICATOR FOR DIGITIZATION|CODE TABLE|0|0|2|CODE TABLE|0|1
+002033|methodOfSalinityOrDepthMeasurement|table|METHOD OF SALINITY/DEPTH MEASUREMENT|CODE TABLE|0|0|3|CODE TABLE|0|1
+002034|drogueType|table|DROGUE TYPE|CODE TABLE|0|0|5|CODE TABLE|0|2
+002035|cableLength|long|CABLE LENGTH|m|0|0|9|m|0|3
+002036|buoyType|table|BUOY TYPE|CODE TABLE|0|0|2|CODE TABLE|0|1
+002037|methodOfTidalObservation|table|METHOD OF TIDAL OBSERVATION|CODE TABLE|0|0|3|CODE TABLE|0|1
+002038|methodOfWaterTemperatureAndOrOrSalinityMeasurement|table|METHOD OF WATER TEMPERATURE AND/OR SALINITY MEASUREMENT|CODE TABLE|0|0|4|CODE TABLE|0|2
+002039|methodOfWetBulbTemperatureMeasurement|table|METHOD OF WET-BULB TEMPERATURE MEASUREMENT|CODE TABLE|0|0|3|CODE TABLE|0|1
+002040|methodOfRemovingVelocityAndMotionOfPlatformFromCurrent|table|METHOD OF REMOVING VELOCITY AND MOTION OF PLATFORM FROM CURRENT|CODE TABLE|0|0|4|CODE TABLE|0|2
+002041|methodForEstimatingReportsRelatedToSynopticFeatures|table|METHOD FOR ESTIMATING REPORTS RELATED TO SYNOPTIC FEATURES|CODE TABLE|0|0|6|CODE TABLE|0|2
+002042|indicatorForSeaSurfaceCurrentSpeed|table|INDICATOR FOR SEA-SURFACE CURRENT SPEED|CODE TABLE|0|0|2|CODE TABLE|0|1
+002044|indicatorForMethodOfCalculatingSpectralWaveData|table|INDICATOR FOR METHOD OF CALCULATING SPECTRAL WAVE DATA|CODE TABLE|0|0|4|CODE TABLE|0|2
+002045|platformType|table|INDICATOR FOR TYPE OF PLATFORM|CODE TABLE|0|0|4|CODE TABLE|0|2
+002046|waveMeasurementInstrumentation|table|WAVE MEASUREMENT INSTRUMENTATION|CODE TABLE|0|0|4|CODE TABLE|0|2
+002047|deepOceanTsunameterType|table|DEEP-OCEAN TSUNAMETER TYPE|CODE TABLE|0|0|7|CODE TABLE|0|2
+002048|satelliteSensorIndicator|table|SATELLITE SENSOR INDICATOR|CODE TABLE|0|0|4|CODE TABLE|0|2
+002049|geostationarySatelliteDataProcessingTechnique|flag|GEOSTATIONARY SATELLITE DATA-PROCESSING TECHNIQUE USED|FLAG TABLE|0|0|8|FLAG TABLE|0|3
+002050|geostationarySounderSatelliteChannels|flag|GEOSTATIONARY SOUNDER SATELLITE CHANNELS USED|FLAG TABLE|0|0|20|FLAG TABLE|0|7
+002051|indicatorToSpecifyObservingMethodForExtremeTemperatures|table|INDICATOR TO SPECIFY OBSERVING METHOD FOR EXTREME TEMPERATURES|CODE TABLE|0|0|4|CODE TABLE|0|2
+002052|geostationaryImagerSatelliteChannels|flag|GEOSTATIONARY IMAGER SATELLITE CHANNELS USED|FLAG TABLE|0|0|6|FLAG TABLE|0|2
+002053|goesBrightnessTemperatureCharacteristics|table|GOES-I/M BRIGHTNESS TEMPERATURE CHARACTERISTICS|CODE TABLE|0|0|4|CODE TABLE|0|2
+002054|goesSoundingsParameter|table|GOES-I/M SOUNDINGS PARAMETER CHARACTERISTICS|CODE TABLE|0|0|4|CODE TABLE|0|2
+002055|geostationarySoundingsStatisticalParameters|table|GEOSTATIONARY SOUNDINGS STATISTICAL PARAMETERS|CODE TABLE|0|0|4|CODE TABLE|0|2
+002056|geostationarySoundingsAccuracyStatistics|table|GEOSTATIONARY SOUNDINGS ACCURACY STATISTICS|CODE TABLE|0|0|4|CODE TABLE|0|2
+002057|originOfFirstGuessInformationForGoesIOrMSoundings|table|ORIGIN OF FIRST-GUESS INFORMATION FOR GOES-I/M SOUNDINGS|CODE TABLE|0|0|4|CODE TABLE|0|2
+002058|validTimesOfFirstGuessInformationForGoesIOrMSoundings|table|VALID TIMES OF FIRST-GUESS INFORMATION FOR GOES-I/M SOUNDINGS|CODE TABLE|0|0|4|CODE TABLE|0|2
+002059|originOfAnalysisInformationForGoesIOrMSoundings|table|ORIGIN OF ANALYSIS INFORMATION FOR GOES-I/M SOUNDINGS|CODE TABLE|0|0|4|CODE TABLE|0|2
+002060|originOfSurfaceInformationForGoesIOrMSoundings|table|ORIGIN OF SURFACE INFORMATION FOR GOES-I/M SOUNDINGS|CODE TABLE|0|0|4|CODE TABLE|0|2
+002061|aircraftNavigationalSystem|table|AIRCRAFT NAVIGATIONAL SYSTEM|CODE TABLE|0|0|3|CODE TABLE|0|1
+002062|aircraftDataRelaySystemType|table|TYPE OF AIRCRAFT DATA RELAY SYSTEM|CODE TABLE|0|0|4|CODE TABLE|0|2
+002063|aircraftRollAngle|double|AIRCRAFT ROLL ANGLE|deg|2|-18000|16|deg|2|5
+002064|aircraftRollAngleQuality|table|AIRCRAFT ROLL ANGLE QUALITY|CODE TABLE|0|0|2|CODE TABLE|0|1
+002065|acarsGroundReceivingStation|string|ACARS GROUND-RECEIVING STATION|CCITT IA5|0|0|40|Character|0|5
+002066|radiosondeGroundReceivingSystem|table|RADIOSONDE GROUND RECEIVING SYSTEM|CODE TABLE|0|0|6|CODE TABLE|0|2
+002067|radiosondeOperatingFrequency|long|RADIOSONDE OPERATING FREQUENCY|Hz|-5|0|15|Hz|-5|5
+002070|originalSpecificationOfLatitudeOrLongitude|table|ORIGINAL SPECIFICATION OF LATITUDE/LONGITUDE|CODE TABLE|0|0|4|CODE TABLE|0|2
+002071|spectrographicWavelength|double|SPECTROGRAPHIC WAVELENGTH|m|13|0|30|m|13|10
+002072|spectrographicWidth|double|SPECTROGRAPHIC WIDTH|m|13|0|30|m|13|10
+002080|balloonManufacturer|table|BALLOON MANUFACTURER|CODE TABLE|0|0|6|CODE TABLE|0|2
+002081|balloonType|table|TYPE OF BALLOON|CODE TABLE|0|0|5|CODE TABLE|0|2
+002082|weightOfBalloon|double|WEIGHT OF BALLOON|kg|3|0|12|kg|3|4
+002083|balloonShelterType|table|TYPE OF BALLOON SHELTER|CODE TABLE|0|0|4|CODE TABLE|0|2
+002084|typeOfGasUsedInBalloon|table|TYPE OF GAS USED IN BALLOON|CODE TABLE|0|0|4|CODE TABLE|0|2
+002085|amountOfGasUsedInBalloon|double|AMOUNT OF GAS USED IN BALLOON|kg|3|0|13|kg|3|4
+002086|balloonFlightTrainLength|double|BALLOON FLIGHT TRAIN LENGTH|m|1|0|10|m|1|4
+002087|parachuteSurfaceArea|double|PARACHUTE SURFACE AREA|m2|4|0|15|m2|4|5
+002091|entrySensor4Or20Ma|double|ENTRY SENSOR 4/20 MA|A|4|0|10|A|4|3
+002095|pressureSensorType|table|TYPE OF PRESSURE SENSOR|CODE TABLE|0|0|5|CODE TABLE|0|2
+002096|temperatureSensorType|table|TYPE OF TEMPERATURE SENSOR|CODE TABLE|0|0|5|CODE TABLE|0|2
+002097|humiditySensorType|table|TYPE OF HUMIDITY SENSOR|CODE TABLE|0|0|5|CODE TABLE|0|2
+002099|polarization|table|POLARIZATION|CODE TABLE|0|0|3|CODE TABLE|0|1
+002100|radarConstant|double|RADAR CONSTANT|dB|1|0|12|dB|1|4
+002101|antennaType|table|TYPE OF ANTENNA|CODE TABLE|0|0|4|CODE TABLE|0|2
+002102|antennaHeightAboveTowerBase|long|ANTENNA HEIGHT ABOVE TOWER BASE|m|0|0|8|m|0|3
+002103|radome|flag|RADOME|FLAG TABLE|0|0|2|FLAG TABLE|0|1
+002104|antennaPolarization|table|ANTENNA POLARIZATION|CODE TABLE|0|0|4|CODE TABLE|0|2
+002105|maximumAntennaGain|long|MAXIMUM ANTENNA GAIN|dB|0|0|6|dB|0|2
+002106|3DbBeamwidth|double|3-DB BEAMWIDTH|deg|1|0|6|deg|1|2
+002107|sidelobeSuppression|long|SIDELOBE SUPPRESSION|dB|0|0|6|dB|0|2
+002108|crosspolDiscriminationOnAxis|long|CROSSPOL DISCRIMINATION (ON AXIS)|dB|0|0|6|dB|0|2
+002109|antennaSpeedAzimuth|double|ANTENNA SPEED (AZIMUTH)|deg/s|2|0|12|deg/s|2|4
+002110|antennaSpeedElevation|double|ANTENNA SPEED (ELEVATION)|deg/s|2|0|12|deg/s|2|4
+002111|radarIncidenceAngle|double|RADAR INCIDENCE ANGLE|deg|1|0|10|deg|1|4
+002112|radarLookAngle|double|RADAR LOOK ANGLE|deg|1|0|12|deg|1|4
+002113|numberOfAzimuthLooks|long|NUMBER OF AZIMUTH LOOKS|Numeric|0|0|4|Numeric|0|2
+002114|antennaEffectiveSurfaceArea|long|ANTENNA EFFECTIVE SURFACE AREA|m2|0|0|15|m2|0|5
+002115|surfaceObservingEquipmentType|table|TYPE OF SURFACE OBSERVING EQUIPMENT|CODE TABLE|0|0|5|CODE TABLE|0|2
+002116|percentageOf320MhzBandProcessed|long|PERCENTAGE OF 320 MHZ BAND PROCESSED|%|0|0|7|%|0|3
+002117|percentageOf80MhzBandProcessed|long|PERCENTAGE OF 80 MHZ BAND PROCESSED|%|0|0|7|%|0|3
+002118|percentageOf20MhzBandProcessed|long|PERCENTAGE OF 20 MHZ BAND PROCESSED|%|0|0|7|%|0|3
+002119|ra2InstrumentOperations|table|RA-2 INSTRUMENT OPERATIONS|CODE TABLE|0|0|3|CODE TABLE|0|1
+002120|oceanWaveFrequency|double|OCEAN WAVE FREQUENCY|Hz|3|0|10|Hz|3|4
+002121|meanFrequency|long|MEAN FREQUENCY|Hz|-8|0|7|Hz|-8|3
+002122|frequencyAgilityRange|long|FREQUENCY AGILITY RANGE|Hz|-6|-128|8|Hz|-6|3
+002123|peakPower|long|PEAK POWER|W|-4|0|7|W|-4|3
+002124|averagePower|long|AVERAGE POWER|W|-1|0|7|W|-1|3
+002125|pulseRepetitionFrequency|long|PULSE REPETITION FREQUENCY|Hz|-1|0|8|Hz|-1|3
+002126|pulseWidth|double|PULSE WIDTH|s|7|0|6|s|7|2
+002127|receiverIntermediateFrequency|long|RECEIVER INTERMEDIATE FREQUENCY|Hz|-6|0|7|Hz|-6|3
+002128|intermediateFrequencyBandwidth|long|INTERMEDIATE FREQUENCY BANDWIDTH|Hz|-5|0|6|Hz|-5|2
+002129|minimumDetectableSignal|long|MINIMUM DETECTABLE SIGNAL|dB|0|-150|5|dB|0|3
+002130|dynamicRange|long|DYNAMIC RANGE|dB|0|0|7|dB|0|3
+002131|sensitivityTimeControl|flag|SENSITIVITY TIME CONTROL (STC)|FLAG TABLE|0|0|2|FLAG TABLE|0|1
+002132|azimuthPointingAccuracy|double|AZIMUTH POINTING ACCURACY|deg|2|0|6|deg|2|2
+002133|elevationPointingAccuracy|double|ELEVATION POINTING ACCURACY|deg|2|0|6|deg|2|2
+002134|antennaBeamAzimuth|double|ANTENNA BEAM AZIMUTH|deg|2|0|16|deg|2|5
+002135|antennaElevation|double|ANTENNA ELEVATION|deg|2|-9000|15|deg|2|5
+002136|rangeProcessedByRangeAttenuationCorrection|long|RANGE PROCESSED BY RANGE ATTENUATION CORRECTION|m|-3|0|16|m|-3|5
+002137|radarDualPrfRatio|table|RADAR DUAL PRF RATIO|CODE TABLE|0|0|4|CODE TABLE|0|2
+002138|antennaRotationDirection|table|ANTENNA ROTATION DIRECTION|CODE TABLE|0|0|2|CODE TABLE|0|1
+002139|siralInstrumentConfiguration|table|SIRAL INSTRUMENT CONFIGURATION|CODE TABLE|0|0|2|CODE TABLE|0|1
+002140|satelliteRadarBeamAzimuthAngle|long|SATELLITE RADAR BEAM AZIMUTH ANGLE|deg|0|0|9|deg|0|3
+002141|measurementType|string|MEASUREMENT TYPE|CCITT IA5|0|0|24|Character|0|3
+002142|ozoneInstrument|string|OZONE INSTRUMENT SERIAL NUMBER/IDENTIFICATION|CCITT IA5|0|0|32|Character|0|4
+002143|ozoneInstrumentType|table|OZONE INSTRUMENT TYPE|CODE TABLE|0|0|7|CODE TABLE|0|3
+002144|lightSourceTypeForBrewerSpectrophotometer|table|LIGHT SOURCE TYPE FOR BREWER SPECTROPHOTOMETER|CODE TABLE|0|0|4|CODE TABLE|0|2
+002145|wavelengthSettingForDobsonInstruments|table|WAVELENGTH SETTING FOR DOBSON INSTRUMENTS|CODE TABLE|0|0|4|CODE TABLE|0|2
+002146|sourceConditionsForDobsonInstruments|table|SOURCE CONDITIONS FOR DOBSON INSTRUMENTS|CODE TABLE|0|0|4|CODE TABLE|0|2
+002147|methodOfTransmissionToCollectionCentre|table|METHOD OF TRANSMISSION TO COLLECTION CENTRE|CODE TABLE|0|0|6|CODE TABLE|0|2
+002148|dataCollectionLocationSystem|table|DATA COLLECTION AND/OR LOCATION SYSTEM|CODE TABLE|0|0|5|CODE TABLE|0|2
+002149|dataBuoyType|table|TYPE OF DATA BUOY|CODE TABLE|0|0|6|CODE TABLE|0|2
+002150|tovsOrAtovsOrAvhrrInstrumentationChannelNumber|table|TOVS/ATOVS/AVHRR INSTRUMENTATION CHANNEL NUMBER|CODE TABLE|0|0|6|CODE TABLE|0|2
+002151|radiometerIdentifier|table|RADIOMETER IDENTIFIER|CODE TABLE|0|0|11|CODE TABLE|0|4
+002152|satelliteInstrumentUsedInDataProcessing|flag|SATELLITE INSTRUMENT USED IN DATA PROCESSING|FLAG TABLE|0|0|31|FLAG TABLE|0|10
+002153|satelliteChannelCentreFrequency|long|SATELLITE CHANNEL CENTRE FREQUENCY|Hz|-8|0|26|Hz|-8|8
+002154|satelliteChannelBandWidth|long|SATELLITE CHANNEL BAND WIDTH|Hz|-8|0|26|Hz|-8|8
+002155|satelliteChannelWavelength|double|SATELLITE CHANNEL WAVELENGTH|m|9|0|16|m|9|5
+002156|percentageOfValidKuOceanRetrackerMeasurements|long|PERCENTAGE OF VALID KU OCEAN RETRACKER MEASUREMENTS|%|0|0|7|%|0|3
+002157|percentageOfValidSOceanRetrackerMeasurements|long|PERCENTAGE OF VALID S OCEAN RETRACKER MEASUREMENTS|%|0|0|7|%|0|3
+002158|ra2Instrument|flag|RA-2 INSTRUMENT|FLAG TABLE|0|0|9|FLAG TABLE|0|3
+002159|mwrInstrument|flag|MWR INSTRUMENT|FLAG TABLE|0|0|8|FLAG TABLE|0|3
+002160|radarWaveLength|table|WAVELENGTH OF THE RADAR|CODE TABLE|0|0|4|CODE TABLE|0|2
+002163|heightAssignmentMethod|table|HEIGHT ASSIGNMENT METHOD|CODE TABLE|0|0|4|CODE TABLE|0|2
+002164|tracerCorrelationMethod|table|TRACER CORRELATION METHOD|CODE TABLE|0|0|3|CODE TABLE|0|1
+002165|radianceTypeFlags|flag|RADIANCE TYPE FLAGS|FLAG TABLE|0|0|15|FLAG TABLE|0|5
+002166|radianceType|table|RADIANCE TYPE|CODE TABLE|0|0|4|CODE TABLE|0|2
+002167|radianceComputationalMethod|table|RADIANCE COMPUTATIONAL METHOD|CODE TABLE|0|0|4|CODE TABLE|0|2
+002168|hydrostaticPressureOfLowerEndOfCableThermistorString|long|HYDROSTATIC PRESSURE OF LOWER END OF CABLE (THERMISTOR STRING)|Pa|-3|0|16|kPa|0|5
+002169|anemometerType|table|ANEMOMETER TYPE|CODE TABLE|0|0|4|CODE TABLE|0|2
+002170|aircraftHumiditySensors|table|AIRCRAFT HUMIDITY SENSORS|CODE TABLE|0|0|6|CODE TABLE|0|2
+002171|instrumentSerialNumberForWaterTemperatureProfile|string|INSTRUMENT SERIAL NUMBER FOR WATER TEMPERATURE PROFILE MEASUREMENT|CCITT IA5|0|0|64|Character|0|8
+002172|productTypeForRetrievedAtmosphericGases|table|PRODUCT TYPE FOR RETRIEVED ATMOSPHERIC GASES|CODE TABLE|0|0|8|CODE TABLE|0|3
+002173|squareOfOffNadirAngle|double|SQUARE OF THE OFF-NADIR ANGLE|deg2|4|0|10|deg2|4|4
+002174|meanAcrossTrackPixelNumber|long|MEAN ACROSS TRACK PIXEL NUMBER|Numeric|0|0|9|Numeric|0|3
+002175|methodOfPrecipitationMeasurement|table|METHOD OF PRECIPITATION MEASUREMENT|CODE TABLE|0|0|4|CODE TABLE|0|2
+002176|methodOfStateOfGroundMeasurement|table|METHOD OF STATE OF GROUND MEASUREMENT|CODE TABLE|0|0|4|CODE TABLE|0|2
+002177|methodOfSnowDepthMeasurement|table|METHOD OF SNOW DEPTH MEASUREMENT|CODE TABLE|0|0|4|CODE TABLE|0|2
+002178|methodOfLiquidContentMeasurementOfPrecipitation|table|METHOD OF LIQUID CONTENT MEASUREMENT OF PRECIPITATION|CODE TABLE|0|0|4|CODE TABLE|0|2
+002179|skyConditionAlgorithmType|table|TYPE OF SKY CONDITION ALGORITHM|CODE TABLE|0|0|4|CODE TABLE|0|2
+002180|mainPresentWeatherDetectingSystem|table|MAIN PRESENT WEATHER DETECTING SYSTEM|CODE TABLE|0|0|4|CODE TABLE|0|2
+002181|supplementaryPresentWeatherSensor|flag|SUPPLEMENTARY PRESENT WEATHER SENSOR|FLAG TABLE|0|0|21|FLAG TABLE|0|7
+002182|visibilityMeasurementSystem|table|VISIBILITY MEASUREMENT SYSTEM|CODE TABLE|0|0|4|CODE TABLE|0|2
+002183|cloudDetectionSystem|table|CLOUD DETECTION SYSTEM|CODE TABLE|0|0|4|CODE TABLE|0|2
+002184|lightningDetectionSensorType|table|TYPE OF LIGHTNING DETECTION SENSOR|CODE TABLE|0|0|4|CODE TABLE|0|2
+002185|methodOfEvaporationMeasurement|table|METHOD OF EVAPORATION MEASUREMENT|CODE TABLE|0|0|4|CODE TABLE|0|2
+002186|capabilityToDetectPrecipitationPhenomena|flag|CAPABILITY TO DETECT PRECIPITATION PHENOMENA|FLAG TABLE|0|0|30|FLAG TABLE|0|10
+002187|capabilityToDetectOtherWeatherPhenomena|flag|CAPABILITY TO DETECT OTHER WEATHER PHENOMENA|FLAG TABLE|0|0|18|FLAG TABLE|0|6
+002188|capabilityToDetectObscuration|flag|CAPABILITY TO DETECT OBSCURATION|FLAG TABLE|0|0|21|FLAG TABLE|0|7
+002189|capabilityToDiscriminateLightningStrikes|flag|CAPABILITY TO DISCRIMINATE LIGHTNING STRIKES|FLAG TABLE|0|0|12|FLAG TABLE|0|4
+002190|lagrangianDrifterSubmergenceTimeSubmerged|long|LAGRANGIAN DRIFTER SUBMERGENCE (% TIME SUBMERGED)|%|0|0|7|%|0|3
+002191|geopotentialHeightCalculation|table|GEOPOTENTIAL HEIGHT CALCULATION|CODE TABLE|0|0|4|CODE TABLE|0|2
+003001|surfaceStationType|table|SURFACE STATION TYPE|CODE TABLE|0|0|5|CODE TABLE|0|2
+003003|thermometerOrHygrometerHousing|table|THERMOMETER/HYGROMETER HOUSING|CODE TABLE|0|0|4|CODE TABLE|0|2
+003004|typeOfScreenOrShelterOrRadiationShield|table|TYPE OF SCREEN/SHELTER/RADIATION SHIELD|CODE TABLE|0|0|4|CODE TABLE|0|2
+003005|horizontalWidthOfScreenOrShieldX|double|HORIZONTAL WIDTH OF SCREEN OR SHIELD (X)|m|3|0|16|m|3|5
+003006|horizontalDepthOfScreenOrShieldY|double|HORIZONTAL DEPTH OF SCREEN OR SHIELD (Y)|m|3|0|16|m|3|5
+003007|verticalHeightOfScreenOrShieldZ|double|VERTICAL HEIGHT OF SCREEN OR SHIELD (Z)|m|3|0|16|m|3|5
+003008|artificiallyVentilatedScreenOrShield|table|ARTIFICIALLY VENTILATED SCREEN OR SHIELD|CODE TABLE|0|0|3|CODE TABLE|0|1
+003009|amountOfForcedVentilationAtTimeOfReading|double|AMOUNT OF FORCED VENTILATION AT TIME OF READING|m/s|1|0|9|m/s|1|3
+003010|methodOfSeaOrWaterCurrentMeasurement|table|METHOD OF SEA/WATER CURRENT MEASUREMENT|CODE TABLE|0|0|4|CODE TABLE|0|2
+003011|methodOfDepthCalculation|table|METHOD OF DEPTH CALCULATION|CODE TABLE|0|0|2|CODE TABLE|0|1
+003012|instrumentTypeOrSensorForDissolvedOxygenMeasurement|table|INSTRUMENT TYPE/SENSOR FOR DISSOLVED OXYGEN MEASUREMENT|CODE TABLE|0|0|4|CODE TABLE|0|2
+003016|positionOfRoadSensors|table|POSITION OF ROAD SENSORS|CODE TABLE|0|0|4|CODE TABLE|0|2
+003017|extendedTypeOfStation|flag|EXTENDED TYPE OF STATION|FLAG TABLE|0|0|6|FLAG TABLE|0|2
+003018|typeOfRoad|table|TYPE OF ROAD|CODE TABLE|0|0|5|CODE TABLE|0|2
+003019|typeOfConstruction|table|TYPE OF CONSTRUCTION|CODE TABLE|0|0|4|CODE TABLE|0|2
+003020|materialForThermometerOrHygrometerHousing|table|MATERIAL FOR THERMOMETER/HYGROMETER HOUSING|CODE TABLE|0|0|3|CODE TABLE|0|1
+003021|hygrometerHeating|table|HYGROMETER HEATING|CODE TABLE|0|0|2|CODE TABLE|0|1
+003022|instrumentOwner|table|INSTRUMENT OWNER|CODE TABLE|0|0|3|CODE TABLE|0|1
+003023|configurationOfLouversForThermometerOrHygrometerScreen|table|CONFIGURATION OF LOUVERS FOR THERMOMETER/HYGROMETER SCREEN|CODE TABLE|0|0|3|CODE TABLE|0|1
+003024|psychrometricCoefficient|double|PSYCHROMETRIC COEFFICIENT|K-1|6|0|10|K-1|6|3
+003025|crossTrackEstimationAreaSize|long|CROSS-TRACK ESTIMATION AREA SIZE|m|0|5000|16|m|0|5
+003026|alongTrackEstimationAreaSize|long|ALONG-TRACK ESTIMATION AREA SIZE|m|0|5000|16|m|0|5
+004001|year|long|YEAR|a|0|0|12|a|0|4
+004002|month|long|MONTH|mon|0|0|4|mon|0|2
+004003|day|long|DAY|d|0|0|6|d|0|2
+004004|hour|long|HOUR|h|0|0|5|h|0|2
+004005|minute|long|MINUTE|min|0|0|6|min|0|2
+004006|second|long|SECOND|s|0|0|6|s|0|2
+004007|secondsWithinAMinuteMicrosecond|double|SECONDS WITHIN A MINUTE (MICROSECOND ACCURACY)|s|6|0|26|s|6|8
+004011|timeIncrement|long|TIME INCREMENT|a|0|-1024|11|a|0|4
+004012|timeIncrement|long|TIME INCREMENT|mon|0|-1024|11|mon|0|4
+004013|timeIncrement|long|TIME INCREMENT|d|0|-1024|11|d|0|4
+004014|timeIncrement|long|TIME INCREMENT|h|0|-1024|11|h|0|4
+004015|timeIncrement|long|TIME INCREMENT|min|0|-2048|12|min|0|4
+004016|timeIncrement|long|TIME INCREMENT|s|0|-4096|13|s|0|4
+004017|referenceTimePeriodForAccumulatedOrExtremeData|long|REFERENCE TIME PERIOD FOR ACCUMULATED OR EXTREME DATA|min|0|-1440|12|min|0|4
+004021|timePeriod|long|TIME PERIOD OR DISPLACEMENT|a|0|-1024|11|a|0|4
+004022|timePeriod|long|TIME PERIOD OR DISPLACEMENT|mon|0|-1024|11|mon|0|4
+004023|timePeriod|long|TIME PERIOD OR DISPLACEMENT|d|0|-1024|11|d|0|4
+004024|timePeriod|long|TIME PERIOD OR DISPLACEMENT|h|0|-2048|12|h|0|4
+004025|timePeriod|long|TIME PERIOD OR DISPLACEMENT|min|0|-2048|12|min|0|4
+004026|timePeriod|long|TIME PERIOD OR DISPLACEMENT|s|0|-4096|13|s|0|4
+004031|durationOfTimeRelatingToFollowingValue|long|DURATION OF TIME RELATING TO FOLLOWING VALUE|h|0|0|8|h|0|3
+004032|durationOfTimeRelatingToFollowingValue|long|DURATION OF TIME RELATING TO FOLLOWING VALUE|min|0|0|6|min|0|2
+004041|timeDifferenceUtcLmt|long|TIME DIFFERENCE, UTC - LMT|min|0|-1440|12|min|0|4
+004043|dayOfYear|long|DAY OF THE YEAR|d|0|0|9|d|0|3
+004051|principalTimeOfDailyReadingOfMaximumTemperature|long|PRINCIPAL TIME OF DAILY READING OF MAXIMUM TEMPERATURE|h|0|0|5|h|0|2
+004052|principalTimeOfDailyReadingOfMinimumTemperature|long|PRINCIPAL TIME OF DAILY READING OF MINIMUM TEMPERATURE|h|0|0|5|h|0|2
+004053|numberOfDaysWithPrecipitationEqualToOrMoreThan1Mm|long|NUMBER OF DAYS WITH PRECIPITATION EQUAL TO OR MORE THAN 1 MM|Numeric|0|0|6|Numeric|0|2
+004059|timesOfObservationUsedToComputeReportedMeanValues|flag|TIMES OF OBSERVATION USED TO COMPUTE THE REPORTED MEAN VALUES|FLAG TABLE|0|0|6|FLAG TABLE|0|2
+004065|timeIncrement|long|SHORT TIME INCREMENT|min|0|-128|8|min|0|2
+004066|timeIncrement|long|SHORT TIME INCREMENT|s|0|-128|8|s|0|2
+004073|timePeriod|long|SHORT TIME PERIOD OR DISPLACEMENT|d|0|-128|8|d|0|2
+004074|timePeriod|long|SHORT TIME PERIOD OR DISPLACEMENT|h|0|-128|8|h|0|2
+004075|timePeriod|long|SHORT TIME PERIOD OR DISPLACEMENT|min|0|-128|8|min|0|2
+004080|averagingPeriodForFollowingValue|table|AVERAGING PERIOD FOR FOLLOWING VALUE|CODE TABLE|0|0|4|CODE TABLE|0|2
+004086|timePeriod|long|LONG TIME PERIOD OR DISPLACEMENT|s|0|-8192|15|s|0|5
+005001|latitude|double|LATITUDE (HIGH ACCURACY)|deg|5|-9000000|25|deg|5|7
+005002|latitude|double|LATITUDE (COARSE ACCURACY)|deg|2|-9000|15|deg|2|4
+005011|latitudeIncrement|double|LATITUDE INCREMENT (HIGH ACCURACY)|deg|5|-9000000|25|deg|5|7
+005012|latitudeIncrement|double|LATITUDE INCREMENT (COARSE ACCURACY)|deg|2|-9000|15|deg|2|4
+005015|latitudeDisplacement|double|LATITUDE DISPLACEMENT (HIGH ACCURACY)|deg|5|-9000000|25|deg|5|7
+005016|latitudeDisplacement|double|LATITUDE DISPLACEMENT (COARSE ACCURACY)|deg|2|-9000|15|deg|2|4
+005021|bearingOrAzimuth|double|BEARING OR AZIMUTH|deg|2|0|16|deg|2|5
+005022|solarAzimuth|double|SOLAR AZIMUTH|deg|2|0|16|deg|2|5
+005023|sunToSatelliteAzimuthDifference|double|SUN TO SATELLITE AZIMUTH DIFFERENCE|deg|1|-1800|12|deg|1|4
+005030|directionSpectral|long|DIRECTION (SPECTRAL)|deg|0|0|12|deg|0|4
+005031|rowNumber|long|ROW NUMBER|Numeric|0|0|12|Numeric|0|4
+005032|yOffset|double|Y OFFSET|m|2|-1073741824|31|m|2|11
+005033|pixelSizeOnHorizontal1|long|PIXEL SIZE ON HORIZONTAL - 1|m|-1|0|16|m|-1|5
+005034|alongTrackRowNumber|long|ALONG TRACK ROW NUMBER|Numeric|0|0|11|Numeric|0|4
+005035|xDimensionMaximumSize|long|MAXIMUM SIZE OF X-DIMENSION|Numeric|0|0|12|Numeric|0|4
+005036|shipTransectNumberAccordingToSoop|long|SHIP TRANSECT NUMBER ACCORDING TO SOOP|Numeric|0|0|7|Numeric|0|2
+005040|orbitNumber|long|ORBIT NUMBER|Numeric|0|0|24|Numeric|0|8
+005041|scanLineNumber|long|SCAN LINE NUMBER|Numeric|0|0|8|Numeric|0|3
+005042|channelNumber|long|CHANNEL NUMBER|Numeric|0|0|6|Numeric|0|2
+005043|fieldOfViewNumber|long|FIELD OF VIEW NUMBER|Numeric|0|0|8|Numeric|0|3
+005044|satelliteCycleNumber|long|SATELLITE CYCLE NUMBER|Numeric|0|0|11|Numeric|0|4
+005045|fieldOfRegardNumber|long|FIELD OF REGARD NUMBER|Numeric|0|0|8|Numeric|0|3
+005052|channelNumberIncrement|long|CHANNEL NUMBER INCREMENT|Numeric|0|0|5|Numeric|0|2
+005053|fieldOfViewNumberIncrement|long|FIELD OF VIEW NUMBER INCREMENT|Numeric|0|0|5|Numeric|0|2
+005060|yAngularPositionFromCentreOfGravity|double|Y ANGULAR POSITION FROM CENTRE OF GRAVITY|deg|6|-8000000|24|deg|6|8
+005061|zAngularPositionFromCentreOfGravity|double|Z ANGULAR POSITION FROM CENTRE OF GRAVITY|deg|6|-8000000|24|deg|6|8
+005063|spacecraftRoll|double|SPACECRAFT ROLL|deg|2|0|16|deg|2|5
+005064|spacecraftPitch|double|SPACECRAFT PITCH|deg|2|0|16|deg|2|5
+005066|spacecraftYaw|double|SPACECRAFT YAW|deg|2|0|16|deg|2|5
+005067|numberOfScanLines|long|NUMBER OF SCAN LINES|Numeric|0|0|8|Numeric|0|3
+005068|profileNumber|long|PROFILE NUMBER|Numeric|0|0|16|Numeric|0|5
+005069|receiverChannel|table|RECEIVER CHANNEL|CODE TABLE|0|0|2|CODE TABLE|0|1
+005070|observationIdentifier|long|OBSERVATION IDENTIFIER|Numeric|0|0|30|Numeric|0|10
+005071|stripmapIdentifier|long|STRIPMAP IDENTIFIER|Numeric|0|0|16|Numeric|0|5
+005072|numberOfSpectraInRangeDirection|long|NUMBER OF SPECTRA IN RANGE DIRECTION|Numeric|0|0|8|Numeric|0|3
+005073|numberOfSpectraInAzimuthalDirection|long|NUMBER OF SPECTRA IN AZIMUTHAL DIRECTION|Numeric|0|0|8|Numeric|0|3
+005074|indexInRangeDirection|long|INDEX IN RANGE DIRECTION|Numeric|0|0|8|Numeric|0|3
+005075|indexInAzimuthalDirection|long|INDEX IN AZIMUTHAL DIRECTION|Numeric|0|0|8|Numeric|0|3
+006001|longitude|double|LONGITUDE (HIGH ACCURACY)|deg|5|-18000000|26|deg|5|8
+006002|longitude|double|LONGITUDE (COARSE ACCURACY)|deg|2|-18000|16|deg|2|5
+006011|longitudeIncrement|double|LONGITUDE INCREMENT (HIGH ACCURACY)|deg|5|-18000000|26|deg|5|8
+006012|longitudeIncrement|double|LONGITUDE INCREMENT (COARSE ACCURACY)|deg|2|-18000|16|deg|2|5
+006015|longitudeDisplacement|double|LONGITUDE DISPLACEMENT (HIGH ACCURACY)|deg|5|-18000000|26|deg|5|8
+006016|longitudeDisplacement|double|LONGITUDE DISPLACEMENT (COARSE ACCURACY)|deg|2|-18000|16|deg|2|5
+006021|distance|long|DISTANCE|m|-1|0|13|m|-1|4
+006029|waveNumber|double|WAVE NUMBER|/m|1|0|22|/m|1|7
+006030|waveNumberSpectral|double|WAVE NUMBER (SPECTRAL)|rad/m|5|0|13|rad/m|5|4
+006031|columnNumber|long|COLUMN NUMBER|Numeric|0|0|12|Numeric|0|4
+006032|xOffset|double|X OFFSET|m|2|-1073741824|31|m|2|11
+006033|pixelSizeOnHorizontal2|long|PIXEL SIZE ON HORIZONTAL - 2|m|-1|0|16|m|-1|5
+006034|crossTrackCellNumber|long|CROSS-TRACK CELL NUMBER|Numeric|0|0|7|Numeric|0|3
+006035|yDimensionMaximumSize|long|MAXIMUM SIZE OF Y-DIMENSION|Numeric|0|0|12|Numeric|0|4
+006040|radiusOfConfidence|long|RADIUS OF CONFIDENCE|m|0|0|13|m|0|4
+007001|heightOfStation|long|HEIGHT OF STATION|m|0|-400|15|m|0|5
+007002|height|long|HEIGHT OR ALTITUDE|m|-1|-40|16|m|-1|5
+007003|geopotential|long|GEOPOTENTIAL|m2 s-2|-1|-400|17|m2 s-2|-1|6
+007004|pressure|long|PRESSURE|Pa|-1|0|14|Pa|-1|5
+007005|heightIncrement|long|HEIGHT INCREMENT|m|0|-400|12|m|0|4
+007006|heightAboveStation|long|HEIGHT ABOVE STATION|m|0|0|15|m|0|5
+007007|height|long|HEIGHT|m|0|-1000|17|m|0|6
+007008|geopotential|long|GEOPOTENTIAL|m2 s-2|0|-10000|20|m2 s-2|0|7
+007009|geopotentialHeight|long|GEOPOTENTIAL HEIGHT|gpm|0|-1000|17|gpm|0|5
+007010|flightLevel|long|FLIGHT LEVEL|m|0|-1024|16|ft|-1|5
+007012|gridPointAltitude|double|GRID POINT ALTITUDE|m|2|-50000|20|m|2|7
+007021|elevation|double|ELEVATION|deg|2|-9000|15|deg|2|5
+007022|solarElevation|double|SOLAR ELEVATION|deg|2|-9000|15|deg|2|5
+007024|satelliteZenithAngle|double|SATELLITE ZENITH ANGLE|deg|2|-9000|15|deg|2|5
+007025|solarZenithAngle|double|SOLAR ZENITH ANGLE|deg|2|-9000|15|deg|2|5
+007026|satelliteZenithAngle|double|SATELLITE ZENITH ANGLE|deg|4|-900000|21|deg|4|7
+007030|heightOfStationGroundAboveMeanSeaLevel|double|HEIGHT OF STATION GROUND ABOVE MEAN SEA LEVEL|m|1|-4000|17|m|1|5
+007031|heightOfBarometerAboveMeanSeaLevel|double|HEIGHT OF BAROMETER ABOVE MEAN SEA LEVEL|m|1|-4000|17|m|1|5
+007032|heightOfSensorAboveLocalGroundOrDeckOfMarinePlatform|double|HEIGHT OF SENSOR ABOVE LOCAL GROUND (OR DECK OF MARINE PLATFORM)|m|2|0|16|m|2|5
+007033|heightOfSensorAboveWaterSurface|double|HEIGHT OF SENSOR ABOVE WATER SURFACE|m|1|0|12|m|1|4
+007035|zDimensionMaximumSize|long|MAXIMUM SIZE OF Z-DIMENSION|Numeric|0|0|12|Numeric|0|4
+007036|levelIndexOfZ|long|LEVEL INDEX OF Z|Numeric|0|0|12|Numeric|0|4
+007040|impactParameter|double|IMPACT PARAMETER|m|1|62000000|22|m|1|8
+007061|depthBelowLandSurface|double|DEPTH BELOW LAND SURFACE|m|2|0|14|m|2|5
+007062|depthBelowWaterSurface|double|DEPTH BELOW SEA/WATER SURFACE|m|1|0|17|m|1|6
+007063|depthBelowWaterSurface|double|DEPTH BELOW SEA/WATER SURFACE (CM)|m|2|0|20|m|2|7
+007064|representativeHeightOfSensorAboveStation|long|REPRESENTATIVE HEIGHT OF SENSOR ABOVE STATION|m|0|0|4|m|0|2
+007065|waterPressure|long|WATER PRESSURE|Pa|-3|0|17|Pa|-3|6
+007070|drogueDepth|long|DROGUE DEPTH|m|0|0|10|m|0|4
+007071|height|double|HEIGHT (HIGH RESOLUTION)|m|3|-10000000|26|m|3|8
+008001|verticalSoundingSignificance|flag|VERTICAL SOUNDING SIGNIFICANCE|FLAG TABLE|0|0|7|FLAG TABLE|0|3
+008002|verticalSignificanceSurfaceObservations|table|VERTICAL SIGNIFICANCE (SURFACE OBSERVATIONS)|CODE TABLE|0|0|6|CODE TABLE|0|2
+008003|verticalSignificanceSatelliteObservations|table|VERTICAL SIGNIFICANCE (SATELLITE OBSERVATIONS)|CODE TABLE|0|0|6|CODE TABLE|0|2
+008004|phaseOfAircraftFlight|table|PHASE OF AIRCRAFT FLIGHT|CODE TABLE|0|0|3|CODE TABLE|0|1
+008005|meteorologicalAttributeSignificance|table|METEOROLOGICAL ATTRIBUTE SIGNIFICANCE|CODE TABLE|0|0|4|CODE TABLE|0|2
+008006|ozoneVerticalSoundingSignificance|flag|OZONE VERTICAL SOUNDING SIGNIFICANCE|FLAG TABLE|0|0|9|FLAG TABLE|0|3
+008007|dimensionalSignificance|table|DIMENSIONAL SIGNIFICANCE|CODE TABLE|0|0|4|CODE TABLE|0|2
+008008|radiationVerticalSoundingSignificance|flag|RADIATION VERTICAL SOUNDING SIGNIFICANCE|FLAG TABLE|0|0|9|FLAG TABLE|0|3
+008009|detailedPhaseOfFlight|table|DETAILED PHASE OF FLIGHT|CODE TABLE|0|0|4|CODE TABLE|0|2
+008010|surfaceQualifierForTemperatureData|table|SURFACE QUALIFIER (FOR TEMPERATURE DATA)|CODE TABLE|0|0|5|CODE TABLE|0|2
+008011|meteorologicalFeature|table|METEOROLOGICAL FEATURE|CODE TABLE|0|0|6|CODE TABLE|0|2
+008012|landOrSeaQualifier|table|LAND/SEA QUALIFIER|CODE TABLE|0|0|2|CODE TABLE|0|1
+008013|dayOrNightQualifier|table|DAY/NIGHT QUALIFIER|CODE TABLE|0|0|2|CODE TABLE|0|1
+008014|qualifierForRunwayVisualRange|table|QUALIFIER FOR RUNWAY VISUAL RANGE|CODE TABLE|0|0|4|CODE TABLE|0|2
+008015|significantQualifierForSensor|table|SIGNIFICANT QUALIFIER FOR SENSOR|CODE TABLE|0|0|3|CODE TABLE|0|1
+008016|changeQualifierOfATrendTypeForecastOrAnAerodromeForecast|table|CHANGE QUALIFIER OF A TREND-TYPE FORECAST OR AN AERODROME FORECAST|CODE TABLE|0|0|3|CODE TABLE|0|1
+008017|qualifierOfTimeWhenForecastChangeExpected|table|QUALIFIER OF THE TIME WHEN THE FORECAST CHANGE IS EXPECTED|CODE TABLE|0|0|2|CODE TABLE|0|1
+008018|seawindsLandOrIceSurfaceType|flag|SEAWINDS LAND/ICE SURFACE TYPE|FLAG TABLE|0|0|17|FLAG TABLE|0|6
+008019|qualifierForFollowingCentreIdentifier|table|QUALIFIER FOR FOLLOWING CENTRE IDENTIFIER|CODE TABLE|0|0|4|CODE TABLE|0|2
+008020|totalNumberOfMissingEntitiesWithRespectToAccumulationOrAverage|long|TOTAL NUMBER OF MISSING ENTITIES (WITH RESPECT TO ACCUMULATION OR AVERAGE)|Numeric|0|0|16|Numeric|0|5
+008021|timeSignificance|table|TIME SIGNIFICANCE|CODE TABLE|0|0|5|CODE TABLE|0|2
+008022|totalNumberWithRespectToAccumulationOrAverage|long|TOTAL NUMBER (WITH RESPECT TO ACCUMULATION OR AVERAGE)|Numeric|0|0|16|Numeric|0|5
+008023|firstOrderStatistics|table|FIRST-ORDER STATISTICS|CODE TABLE|0|0|6|CODE TABLE|0|2
+008024|differenceStatistics|table|DIFFERENCE STATISTICS|CODE TABLE|0|0|6|CODE TABLE|0|2
+008025|timeDifferenceQualifier|table|TIME DIFFERENCE QUALIFIER|CODE TABLE|0|0|4|CODE TABLE|0|2
+008026|matrixSignificance|table|MATRIX SIGNIFICANCE|CODE TABLE|0|0|6|CODE TABLE|0|2
+008029|surfaceType|table|SURFACE TYPE|CODE TABLE|0|0|8|CODE TABLE|0|3
+008030|manualOnCodesVolumeI1SectionCCodeTableFromWhichDataAreDerived|long|MANUAL ON CODES (VOLUME I.1, SECTION C) CODE TABLE FROM WHICH DATA ARE DERIVED|Numeric|0|0|13|Numeric|0|4
+008031|dataCategoryCrexTableA|long|DATA CATEGORY - CREX TABLE A|Numeric|0|0|8|Numeric|0|3
+008032|statusOfOperation|table|STATUS OF OPERATION|CODE TABLE|0|0|4|CODE TABLE|0|2
+008033|methodOfDerivationOfPercentageConfidence|table|METHOD OF DERIVATION OF PERCENTAGE CONFIDENCE|CODE TABLE|0|0|7|CODE TABLE|0|3
+008034|temperatureOrSalinityMeasurementQualifier|table|TEMPERATURE/SALINITY MEASUREMENT QUALIFIER|CODE TABLE|0|0|4|CODE TABLE|0|2
+008035|monitoringExerciseType|table|TYPE OF MONITORING EXERCISE|CODE TABLE|0|0|3|CODE TABLE|0|1
+008036|typeOfCentreOrStationPerformingMonitoring|table|TYPE OF CENTRE OR STATION PERFORMING MONITORING|CODE TABLE|0|0|3|CODE TABLE|0|1
+008039|timeSignificanceAviationForecast|table|TIME SIGNIFICANCE (AVIATION FORECAST)|CODE TABLE|0|0|6|CODE TABLE|0|2
+008040|flightLevelSignificance|table|FLIGHT LEVEL SIGNIFICANCE|CODE TABLE|0|0|6|CODE TABLE|0|2
+008041|dataSignificance|table|DATA SIGNIFICANCE|CODE TABLE|0|0|5|CODE TABLE|0|2
+008042|extendedVerticalSoundingSignificance|flag|EXTENDED VERTICAL SOUNDING SIGNIFICANCE|FLAG TABLE|0|0|18|FLAG TABLE|0|6
+008043|atmosphericChemical|table|ATMOSPHERIC CHEMICAL OR PHYSICAL CONSTITUENT TYPE|CODE TABLE|0|0|8|CODE TABLE|0|3
+008044|casRegistryNumber|string|CAS REGISTRY NUMBER|CCITT IA5|0|0|88|Character|0|11
+008046|atmosphericChemical|table|ATMOSPHERIC CHEMICAL OR PHYSICAL CONSTITUENT TYPE|Common CODE TABLE C-14|0|0|16|Common CODE TABLE C-14|0|5
+008049|numberOfObservations|long|NUMBER OF OBSERVATIONS|Numeric|0|0|8|Numeric|0|3
+008050|qualifierForNumberOfMissingValuesInCalculationOfStatistic|table|QUALIFIER FOR NUMBER OF MISSING VALUES IN CALCULATION OF STATISTIC|CODE TABLE|0|0|4|CODE TABLE|0|2
+008051|qualifierForNumberOfMissingValuesInCalculationOfStatistic|table|QUALIFIER FOR NUMBER OF MISSING VALUES IN CALCULATION OF STATISTIC|CODE TABLE|0|0|3|CODE TABLE|0|1
+008052|conditionForWhichNumberOfDaysOfOccurrenceFollows|table|CONDITION FOR WHICH NUMBER OF DAYS OF OCCURRENCE FOLLOWS|CODE TABLE|0|0|5|CODE TABLE|0|2
+008053|dayOfOccurrenceQualifier|table|DAY OF OCCURRENCE QUALIFIER|CODE TABLE|0|0|2|CODE TABLE|0|1
+008054|qualifierForWindSpeedOrWindGusts|table|QUALIFIER FOR WIND SPEED OR WIND GUSTS|CODE TABLE|0|0|3|CODE TABLE|0|1
+008060|sampleScanningModeSignificance|table|SAMPLE SCANNING MODE SIGNIFICANCE|CODE TABLE|0|0|4|CODE TABLE|0|2
+008065|sunGlintIndicator|table|SUN-GLINT INDICATOR|CODE TABLE|0|0|2|CODE TABLE|0|1
+008066|semiTransparencyIndicator|table|SEMI-TRANSPARENCY INDICATOR|CODE TABLE|0|0|2|CODE TABLE|0|1
+008070|tovsOrAtovsProductQualifier|table|TOVS/ATOVS PRODUCT QUALIFIER|CODE TABLE|0|0|4|CODE TABLE|0|2
+008072|pixelType|table|PIXEL(S) TYPE|CODE TABLE|0|0|3|CODE TABLE|0|1
+008074|altimeterEchoType|table|ALTIMETER ECHO TYPE|CODE TABLE|0|0|2|CODE TABLE|0|1
+008075|orbitQualifier|table|ASCENDING/DESCENDING ORBIT QUALIFIER|CODE TABLE|0|0|2|CODE TABLE|0|1
+008076|band|table|TYPE OF BAND|CODE TABLE|0|0|6|CODE TABLE|0|2
+008077|radiometerSensedSurfaceType|table|RADIOMETER SENSED SURFACE TYPE|CODE TABLE|0|0|7|CODE TABLE|0|3
+008079|productStatus|table|PRODUCT STATUS|CODE TABLE|0|0|4|CODE TABLE|0|2
+008080|qualifierForGtsppQualityFlag|table|QUALIFIER FOR GTSPP QUALITY FLAG|CODE TABLE|0|0|6|CODE TABLE|0|2
+008081|equipmentType|table|TYPE OF EQUIPMENT|CODE TABLE|0|0|6|CODE TABLE|0|2
+008082|modificationOfSensorHeightToAnotherValue|table|MODIFICATION OF SENSOR HEIGHT TO ANOTHER VALUE|CODE TABLE|0|0|3|CODE TABLE|0|1
+008083|nominalValueIndicator|flag|NOMINAL VALUE INDICATOR|FLAG TABLE|0|0|15|FLAG TABLE|0|5
+008085|beamIdentifier|table|BEAM IDENTIFIER|CODE TABLE|0|0|3|CODE TABLE|0|1
+008086|verticalSignificanceForNwp|flag|VERTICAL SIGNIFICANCE FOR NWP|FLAG TABLE|0|0|12|FLAG TABLE|0|4
+008087|cornerPositionOfObservation|table|CORNER POSITION OF OBSERVATION|CODE TABLE|0|0|3|CODE TABLE|0|1
+008088|mapSignificance|table|MAP SIGNIFICANCE|CODE TABLE|0|0|6|CODE TABLE|0|2
+008090|decimalScaleOfFollowingSignificands|long|DECIMAL SCALE OF FOLLOWING SIGNIFICANDS|Numeric|0|-127|8|Numeric|0|3
+008091|coordinatesSignificance|table|COORDINATES SIGNIFICANCE|CODE TABLE|0|0|8|CODE TABLE|0|3
+010001|heightOfLandSurface|long|HEIGHT OF LAND SURFACE|m|0|-400|15|m|0|5
+010002|nonCoordinateHeight|long|HEIGHT|m|-1|-40|16|m|-1|5
+010003|nonCoordinateGeopotential|long|GEOPOTENTIAL|m2 s-2|-1|-400|17|m2 s-2|-1|6
+010004|nonCoordinatePressure|long|PRESSURE|Pa|-1|0|14|Pa|-1|5
+010007|nonCoordinateHeight|long|HEIGHT|m|0|-1000|17|m|0|6
+010008|nonCoordinateGeopotential|long|GEOPOTENTIAL|m2 s-2|0|-10000|20|m2 s-2|0|7
+010009|nonCoordinateGeopotentialHeight|long|GEOPOTENTIAL HEIGHT|gpm|0|-1000|17|gpm|0|5
+010010|minimumPressureReducedToMeanSeaLevel|long|MINIMUM PRESSURE REDUCED TO MEAN SEA LEVEL|Pa|-1|0|14|Pa|-1|5
+010011|maximumPressureReducedToMeanSeaLevel|long|MAXIMUM PRESSURE REDUCED TO MEAN SEA LEVEL|Pa|-1|0|14|Pa|-1|5
+010031|DistanceFromEarthCentreInDirectionOfNorthPole|double|IN DIRECTION OF THE NORTH POLE, DISTANCE FROM THE EARTH'S CENTRE|m|2|-1073741824|31|m|2|10
+010032|satelliteDistanceToEarthCentre|double|SATELLITE DISTANCE TO EARTH'S CENTRE|m|1|0|27|m|2|9
+010033|altitudePlatformToEllipsoid|double|ALTITUDE (PLATFORM TO ELLIPSOID)|m|1|0|27|m|2|9
+010034|earthRadius|double|EARTH'S RADIUS|m|1|0|27|m|2|9
+010035|earthLocalRadiusOfCurvature|double|EARTH'S LOCAL RADIUS OF CURVATURE|m|1|62000000|22|m|1|8
+010036|geoidUndulation|double|GEOID UNDULATION|m|2|-15000|15|m|2|6
+010038|maximumHeightOfDeckCargoAboveSummerLoadLine|long|MAXIMUM HEIGHT OF DECK CARGO ABOVE SUMMER LOAD LINE|m|0|0|6|m|0|2
+010039|departureOfReferenceLevelSummerMaximumLoadLineFromActualSeaLevel|long|DEPARTURE OF REFERENCE LEVEL (SUMMER MAXIMUM LOAD LINE) FROM ACTUAL SEA LEVEL|m|0|-32|6|m|0|3
+010040|numberOfRetrievedLayers|long|NUMBER OF RETRIEVED LAYERS|Numeric|0|0|10|Numeric|0|4
+010050|standardDeviationAltitude|double|STANDARD DEVIATION ALTITUDE|m|2|0|16|m|2|5
+010051|pressureReducedToMeanSeaLevel|long|PRESSURE REDUCED TO MEAN SEA LEVEL|Pa|-1|0|14|Pa|-1|5
+010052|altimeterSettingQnh|long|ALTIMETER SETTING (QNH)|Pa|-1|0|14|Pa|-1|5
+010053|globalNavigationSatelliteSystemAltitude|long|GLOBAL NAVIGATION SATELLITE SYSTEM ALTITUDE|m|0|-1000|17|m|0|5
+010060|pressureChange|long|PRESSURE CHANGE|Pa|-1|-1024|11|Pa|-1|4
+010061|3HourPressureChange|long|3-HOUR PRESSURE CHANGE|Pa|-1|-500|10|Pa|-1|4
+010062|24HourPressureChange|long|24-HOUR PRESSURE CHANGE|Pa|-1|-1000|11|Pa|-1|4
+010063|characteristicOfPressureTendency|table|CHARACTERISTIC OF PRESSURE TENDENCY|CODE TABLE|0|0|4|CODE TABLE|0|2
+010064|sigmetCruisingLevel|table|SIGMET CRUISING LEVEL|CODE TABLE|0|0|3|CODE TABLE|0|1
+010070|indicatedAircraftAltitude|long|INDICATED AIRCRAFT ALTITUDE|m|0|-400|16|m|0|5
+010079|offNadirAngleOfTheSatelliteFromPlatformData|double|OFF-NADIR ANGLE OF THE SATELLITE FROM PLATFORM DATA|deg|4|0|16|deg|4|5
+010080|viewingZenithAngle|double|VIEWING ZENITH ANGLE|deg|2|-9000|15|deg|2|5
+010081|cogAltitudeAboveReferenceEllipsoid|double|ALTITUDE OF COG ABOVE REFERENCE ELLIPSOID|m|3|0|31|m|3|10
+010082|instantaneousAltitudeRate|double|INSTANTANEOUS ALTITUDE RATE|m/s|3|-65536|17|m/s|3|6
+010083|squaredOffNadirAngleOfSatelliteFromPlatformData|double|SQUARED OFF-NADIR ANGLE OF THE SATELLITE FROM PLATFORM DATA|deg2|2|0|16|deg2|2|5
+010084|squaredOffNadirAngleOfSatelliteFromWaveformData|double|SQUARED OFF-NADIR ANGLE OF THE SATELLITE FROM WAVEFORM DATA|deg2|2|0|16|deg2|2|5
+010085|meanSeaSurfaceHeight|double|MEAN SEA-SURFACE HEIGHT|m|3|-131072|18|m|3|6
+010086|geoidHeight|double|GEOID'S HEIGHT|m|3|-131072|18|m|3|6
+010087|oceanDepthOrLandElevation|double|OCEAN DEPTH/LAND ELEVATION|m|1|-131072|18|m|1|6
+010088|totalGeocentricOceanTideHeightSolution1|double|TOTAL GEOCENTRIC OCEAN TIDE HEIGHT (SOLUTION 1)|m|3|-32768|16|m|3|5
+010089|totalGeocentricOceanTideHeightSolution2|double|TOTAL GEOCENTRIC OCEAN TIDE HEIGHT (SOLUTION 2)|m|3|-32768|16|m|3|5
+010090|longPeriodTideHeight|double|LONG PERIOD TIDE HEIGHT|m|3|-32768|16|m|3|5
+010091|tidalLoadingHeight|double|TIDAL LOADING HEIGHT|m|3|-32768|16|m|3|5
+010092|solidEarthTideHeight|double|SOLID EARTH TIDE HEIGHT|m|3|-32768|16|m|3|5
+010093|geocentricPoleTideHeight|double|GEOCENTRIC POLE TIDE HEIGHT|m|3|-32768|16|m|3|5
+010095|heightOfAtmosphere|long|HEIGHT OF ATMOSPHERE USED|m|0|0|16|m|0|5
+010096|meanDynamicTopography|double|MEAN DYNAMIC TOPOGRAPHY|m|3|-131072|18|m|3|6
+010097|meanSeaSurfaceHeightFromAltimeterOnly|double|MEAN SEA-SURFACE HEIGHT FROM ALTIMETER ONLY|m|3|-131072|18|m|3|6
+010098|loadingTideHeightGeocentricOceanTideSolution1|double|LOADING TIDE HEIGHT GEOCENTRIC OCEAN TIDE SOLUTION 1|m|4|-2000|12|m|4|4
+010099|loadingTideHeightGeocentricOceanTideSolution2|double|LOADING TIDE HEIGHT GEOCENTRIC OCEAN TIDE SOLUTION 2|m|4|-2000|12|m|4|4
+010100|nonEquilibriumLongPeriodTideHeight|double|NON-EQUILIBRIUM LONG PERIOD TIDE HEIGHT|m|4|-2000|12|m|4|4
+010101|squaredOffNadirAngleOfSatelliteFromWaveformData|double|SQUARED OFF-NADIR ANGLE OF THE SATELLITE FROM WAVEFORM DATA|deg2|2|-32768|16|deg2|2|5
+010102|seaSurfaceHeightAnomaly|double|SEA-SURFACE HEIGHT ANOMALY|m|3|-32768|16|m|3|5
+011001|windDirection|long|WIND DIRECTION|deg|0|0|9|deg|0|3
+011002|windSpeed|double|WIND SPEED|m/s|1|0|12|m/s|1|4
+011003|u|double|U-COMPONENT|m/s|1|-4096|13|m/s|1|4
+011004|v|double|V-COMPONENT|m/s|1|-4096|13|m/s|1|4
+011005|w|double|W-COMPONENT|Pa/s|1|-512|10|Pa/s|1|4
+011006|w|double|W-COMPONENT|m/s|2|-4096|13|m/s|2|4
+011007|relativeWindDirectionInDegreesOffBow|long|RELATIVE WIND DIRECTION (IN DEGREES OFF BOW)|deg|0|0|9|deg|0|3
+011008|relativeWindSpeed|double|RELATIVE WIND SPEED|m/s|1|0|12|m/s|1|4
+011010|windDirectionAssociatedWithWindSpeedWhichFollows|long|WIND DIRECTION ASSOCIATED WITH WIND SPEED WHICH FOLLOWS|deg|0|0|9|deg|0|3
+011011|windDirectionAt10M|long|WIND DIRECTION AT 10 M|deg|0|0|9|deg|0|3
+011012|windSpeedAt10M|double|WIND SPEED AT 10 M|m/s|1|0|12|m/s|1|4
+011013|windDirectionAt5M|long|WIND DIRECTION AT 5 M|deg|0|0|9|deg|0|3
+011014|windSpeedAt5M|double|WIND SPEED AT 5 M|m/s|1|0|12|m/s|1|4
+011016|extremeCounterclockwiseWindDirectionOfAVariableWind|long|EXTREME COUNTERCLOCKWISE WIND DIRECTION OF A VARIABLE WIND|deg|0|0|9|deg|0|3
+011017|extremeClockwiseWindDirectionOfAVariableWind|long|EXTREME CLOCKWISE WIND DIRECTION OF A VARIABLE WIND|deg|0|0|9|deg|0|3
+011019|steadinessOfWind|long|STEADINESS OF WIND|%|0|0|7|%|0|3
+011021|relativeVorticity|double|RELATIVE VORTICITY|/s|9|-65536|17|/s|9|6
+011022|divergence|double|DIVERGENCE|/s|9|-65536|17|/s|9|6
+011023|velocityPotential|long|VELOCITY POTENTIAL|m2/s|-2|-65536|17|m2/s|-2|6
+011030|extendedDegreeOfTurbulence|table|EXTENDED DEGREE OF TURBULENCE|CODE TABLE|0|0|6|CODE TABLE|0|2
+011031|degreeOfTurbulence|table|DEGREE OF TURBULENCE|CODE TABLE|0|0|4|CODE TABLE|0|2
+011032|heightOfBaseOfTurbulence|long|HEIGHT OF BASE OF TURBULENCE|m|-1|-40|16|m|-1|5
+011033|heightOfTopOfTurbulence|long|HEIGHT OF TOP OF TURBULENCE|m|-1|-40|16|m|-1|5
+011034|verticalGustVelocity|double|VERTICAL GUST VELOCITY|m/s|1|-1024|11|m/s|1|4
+011035|verticalGustAcceleration|double|VERTICAL GUST ACCELERATION|m s-2|2|-8192|14|m s-2|2|5
+011036|maximumDerivedEquivalentVerticalGustSpeed|double|MAXIMUM DERIVED EQUIVALENT VERTICAL GUST SPEED|m/s|1|0|10|m/s|1|4
+011037|turbulenceIndex|table|TURBULENCE INDEX|CODE TABLE|0|0|6|CODE TABLE|0|2
+011038|timeOfOccurrenceOfPeakEddyDissipationRate|table|TIME OF OCCURRENCE OF PEAK EDDY DISSIPATION RATE|CODE TABLE|0|0|5|CODE TABLE|0|2
+011039|extendedTimeOfOccurrenceOfPeakEddyDissipationRate|table|EXTENDED TIME OF OCCURRENCE OF PEAK EDDY DISSIPATION RATE|CODE TABLE|0|0|6|CODE TABLE|0|2
+011040|maximumWindSpeedMeanWind|double|MAXIMUM WIND SPEED (MEAN WIND)|m/s|1|0|12|m/s|1|4
+011041|maximumWindGustSpeed|double|MAXIMUM WIND GUST SPEED|m/s|1|0|12|m/s|1|4
+011042|maximumWindSpeed10MinuteMeanWind|double|MAXIMUM WIND SPEED (10-MINUTE MEAN WIND)|m/s|1|0|12|m/s|1|4
+011043|maximumWindGustDirection|long|MAXIMUM WIND GUST DIRECTION|deg|0|0|9|deg|0|3
+011044|meanWindDirectionForSurfaceTo1500M|long|MEAN WIND DIRECTION FOR SURFACE - 1 500 M (5 000 FEET)|deg|0|0|9|deg|0|3
+011045|meanWindSpeedForSurfaceTo1500M|double|MEAN WIND SPEED FOR SURFACE - 1 500 M (5 000 FEET)|m/s|1|0|12|m/s|1|4
+011046|maximumInstantaneousWindSpeed|double|MAXIMUM INSTANTANEOUS WIND SPEED|m/s|1|0|12|m/s|1|4
+011047|maximumInstantaneousWindSpeedOver10Minutes|double|MAXIMUM INSTANTANEOUS WIND SPEED OVER 10 MINUTES|m/s|1|0|12|m/s|1|4
+011049|windDirectionStandardDeviation|long|STANDARD DEVIATION OF WIND DIRECTION|deg|0|0|9|deg|0|3
+011050|standardDeviationOfHorizontalWindSpeed|double|STANDARD DEVIATION OF HORIZONTAL WIND SPEED|m/s|1|0|12|m/s|1|4
+011051|standardDeviationOfVerticalWindSpeed|double|STANDARD DEVIATION OF VERTICAL WIND SPEED|m/s|1|0|8|m/s|1|3
+011052|formalUncertaintyInWindSpeed|double|FORMAL UNCERTAINTY IN WIND SPEED|m/s|2|0|13|m/s|2|5
+011053|formalUncertaintyInWindDirection|double|FORMAL UNCERTAINTY IN WIND DIRECTION|deg|2|0|15|deg|2|5
+011054|meanWindDirectionFor1500To3000M|long|MEAN WIND DIRECTION FOR 1 500 - 3 000 M|deg|0|0|9|deg|0|3
+011055|meanWindSpeedFor1500To3000M|double|MEAN WIND SPEED FOR 1 500 - 3 000 M|m/s|1|0|12|m/s|1|4
+011061|absoluteWindShearIn1KmLayerBelow|double|ABSOLUTE WIND SHEAR IN 1 KM LAYER BELOW|m/s|1|0|12|m/s|1|4
+011062|absoluteWindShearIn1KmLayerAbove|double|ABSOLUTE WIND SHEAR IN 1 KM LAYER ABOVE|m/s|1|0|12|m/s|1|4
+011070|designatorOfRunwayAffectedByWindShearIncludingAll|string|DESIGNATOR OF THE RUNWAY AFFECTED BY WIND SHEAR (INCLUDING ALL)|CCITT IA5|0|0|32|Character|0|4
+011071|turbulentVerticalMomentumFlux|double|TURBULENT VERTICAL MOMENTUM FLUX|m2 s-2|3|-128|14|m2 s-2|3|5
+011072|turbulentVerticalBuoyancyFlux|double|TURBULENT VERTICAL BUOYANCY FLUX|K m s-1|3|-128|11|K m s-1|3|4
+011073|turbulentKineticEnergy|double|TURBULENT KINETIC ENERGY|m2 s-2|2|-1024|13|m2 s-2|2|4
+011074|dissipationEnergy|double|DISSIPATION ENERGY|m2 s-2|2|-1024|10|m2 s-2|2|4
+011075|meanTurbulenceIntensityEddyDissipationRate|double|MEAN TURBULENCE INTENSITY (EDDY DISSIPATION RATE)|m2/3 s-1|2|0|8|m2/3 s-1|2|3
+011076|peakTurbulenceIntensityEddyDissipationRate|double|PEAK TURBULENCE INTENSITY (EDDY DISSIPATION RATE)|m2/3 s-1|2|0|8|m2/3 s-1|2|3
+011077|reportingIntervalOrAveragingTimeForEddyDissipationRate|long|REPORTING INTERVAL OR AVERAGING TIME FOR EDDY DISSIPATION RATE|s|0|0|12|s|0|4
+011081|modelWindDirectionAt10M|double|MODEL WIND DIRECTION AT 10 M|deg|2|0|16|deg|2|5
+011082|modelWindSpeedAt10M|double|MODEL WIND SPEED AT 10 M|m/s|2|0|14|m/s|2|4
+011083|windSpeed|long|WIND SPEED|km/h|0|0|9|km/h|0|3
+011084|windSpeed|long|WIND SPEED|kt|0|0|8|kt|0|3
+011085|maximumWindGustSpeed|long|MAXIMUM WIND GUST SPEED|km/h|0|0|9|km/h|0|3
+011086|maximumWindGustSpeed|long|MAXIMUM WIND GUST SPEED|kt|0|0|8|kt|0|3
+011095|u|double|U-COMPONENT OF THE MODEL WIND VECTOR|m/s|1|-4096|13|m/s|1|4
+011096|v|double|V-COMPONENT OF THE MODEL WIND VECTOR|m/s|1|-4096|13|m/s|1|4
+011097|windSpeedFromAltimeter|double|WIND SPEED FROM ALTIMETER|m/s|2|0|12|m/s|2|4
+011098|windSpeedFromRadiometer|double|WIND SPEED FROM RADIOMETER|m/s|2|0|12|m/s|2|4
+011100|aircraftTrueAirspeed|double|AIRCRAFT TRUE AIRSPEED|m/s|1|0|12|m/s|1|4
+011101|aircraftGroundSpeedUComponent|double|AIRCRAFT GROUND SPEED U-COMPONENT|m/s|1|-4096|13|m/s|1|4
+011102|aircraftGroundSpeedVComponent|double|AIRCRAFT GROUND SPEED V-COMPONENT|m/s|1|-4096|13|m/s|1|4
+011103|aircraftGroundSpeedWComponent|double|AIRCRAFT GROUND SPEED W-COMPONENT|m/s|1|-512|10|m/s|1|3
+011104|aircraftTrueHeading|long|TRUE HEADING OF AIRCRAFT, SHIP OR OTHER MOBILE PLATFORM|deg|0|0|9|deg|0|3
+011105|edrAlgorithmVersion|long|EDR ALGORITHM VERSION|Numeric|0|0|6|Numeric|0|2
+011106|runningMinimumConfidence|long|RUNNING MINIMUM CONFIDENCE|Numeric|1|0|4|Numeric|1|2
+011107|maximumNumberBadInputs|long|MAXIMUM NUMBER BAD INPUTS|Numeric|0|0|5|Numeric|0|2
+011108|peakLocation|long|PEAK LOCATION|Numeric|1|0|4|Numeric|1|2
+011109|numberOfGoodEdr|long|NUMBER OF GOOD EDR|Numeric|0|0|4|Numeric|0|2
+012001|airTemperature|double|TEMPERATURE/AIR TEMPERATURE|K|1|0|12|C|1|3
+012002|wetBulbTemperature|double|WET-BULB TEMPERATURE|K|1|0|12|C|1|3
+012003|dewpointTemperature|double|DEWPOINT TEMPERATURE|K|1|0|12|C|1|3
+012004|airTemperatureAt2M|double|AIR TEMPERATURE AT 2 M|K|1|0|12|C|1|3
+012005|wetBulbTemperatureAt2M|double|WET-BULB TEMPERATURE AT 2 M|K|1|0|12|C|1|3
+012006|dewpointTemperatureAt2M|double|DEWPOINT TEMPERATURE AT 2 M|K|1|0|12|C|1|3
+012007|virtualTemperature|double|VIRTUAL TEMPERATURE|K|1|0|12|C|1|3
+012011|maximumTemperatureAtHeightAndOverPeriodSpecified|double|MAXIMUM TEMPERATURE, AT HEIGHT AND OVER PERIOD SPECIFIED|K|1|0|12|C|1|3
+012012|minimumTemperatureAtHeightAndOverPeriodSpecified|double|MINIMUM TEMPERATURE, AT HEIGHT AND OVER PERIOD SPECIFIED|K|1|0|12|C|1|3
+012013|groundMinimumTemperaturePast12Hours|double|GROUND MINIMUM TEMPERATURE, PAST 12 HOURS|K|1|0|12|C|1|3
+012014|maximumTemperatureAt2MPast12Hours|double|MAXIMUM TEMPERATURE AT 2 M, PAST 12 HOURS|K|1|0|12|C|1|3
+012015|minimumTemperatureAt2MPast12Hours|double|MINIMUM TEMPERATURE AT 2 M, PAST 12 HOURS|K|1|0|12|C|1|3
+012016|maximumTemperatureAt2MPast24Hours|double|MAXIMUM TEMPERATURE AT 2 M, PAST 24 HOURS|K|1|0|12|C|1|3
+012017|minimumTemperatureAt2MPast24Hours|double|MINIMUM TEMPERATURE AT 2 M, PAST 24 HOURS|K|1|0|12|C|1|3
+012021|maximumTemperatureAt2M|double|MAXIMUM TEMPERATURE AT 2 M|K|2|0|16|C|2|4
+012022|minimumTemperatureAt2M|double|MINIMUM TEMPERATURE AT 2 M|K|2|0|16|C|2|4
+012023|temperature|long|TEMPERATURE|C|0|-99|8|C|0|2
+012024|dewpointTemperature|long|DEWPOINT TEMPERATURE|C|0|-99|8|C|0|2
+012030|soilTemperature|double|SOIL TEMPERATURE|K|1|0|12|C|1|3
+012049|temperatureChangeOverSpecifiedPeriod|long|TEMPERATURE CHANGE OVER SPECIFIED PERIOD|K|0|-30|6|C|0|2
+012051|standardDeviationTemperature|double|STANDARD DEVIATION TEMPERATURE|K|1|0|10|C|1|3
+012052|highestDailyMeanTemperature|double|HIGHEST DAILY MEAN TEMPERATURE|K|1|0|12|C|1|3
+012053|lowestDailyMeanTemperature|double|LOWEST DAILY MEAN TEMPERATURE|K|1|0|12|C|1|3
+012060|awsEnclosureInternalTemperature|double|AWS ENCLOSURE INTERNAL TEMPERATURE|K|1|0|12|C|1|3
+012061|skinTemperature|double|SKIN TEMPERATURE|K|1|0|12|C|1|3
+012062|equivalentBlackBodyTemperature|double|EQUIVALENT BLACK BODY TEMPERATURE|K|1|0|12|C|1|3
+012063|brightnessTemperature|double|BRIGHTNESS TEMPERATURE|K|1|0|12|C|1|3
+012064|instrumentTemperature|double|INSTRUMENT TEMPERATURE|K|1|0|12|K|1|4
+012065|standardDeviationBrightnessTemperature|double|STANDARD DEVIATION BRIGHTNESS TEMPERATURE|K|1|0|12|K|1|4
+012066|antennaTemperature|double|ANTENNA TEMPERATURE|K|2|0|16|C|2|5
+012070|warmLoadTemperature|double|WARM LOAD TEMPERATURE|K|2|0|16|K|2|5
+012071|coldestClusterTemperature|double|COLDEST CLUSTER TEMPERATURE|K|1|0|12|K|1|4
+012072|radiance|double|RADIANCE|W m-2 sr-1|6|0|31|W m-2 sr-1|6|9
+012075|spectralRadiance|long|SPECTRAL RADIANCE|W m-3 sr-1|-3|0|16|W m-3 sr-1|-3|5
+012076|radiance|double|RADIANCE|W m-2 sr-1|3|0|16|W m-2 sr-1|3|5
+012080|brightnessTemperatureRealPart|double|BRIGHTNESS TEMPERATURE REAL PART|K|2|-10000|16|K|2|5
+012081|brightnessTemperatureImaginaryPart|double|BRIGHTNESS TEMPERATURE IMAGINARY PART|K|2|-10000|16|K|2|5
+012082|pixelRadiometricAccuracy|double|PIXEL RADIOMETRIC ACCURACY|K|2|0|12|K|2|4
+012101|airTemperature|double|TEMPERATURE/AIR TEMPERATURE|K|2|0|16|C|2|4
+012102|wetBulbTemperature|double|WET-BULB TEMPERATURE|K|2|0|16|C|2|4
+012103|dewpointTemperature|double|DEWPOINT TEMPERATURE|K|2|0|16|C|2|4
+012104|airTemperatureAt2M|double|AIR TEMPERATURE AT 2 M|K|2|0|16|C|2|4
+012105|webBulbTemperatureAt2M|double|WEB-BULB TEMPERATURE AT 2 M|K|2|0|16|C|2|4
+012106|dewpointTemperatureAt2M|double|DEWPOINT TEMPERATURE AT 2 M|K|2|0|16|C|2|4
+012107|virtualTemperature|double|VIRTUAL TEMPERATURE|K|2|0|16|C|2|4
+012111|maximumTemperatureAtHeightAndOverPeriodSpecified|double|MAXIMUM TEMPERATURE, AT HEIGHT AND OVER PERIOD SPECIFIED|K|2|0|16|C|2|4
+012112|minimumTemperatureAtHeightAndOverPeriodSpecified|double|MINIMUM TEMPERATURE, AT HEIGHT AND OVER PERIOD SPECIFIED|K|2|0|16|C|2|4
+012113|groundMinimumTemperaturePast12Hours|double|GROUND MINIMUM TEMPERATURE, PAST 12 HOURS|K|2|0|16|C|2|4
+012114|maximumTemperatureAt2MPast12Hours|double|MAXIMUM TEMPERATURE AT 2 M, PAST 12 HOURS|K|2|0|16|C|2|4
+012115|minimumTemperatureAt2MPast12Hours|double|MINIMUM TEMPERATURE AT 2 M, PAST 12 HOURS|K|2|0|16|C|2|4
+012116|maximumTemperatureAt2MPast24Hours|double|MAXIMUM TEMPERATURE AT 2 M, PAST 24 HOURS|K|2|0|16|C|2|4
+012117|minimumTemperatureAt2MPast24Hours|double|MINIMUM TEMPERATURE AT 2 M, PAST 24 HOURS|K|2|0|16|C|2|4
+012118|maximumTemperatureAtHeightSpecifiedPast24Hours|double|MAXIMUM TEMPERATURE AT HEIGHT SPECIFIED, PAST 24 HOURS|K|2|0|16|C|2|4
+012119|minimumTemperatureAtHeightSpecifiedPast24Hours|double|MINIMUM TEMPERATURE AT HEIGHT SPECIFIED, PAST 24 HOURS|K|2|0|16|C|2|4
+012120|groundTemperature|double|GROUND TEMPERATURE|K|2|0|16|C|2|4
+012121|groundMinimumTemperature|double|GROUND MINIMUM TEMPERATURE|K|2|0|16|C|2|4
+012122|groundMinimumTemperatureOfPrecedingNight|double|GROUND MINIMUM TEMPERATURE OF THE PRECEDING NIGHT|K|2|0|16|C|2|4
+012128|roadSurfaceTemperature|double|ROAD SURFACE TEMPERATURE|K|2|0|16|C|2|5
+012129|roadSubSurfaceTemperature|double|ROAD SUB-SURFACE TEMPERATURE|K|2|0|16|C|2|5
+012130|soilTemperature|double|SOIL TEMPERATURE|K|2|0|16|C|2|4
+012131|snowTemperature|double|SNOW TEMPERATURE|K|2|0|16|C|2|4
+012132|iceSurfaceTemperature|double|ICE SURFACE TEMPERATURE|K|2|0|16|C|2|4
+012151|dailyMeanTemperatureStandardDeviation|double|STANDARD DEVIATION OF DAILY MEAN TEMPERATURE|K|2|0|12|C|2|4
+012152|highestDailyMeanTemperature|double|HIGHEST DAILY MEAN TEMPERATURE|K|2|0|16|C|2|4
+012153|lowestDailyMeanTemperature|double|LOWEST DAILY MEAN TEMPERATURE|K|2|0|16|C|2|4
+012158|noiseEquivalentDeltaTemperatureWhileViewingColdTarget|double|NOISE-EQUIVALENT DELTA TEMPERATURE WHILE VIEWING COLD TARGET|K|2|0|12|C|2|4
+012159|noiseEquivalentDeltaTemperatureWhileViewingWarmTarget|double|NOISE-EQUIVALENT DELTA TEMPERATURE WHILE VIEWING WARM TARGET|K|2|0|12|C|2|4
+012161|skinTemperature|double|SKIN TEMPERATURE|K|2|0|16|C|2|4
+012162|equivalentBlackBodyTemperature|double|EQUIVALENT BLACK BODY TEMPERATURE|K|2|0|16|C|2|4
+012163|brightnessTemperature|double|BRIGHTNESS TEMPERATURE|K|2|0|16|C|2|4
+012164|instrumentTemperature|double|INSTRUMENT TEMPERATURE|K|2|0|16|K|2|5
+012165|directSunBrightnessTemperature|long|DIRECT SUN BRIGHTNESS TEMPERATURE|K|0|0|23|K|0|7
+012166|snapshotAccuracy|double|SNAPSHOT ACCURACY|K|1|-4000|13|K|1|4
+012167|radiometricAccuracyPurePolarization|double|RADIOMETRIC ACCURACY (PURE POLARIZATION)|K|1|0|9|K|1|3
+012168|radiometricAccuracyCrossPolarization|double|RADIOMETRIC ACCURACY (CROSS POLARIZATION)|K|1|0|9|K|1|3
+012171|coldestClusterTemperature|double|COLDEST CLUSTER TEMPERATURE|K|2|0|16|K|2|5
+012180|averaged12MicronBtForAllClearPixelsAtNadir|double|AVERAGED 12 MICRON BT FOR ALL CLEAR PIXELS AT NADIR|K|2|0|16|K|2|5
+012181|averaged11MicronBtForAllClearPixelsAtNadir|double|AVERAGED 11 MICRON BT FOR ALL CLEAR PIXELS AT NADIR|K|2|0|16|K|2|5
+012182|averaged37MicronBtForAllClearPixelsAtNadir|double|AVERAGED 3.7 MICRON BT FOR ALL CLEAR PIXELS AT NADIR|K|2|0|16|K|2|5
+012183|averaged12MicronBtForAllClearPixelsForwardView|double|AVERAGED 12 MICRON BT FOR ALL CLEAR PIXELS, FORWARD VIEW|K|2|0|16|K|2|5
+012184|averaged11MicronBtForAllClearPixelsForwardView|double|AVERAGED 11 MICRON BT FOR ALL CLEAR PIXELS, FORWARD VIEW|K|2|0|16|K|2|5
+012185|averaged37MicronBtForAllClearPixelsForwardView|double|AVERAGED 3.7 MICRON BT FOR ALL CLEAR PIXELS, FORWARD VIEW|K|2|0|16|K|2|5
+012186|meanNadirSeaSurfaceTemperature|double|MEAN NADIR SEA-SURFACE TEMPERATURE|K|2|0|16|K|2|5
+012187|meanDualViewSeaSurfaceTemperature|double|MEAN DUAL VIEW SEA-SURFACE TEMPERATURE|K|2|0|16|K|2|5
+012188|interpolated238GhzBrightnessTFromMwr|double|INTERPOLATED 23.8 GHZ BRIGHTNESS T FROM MWR|K|2|0|16|K|2|5
+012189|interpolated365GhzBrightnessTFromMwr|double|INTERPOLATED 36.5 GHZ BRIGHTNESS T FROM MWR|K|2|0|16|K|2|5
+013001|specificHumidity|double|SPECIFIC HUMIDITY|kg/kg|5|0|14|kg/kg|5|5
+013002|mixingRatio|double|MIXING RATIO|kg/kg|5|0|14|kg/kg|5|5
+013003|relativeHumidity|long|RELATIVE HUMIDITY|%|0|0|7|%|0|3
+013004|vapourPressure|long|VAPOUR PRESSURE|Pa|-1|0|10|Pa|-1|4
+013005|vapourDensity|double|VAPOUR DENSITY|kg m-3|3|0|7|kg m-3|3|3
+013006|mixingHeights|long|MIXING HEIGHTS|m|-1|-40|16|m|-1|5
+013007|minimumRelativeHumidity|long|MINIMUM RELATIVE HUMIDITY|%|0|0|7|%|0|3
+013008|maximumRelativeHumidity|long|MAXIMUM RELATIVE HUMIDITY|%|0|0|7|%|0|3
+013009|relativeHumidity|double|RELATIVE HUMIDITY|%|1|-1000|12|%|1|4
+013011|totalPrecipitationOrTotalWaterEquivalent|double|TOTAL PRECIPITATION/TOTAL WATER EQUIVALENT|kg m-2|1|-1|14|kg m-2|1|5
+013012|depthOfFreshSnow|double|DEPTH OF FRESH SNOW|m|2|-2|12|m|2|4
+013013|totalSnowDepth|double|TOTAL SNOW DEPTH|m|2|-2|16|m|2|5
+013014|rainfallOrWaterEquivalentOfSnowAveragedRate|double|RAINFALL/WATER EQUIVALENT OF SNOW (AVERAGED RATE)|kg m-2 s-1|4|0|12|kg m-2 s-1|4|4
+013015|snowfallAveragedRate|double|SNOWFALL (AVERAGED RATE)|m/s|7|0|12|m/s|7|4
+013016|precipitableWater|long|PRECIPITABLE WATER|kg m-2|0|0|7|kg m-2|0|3
+013019|totalPrecipitationPast1Hour|double|TOTAL PRECIPITATION PAST 1 HOUR|kg m-2|1|-1|14|kg m-2|1|4
+013020|totalPrecipitationPast3Hours|double|TOTAL PRECIPITATION PAST 3 HOURS|kg m-2|1|-1|14|kg m-2|1|5
+013021|totalPrecipitationPast6Hours|double|TOTAL PRECIPITATION PAST 6 HOURS|kg m-2|1|-1|14|kg m-2|1|5
+013022|totalPrecipitationPast12Hours|double|TOTAL PRECIPITATION PAST 12 HOURS|kg m-2|1|-1|14|kg m-2|1|5
+013023|totalPrecipitationPast24Hours|double|TOTAL PRECIPITATION PAST 24 HOURS|kg m-2|1|-1|14|kg m-2|1|5
+013031|evapotranspiration|long|EVAPOTRANSPIRATION|kg m-2|0|0|7|kg m-2|0|3
+013032|evaporation|double|EVAPORATION/EVAPOTRANSPIRATION|kg m-2|1|0|8|kg m-2|1|3
+013033|evaporation|double|EVAPORATION/EVAPOTRANSPIRATION|kg m-2|1|0|10|kg m-2|1|4
+013038|superadiabaticIndicator|table|SUPERADIABATIC INDICATOR|CODE TABLE|0|0|2|CODE TABLE|0|1
+013039|terrainTypeIceOrSnow|table|TERRAIN TYPE (ICE/SNOW)|CODE TABLE|0|0|3|CODE TABLE|0|1
+013040|surfaceFlag|table|SURFACE FLAG|CODE TABLE|0|0|4|CODE TABLE|0|2
+013041|pasquillGiffordStabilityCategory|table|PASQUILL-GIFFORD STABILITY CATEGORY|CODE TABLE|0|0|4|CODE TABLE|0|2
+013042|parcelLiftedIndexTo500Hpa|long|PARCEL LIFTED INDEX (TO 500 HPA)|K|0|-20|6|K|0|2
+013043|bestLiftedIndexTo500Hpa|long|BEST LIFTED INDEX (TO 500 HPA)|K|0|-20|6|K|0|2
+013044|kIndex|long|K INDEX|K|0|-30|8|K|0|3
+013045|koIndex|long|KO INDEX|K|0|-30|8|K|0|3
+013046|maximumBuoyancy|long|MAXIMUM BUOYANCY|K|0|-30|8|K|0|3
+013047|modifiedShowalterStabilityIndex|long|MODIFIED SHOWALTER STABILITY INDEX|K|0|-60|6|C|0|2
+013048|waterFraction|double|WATER FRACTION|%|1|0|10|%|1|4
+013051|frequencyGroupPrecipitation|table|FREQUENCY GROUP, PRECIPITATION|CODE TABLE|0|0|4|CODE TABLE|0|2
+013052|highestDailyAmountOfPrecipitation|double|HIGHEST DAILY AMOUNT OF PRECIPITATION|kg m-2|1|-1|14|kg m-2|1|5
+013055|intensityOfPrecipitation|double|INTENSITY OF PRECIPITATION|kg m-2 s-1|4|0|8|mm/h|1|4
+013056|characterAndIntensityOfPrecipitation|table|CHARACTER AND INTENSITY OF PRECIPITATION|CODE TABLE|0|0|4|CODE TABLE|0|2
+013057|timeOfBeginningOrEndOfPrecipitation|table|TIME OF BEGINNING OR END OF PRECIPITATION|CODE TABLE|0|0|4|CODE TABLE|0|2
+013058|sizeOfPrecipitatingElement|double|SIZE OF PRECIPITATING ELEMENT|m|4|0|7|mm|1|3
+013059|numberOfFlashesThunderstorm|long|NUMBER OF FLASHES (THUNDERSTORM)|Numeric|0|0|7|Numeric|0|3
+013060|totalAccumulatedPrecipitation|double|TOTAL ACCUMULATED PRECIPITATION|kg m-2|1|-1|17|kg m-2|1|5
+013071|upstreamWaterLevel|double|UPSTREAM WATER LEVEL|m|2|0|14|m|2|4
+013072|downstreamWaterLevel|double|DOWNSTREAM WATER LEVEL|m|2|0|14|m|2|4
+013073|maximumWaterLevel|double|MAXIMUM WATER LEVEL|m|2|0|14|m|2|4
+013074|groundWaterLevel|double|GROUND WATER LEVEL|m|2|0|18|m|2|6
+013080|waterPh|double|WATER PH|pH unit|1|0|10|pH unit|1|3
+013081|waterConductivity|double|WATER CONDUCTIVITY|S/m|3|0|14|S/m|3|4
+013082|waterTemperature|double|WATER TEMPERATURE|K|1|0|12|K|1|4
+013083|dissolvedOxygen|double|DISSOLVED OXYGEN|kg m-3|6|0|15|kg m-3|6|5
+013084|turbidity|long|TURBIDITY|lm|0|0|14|lm|0|4
+013085|oxidationReductionPotential|double|OXIDATION REDUCTION POTENTIAL (ORP)|V|3|0|14|V|3|4
+013090|radiometerWaterVapourContent|double|RADIOMETER WATER VAPOUR CONTENT|kg m-2|1|0|10|kg m-2|1|4
+013091|radiometerLiquidContent|double|RADIOMETER LIQUID CONTENT|kg m-2|2|0|8|kg m-2|2|3
+013093|cloudOpticalThickness|long|CLOUD OPTICAL THICKNESS|Numeric|0|0|8|Numeric|0|3
+013095|totalColumnWaterVapour|double|TOTAL COLUMN WATER VAPOUR|kg m-2|4|0|19|kg m-2|4|6
+013096|mwrWaterVapourContent|double|MWR WATER VAPOUR CONTENT|kg m-2|2|0|14|kg m-2|2|5
+013097|mwrLiquidWaterContent|double|MWR LIQUID WATER CONTENT|kg m-2|2|0|14|kg m-2|2|5
+013098|integratedWaterVapourDensity|double|INTEGRATED WATER VAPOUR DENSITY|kg m-2|8|0|30|kg m-2|8|10
+013099|log10OfIntegratedCloudParticleDensity|double|LOG10 OF INTEGRATED CLOUD PARTICLE DENSITY|log (m-2)|1|0|7|log (m-2)|1|3
+013100|log10OfIntegratedCloudParticleArea|double|LOG10 OF INTEGRATED CLOUD PARTICLE AREA|log (m2 m-2)|1|-70|7|log (m2 m-2)|1|2
+013101|log10OfIntegratedCloudParticleVolume|double|LOG10 OF INTEGRATED CLOUD PARTICLE VOLUME|log (m3 m-2)|1|-140|7|log (m3 m-2)|1|3
+013110|massMixingRatio|long|MASS MIXING RATIO|%|0|0|7|%|0|3
+013111|soilMoisture|long|SOIL MOISTURE|g/kg|0|0|10|g/kg|0|4
+013112|objectWetnessDuration|long|OBJECT WETNESS DURATION|s|0|0|17|s|0|5
+013114|rateOfIceAccretion|double|RATE OF ICE ACCRETION|kg m-2 h-1|1|0|11|kg m-2 h-1|1|4
+013115|iceThickness|double|ICE THICKNESS|m|2|0|19|m|2|6
+013116|waterFilmThickness|double|WATER FILM THICKNESS|m|4|0|10|m|3|2
+013117|snowDensityLiquidWaterContent|long|SNOW DENSITY (LIQUID WATER CONTENT)|kg m-3|0|0|10|kg m-3|0|3
+013118|freshSnowDepth|double|DEPTH OF FRESH SNOW (HIGH ACCURACY)|m|3|-2|14|m|3|5
+013155|precipitationIntensityHighAccuracy|double|INTENSITY OF PRECIPITATION (HIGH ACCURACY)|kg m-2 s-1|5|-1|16|mm/h|2|5
+013160|radiometerLiquidContent|double|RADIOMETER LIQUID CONTENT|kg m-2|2|-350|10|kg m-2|2|3
+014001|longWaveRadiationIntegratedOver24Hours|long|LONG-WAVE RADIATION, INTEGRATED OVER 24 HOURS|J m-2|-3|-65536|17|J m-2|-3|5
+014002|longWaveRadiationIntegratedOverPeriodSpecified|long|LONG-WAVE RADIATION, INTEGRATED OVER PERIOD SPECIFIED|J m-2|-3|-65536|17|J m-2|-3|5
+014003|shortWaveRadiationIntegratedOver24Hours|long|SHORT-WAVE RADIATION, INTEGRATED OVER 24 HOURS|J m-2|-3|-65536|17|J m-2|-3|5
+014004|shortWaveRadiationIntegratedOverPeriodSpecified|long|SHORT-WAVE RADIATION, INTEGRATED OVER PERIOD SPECIFIED|J m-2|-3|-65536|17|J m-2|-3|5
+014011|netLongWaveRadiationIntegratedOver24Hours|long|NET LONG-WAVE RADIATION, INTEGRATED OVER 24 HOURS|J m-2|-3|-65536|17|J m-2|-3|5
+014012|netLongWaveRadiationIntegratedOverPeriodSpecified|long|NET LONG-WAVE RADIATION, INTEGRATED OVER PERIOD SPECIFIED|J m-2|-3|-65536|17|J m-2|-3|5
+014013|netShortWaveRadiation24Hours|long|NET SHORT-WAVE RADIATION, INTEGRATED OVER 24 HOURS|J m-2|-3|-65536|17|J m-2|-3|5
+014014|netShortWaveRadiationIntegratedOverPeriodSpecified|long|NET SHORT-WAVE RADIATION, INTEGRATED OVER PERIOD SPECIFIED|J m-2|-3|-65536|17|J m-2|-3|5
+014015|netRadiationIntegratedOver24Hours|long|NET RADIATION, INTEGRATED OVER 24 HOURS|J m-2|-4|-16384|15|J m-2|-4|5
+014016|netRadiationIntegratedOverPeriodSpecified|long|NET RADIATION, INTEGRATED OVER PERIOD SPECIFIED|J m-2|-4|-16384|15|J m-2|-4|5
+014017|instantaneousLongWaveRadiation|long|INSTANTANEOUS LONG-WAVE RADIATION|W m-2|0|-512|10|W m-2|0|4
+014018|instantaneousShortWaveRadiation|long|INSTANTANEOUS SHORT-WAVE RADIATION|W m-2|0|-2048|12|W m-2|0|4
+014019|surfaceAlbedo|long|SURFACE ALBEDO|%|0|0|7|%|0|3
+014020|globalSolarRadiation24Hours|long|GLOBAL SOLAR RADIATION, INTEGRATED OVER 24 HOURS|J m-2|-4|0|15|J m-2|-4|5
+014021|globalSolarRadiationIntegratedOverPeriodSpecified|long|GLOBAL SOLAR RADIATION, INTEGRATED OVER PERIOD SPECIFIED|J m-2|-4|0|15|J m-2|-4|5
+014022|diffuseSolarRadiationIntegratedOver24Hours|long|DIFFUSE SOLAR RADIATION, INTEGRATED OVER 24 HOURS|J m-2|-4|0|15|J m-2|-4|5
+014023|diffuseSolarRadiationIntegratedOverPeriodSpecified|long|DIFFUSE SOLAR RADIATION, INTEGRATED OVER PERIOD SPECIFIED|J m-2|-4|0|15|J m-2|-4|5
+014024|directSolarRadiationIntegratedOver24Hours|long|DIRECT SOLAR RADIATION, INTEGRATED OVER 24 HOURS|J m-2|-4|0|15|J m-2|-4|5
+014025|directSolarRadiationIntegratedOverPeriodSpecified|long|DIRECT SOLAR RADIATION, INTEGRATED OVER PERIOD SPECIFIED|J m-2|-4|0|15|J m-2|-4|5
+014026|cloudTopAlbedo|long|ALBEDO AT THE TOP OF CLOUDS|%|0|0|7|%|0|3
+014027|albedo|long|ALBEDO|%|0|0|7|%|0|3
+014028|globalSolarRadiationIntegratedOverPeriodSpecified|long|GLOBAL SOLAR RADIATION (HIGH ACCURACY), INTEGRATED OVER PERIOD SPECIFIED|J m-2|-2|0|20|J m-2|-2|6
+014029|diffuseSolarRadiationIntegratedOverPeriodSpecified|long|DIFFUSE SOLAR RADIATION (HIGH ACCURACY), INTEGRATED OVER PERIOD SPECIFIED|J m-2|-2|0|20|J m-2|-2|6
+014030|directSolarRadiationIntegratedOverPeriodSpecified|long|DIRECT SOLAR RADIATION (HIGH ACCURACY), INTEGRATED OVER PERIOD SPECIFIED|J m-2|-2|0|20|J m-2|-2|6
+014031|totalSunshine|long|TOTAL SUNSHINE|min|0|0|11|min|0|4
+014032|totalSunshine|long|TOTAL SUNSHINE|h|0|0|10|h|0|4
+014033|totalSunshine|long|TOTAL SUNSHINE|%|0|0|9|%|0|3
+014034|sunshineOverPeriodSpecified|long|SUNSHINE OVER PERIOD SPECIFIED|min|0|0|11|min|0|4
+014035|solarRadiationFlux|double|SOLAR RADIATION FLUX|W m-2|1|0|14|W m-2|1|5
+014042|bidirectionalReflectance|long|BIDIRECTIONAL REFLECTANCE|%|0|0|7|%|0|3
+014043|channelRadiance|double|CHANNEL RADIANCE|W m-2 sr-1 um-1|4|0|23|W m-2 sr-1 um-1|4|7
+014044|channelRadiance|double|CHANNEL RADIANCE|W m-2 sr-1 cm|7|-100000|22|W m-2 sr-1 cm|7|7
+014045|channelRadiance|long|CHANNEL RADIANCE|W m-2 sr-1 cm|0|0|11|W m-2 sr-1 cm|0|4
+014046|scaledIasiRadiance|long|SCALED IASI RADIANCE|W m-2 sr-1 m|0|-5000|16|W m-2 sr-1 m|0|5
+014047|scaledMeanAvhrrRadiance|long|SCALED MEAN AVHRR RADIANCE|W m-2 sr-1 m|0|0|31|W m-2 sr-1 m|0|10
+014048|scaledStandardDeviationAvhrrRadiance|long|SCALED STANDARD DEVIATION AVHRR RADIANCE|W m-2 sr-1 m|0|0|31|W m-2 sr-1 m|0|10
+014050|emissivity|double|EMISSIVITY|%|1|0|10|%|1|4
+014051|directSolarRadiationIntegratedOverLastHour|long|DIRECT SOLAR RADIATION INTEGRATED OVER LAST HOUR|J m-2|-3|0|14|J m-2|-3|4
+014052|globalUpwardSolarRadiationIntegratedOverPeriodSpecified|long|GLOBAL UPWARD SOLAR RADIATION, INTEGRATED OVER PERIOD SPECIFIED|J m-2|-2|-1048574|20|J m-2|-2|7
+014053|netRadiationIntegratedOverPeriodSpecified|long|NET RADIATION (HIGH ACCURACY), INTEGRATED OVER PERIOD SPECIFIED|J m-2|-2|-1048574|21|J m-2|-2|7
+014054|photosyntheticallyActiveRadiationIntegratedOverPeriodSpecified|long|PHOTOSYNTHETICALLY ACTIVE RADIATION, INTEGRATED OVER PERIOD SPECIFIED|J m-2|-3|0|16|J m-2|-3|5
+014055|solarActivityIndex|long|SOLAR ACTIVITY INDEX|Numeric|0|-32768|16|Numeric|0|5
+014056|backgroundLuminance|long|BACKGROUND LUMINANCE|cd m-2|0|0|18|cd m-2|0|6
+014057|soilHeatFlux|long|SOIL HEAT FLUX|J m-2|-2|-1048574|21|J m-2|-2|7
+014072|globalUvIrradiation|long|GLOBAL UV IRRADIATION|J m-2|0|-4000000|23|J m-2|0|7
+015001|totalOzone|long|TOTAL OZONE|DU|0|0|10|DU|0|4
+015002|airMassSlantPathAt22Km|long|AIR MASS (SLANT PATH AT 22 KM)|Numeric|2|0|10|Numeric|2|3
+015003|measuredOzonePartialPressureSounding|double|MEASURED OZONE PARTIAL PRESSURE (SOUNDING)|Pa|4|0|9|nbar|0|3
+015004|ozoneSoundingCorrectionFactor|long|OZONE SOUNDING CORRECTION FACTOR (CF)|Numeric|3|0|11|Numeric|3|4
+015005|ozoneP|long|OZONE P|DU|0|0|10|DU|0|3
+015008|significandOfVolumetricMixingRatio|long|SIGNIFICAND OF VOLUMETRIC MIXING RATIO|Numeric|0|0|10|Numeric|0|4
+015011|log10IntegratedElectronDensity|double|LOG10 OF INTEGRATED ELECTRON DENSITY|log (m-2)|3|14000|13|log (m-2)|3|4
+015012|totalElectronCountPerSquareMetre|long|TOTAL ELECTRON COUNT PER SQUARE METRE|m-2|-16|0|6|m-2|-16|2
+015015|maxImageSpectralComponentBeforeNormalization|long|MAXIMUM IMAGE SPECTRAL COMPONENT BEFORE NORMALIZATION|Numeric|0|0|31|Numeric|0|10
+015020|integratedOzoneDensity|double|INTEGRATED OZONE DENSITY|kg m-2|8|0|21|kg m-2|8|7
+015021|integratedMassDensity|double|INTEGRATED MASS DENSITY|kg m-2|11|0|31|kg m-2|11|10
+015024|opticalDepth|long|OPTICAL DEPTH|Numeric|4|0|24|Numeric|4|8
+015025|pollutantType|table|TYPE OF POLLUTANT|CODE TABLE|0|0|4|CODE TABLE|0|2
+015026|moleFractionOfPollutant|double|CONCENTRATION OF POLLUTANT (MOL MOL-1)|mol/mol|9|0|9|mol/mol|9|3
+015027|massConcentrationOfPollutant|double|CONCENTRATION OF POLLUTANT (KG M-3)|kg m-3|9|0|10|kg m-3|9|4
+015028|moleFractionOfAtmosphericConstituentOrPollutantInDryAir|double|MOLE FRACTION OF ATMOSPHERIC CONSTITUENT/POLLUTANT IN DRY AIR|0/00|5|0|16|0/00|5|5
+015029|extinctionCoefficient|double|EXTINCTION COEFFICIENT|/m|9|0|30|/m|9|10
+015030|aerosolContaminationIndex|long|AEROSOL CONTAMINATION INDEX|Numeric|2|-1000|12|Numeric|2|4
+015031|atmosphericPathDelayInSatelliteSignal|double|ATMOSPHERIC PATH DELAY IN SATELLITE SIGNAL|m|4|10000|15|m|4|5
+015032|estimatedErrorInAtmosphericPathDelay|double|ESTIMATED ERROR IN ATMOSPHERIC PATH DELAY|m|4|0|10|m|4|4
+015033|differenceInPathDelaysForLimbViewsAtExtremesOfScan|double|DIFFERENCE IN PATH DELAYS FOR LIMB VIEWS AT EXTREMES OF SCAN|m|5|-10000|15|m|5|5
+015034|estimatedErrorInPathDelayDifference|double|ESTIMATED ERROR IN PATH DELAY DIFFERENCE|m|5|0|14|m|5|5
+015035|componentOfZenithPathDelayDueToWaterVapour|double|COMPONENT OF ZENITH PATH DELAY DUE TO WATER VAPOUR|m|4|0|14|m|4|5
+015036|atmosphericRefractivity|double|ATMOSPHERIC REFRACTIVITY|N units|3|0|19|N units|3|6
+015037|bendingAngle|double|BENDING ANGLE|rad|8|-100000|23|rad|8|7
+015041|sulphurDioxideIndex|long|SULPHUR DIOXIDE INDEX|Numeric|2|-1200|14|Numeric|2|4
+015042|reflectance|double|REFLECTANCE|%|2|0|14|%|2|5
+015045|sulphurDioxide|double|SULPHUR DIOXIDE|DU|2|-2000|15|DU|2|5
+015046|volcanoContaminationIndex|long|VOLCANO CONTAMINATION INDEX|Numeric|2|-1000|11|Numeric|2|4
+015049|aerosolAngstromWavelengthExponent|long|AEROSOL ANGSTROM WAVELENGTH EXPONENT|Numeric|3|-2000|14|Numeric|3|5
+015051|meteorologicalOpticalRange|long|METEOROLOGICAL OPTICAL RANGE|m|0|0|18|m|0|6
+015052|log10OfNumberDensityOfAerosolParticlesWithDiameterGreaterThan5Nm|double|LOG10 OF NUMBER DENSITY OF AEROSOL PARTICLES WITH DIAMETER GREATER THAN 5 NM|log (m-3)|1|60|6|log (m-3)|1|3
+015053|log10OfNumberDensityOfAerosolParticlesWithDiameterGreaterThan14Nm|double|LOG10 OF NUMBER DENSITY OF AEROSOL PARTICLES WITH DIAMETER GREATER THAN 14 NM|log (m-3)|2|600|9|log (m-3)|2|4
+015054|log10OfNumberDensityOfAerosolParticlesWithDiameterBetween0p25And2p5|double|LOG10 OF NUMBER DENSITY OF AEROSOL PARTICLES WITH DIAMETER BETWEEN 0.25 AND 2.5 µM|log (m-3)|2|550|9|log (m-3)|2|4
+015055|nonVolatileAerosolRatio|long|NON VOLATILE AEROSOL RATIO|Numeric|2|0|7|Numeric|2|3
+015062|aerosolOpticalThickness|long|AEROSOL OPTICAL THICKNESS|Numeric|3|-1000|14|Numeric|3|5
+019001|synopticFeatureType|table|TYPE OF SYNOPTIC FEATURE|CODE TABLE|0|0|6|CODE TABLE|0|2
+019002|effectiveRadiusOfFeature|long|EFFECTIVE RADIUS OF FEATURE|m|-2|0|12|m|-2|4
+019003|windSpeedThreshold|long|WIND SPEED THRESHOLD|m/s|0|0|8|m/s|0|3
+019004|effectiveRadiusWithRespectToWindSpeedsAboveThreshold|long|EFFECTIVE RADIUS WITH RESPECT TO WIND SPEEDS ABOVE THRESHOLD|m|-2|0|12|m|-2|4
+019005|featureDirectionOfMotion|long|DIRECTION OF MOTION OF FEATURE|deg|0|0|9|deg|0|3
+019006|speedOfMotionOfFeature|double|SPEED OF MOTION OF FEATURE|m/s|2|0|14|m/s|2|5
+019007|effectiveRadiusOfFeature|long|EFFECTIVE RADIUS OF FEATURE|m|-3|0|12|m|-3|4
+019008|verticalExtentOfCirculation|table|VERTICAL EXTENT OF CIRCULATION|CODE TABLE|0|0|3|CODE TABLE|0|1
+019009|effectiveRadiusWithRespectToWindSpeedsAboveThresholdLargeStorms|long|EFFECTIVE RADIUS WITH RESPECT TO WIND SPEEDS ABOVE THRESHOLD (LARGE STORMS)|m|-3|0|12|m|-3|4
+019010|methodForTrackingCentreOfSynopticFeature|table|METHOD FOR TRACKING THE CENTRE OF SYNOPTIC FEATURE|CODE TABLE|0|0|4|CODE TABLE|0|2
+019100|timeIntervalToCalculateMovementOfTropicalCyclone|table|TIME INTERVAL TO CALCULATE THE MOVEMENT OF THE TROPICAL CYCLONE|CODE TABLE|0|0|4|CODE TABLE|0|2
+019101|accuracyOfPositionOfCentreOfTropicalCyclone|table|ACCURACY OF THE POSITION OF THE CENTRE OF THE TROPICAL CYCLONE|CODE TABLE|0|0|4|CODE TABLE|0|2
+019102|shapeAndDefinitionOfEyeOfTropicalCyclone|table|SHAPE AND DEFINITION OF THE EYE OF THE TROPICAL CYCLONE|CODE TABLE|0|0|3|CODE TABLE|0|1
+019103|diameterOfMajorAxisOfEyeOfTropicalCyclone|table|DIAMETER OF MAJOR AXIS OF THE EYE OF THE TROPICAL CYCLONE|CODE TABLE|0|0|4|CODE TABLE|0|2
+019104|changeInCharacterOfEyeDuring30Minutes|table|CHANGE IN CHARACTER OF THE EYE DURING THE 30 MINUTES|CODE TABLE|0|0|4|CODE TABLE|0|2
+019105|distanceBetweenEndOfSpiralBandAndCentre|table|DISTANCE BETWEEN THE END OF SPIRAL BAND AND THE CENTRE|CODE TABLE|0|0|4|CODE TABLE|0|2
+019106|identificationNumberOfTropicalCyclone|long|IDENTIFICATION NUMBER OF TROPICAL CYCLONE|Numeric|0|0|7|Numeric|0|3
+019107|timeIntervalOverWhichMovementOfTropicalCycloneHasBeenCalculated|table|TIME INTERVAL OVER WHICH THE MOVEMENT OF THE TROPICAL CYCLONE HAS BEEN CALCULATED|CODE TABLE|0|0|4|CODE TABLE|0|2
+019108|accuracyOfGeographicalPositionOfTropicalCyclone|table|ACCURACY OF GEOGRAPHICAL POSITION OF THE TROPICAL CYCLONE|CODE TABLE|0|0|3|CODE TABLE|0|1
+019109|meanDiameterOfOvercastCloudOfTropicalCyclone|table|MEAN DIAMETER OF THE OVERCAST CLOUD OF THE TROPICAL CYCLONE|CODE TABLE|0|0|4|CODE TABLE|0|2
+019110|apparent24HourChangeInIntensityOfTropicalCyclone|table|APPARENT 24-HOUR CHANGE IN INTENSITY OF THE TROPICAL CYCLONE|CODE TABLE|0|0|4|CODE TABLE|0|2
+019111|currentIntensityNumberOfTropicalCyclone|long|CURRENT INTENSITY (CI) NUMBER OF THE TROPICAL CYCLONE|Numeric|1|0|7|Numeric|1|3
+019112|dataTropicalNumberOfTropicalCyclone|long|DATA TROPICAL (DT) NUMBER OF THE TROPICAL CYCLONE|Numeric|1|0|7|Numeric|1|3
+019113|cloudPatternTypeOfDtNumber|table|CLOUD PATTERN TYPE OF THE DT-NUMBER|CODE TABLE|0|0|4|CODE TABLE|0|2
+019114|modelExpectedTropicalNumberOfTropicalCyclone|long|MODEL EXPECTED TROPICAL (MET) NUMBER OF THE TROPICAL CYCLONE|Numeric|1|0|7|Numeric|1|3
+019115|trendOfPast24HourChangeDevelopedWeakened|long|TREND OF THE PAST 24-HOUR CHANGE (+: DEVELOPED, -: WEAKENED)|Numeric|1|-30|6|Numeric|1|2
+019116|patternTropicalNumberOfTropicalCyclone|long|PATTERN TROPICAL (PT) NUMBER OF THE TROPICAL CYCLONE|Numeric|1|0|7|Numeric|1|3
+019117|cloudPictureTypeOfPtNumber|table|CLOUD PICTURE TYPE OF THE PT-NUMBER|CODE TABLE|0|0|3|CODE TABLE|0|1
+019118|finalTropicalNumberOfTropicalCyclone|long|FINAL TROPICAL (T) NUMBER OF THE TROPICAL CYCLONE|Numeric|1|0|7|Numeric|1|3
+019119|finalTNumberType|table|TYPE OF THE FINAL T-NUMBER|CODE TABLE|0|0|3|CODE TABLE|0|1
+019150|typhoonInternationalCommonNumberTyphoonCommittee|string|TYPHOON INTERNATIONAL COMMON NUMBER (TYPHOON COMMITTEE)|CCITT IA5|0|0|32|Character|0|4
+020001|horizontalVisibility|long|HORIZONTAL VISIBILITY|m|-1|0|13|m|-1|4
+020002|verticalVisibility|long|VERTICAL VISIBILITY|m|-1|0|7|m|-1|3
+020003|presentWeather|table|PRESENT WEATHER|CODE TABLE|0|0|9|CODE TABLE|0|3
+020004|pastWeather1|table|PAST WEATHER (1)|CODE TABLE|0|0|5|CODE TABLE|0|2
+020005|pastWeather2|table|PAST WEATHER (2)|CODE TABLE|0|0|5|CODE TABLE|0|2
+020006|flightRules|table|FLIGHT RULES|CODE TABLE|0|0|3|CODE TABLE|0|1
+020008|cloudDistributionForAviation|table|CLOUD DISTRIBUTION FOR AVIATION|CODE TABLE|0|0|5|CODE TABLE|0|2
+020009|generalWeatherIndicatorTafOrMetar|table|GENERAL WEATHER INDICATOR (TAF/METAR)|CODE TABLE|0|0|4|CODE TABLE|0|2
+020010|cloudCoverTotal|long|CLOUD COVER (TOTAL)|%|0|0|7|%|0|3
+020011|cloudAmount|table|CLOUD AMOUNT|CODE TABLE|0|0|4|CODE TABLE|0|2
+020012|cloudType|table|CLOUD TYPE|CODE TABLE|0|0|6|CODE TABLE|0|2
+020013|heightOfBaseOfCloud|long|HEIGHT OF BASE OF CLOUD|m|-1|-40|11|m|-1|4
+020014|heightOfTopOfCloud|long|HEIGHT OF TOP OF CLOUD|m|-1|-40|11|m|-1|4
+020015|pressureAtBaseOfCloud|long|PRESSURE AT BASE OF CLOUD|Pa|-1|0|14|Pa|-1|5
+020016|pressureAtTopOfCloud|long|PRESSURE AT TOP OF CLOUD|Pa|-1|0|14|Pa|-1|5
+020017|cloudTopDescription|table|CLOUD TOP DESCRIPTION|CODE TABLE|0|0|4|CODE TABLE|0|2
+020018|tendencyOfRunwayVisualRange|table|TENDENCY OF RUNWAY VISUAL RANGE|CODE TABLE|0|0|2|CODE TABLE|0|1
+020019|significantWeather|string|SIGNIFICANT PRESENT OR FORECAST WEATHER|CCITT IA5|0|0|72|Character|0|9
+020020|significantRecentWeatherPhenomena|string|SIGNIFICANT RECENT WEATHER PHENOMENA|CCITT IA5|0|0|32|Character|0|4
+020021|precipitationType|flag|TYPE OF PRECIPITATION|FLAG TABLE|0|0|30|FLAG TABLE|0|10
+020022|characterOfPrecipitation|table|CHARACTER OF PRECIPITATION|CODE TABLE|0|0|4|CODE TABLE|0|2
+020023|otherWeatherPhenomena|flag|OTHER WEATHER PHENOMENA|FLAG TABLE|0|0|18|FLAG TABLE|0|6
+020024|intensityOfPhenomena|table|INTENSITY OF PHENOMENA|CODE TABLE|0|0|3|CODE TABLE|0|1
+020025|obscuration|flag|OBSCURATION|FLAG TABLE|0|0|21|FLAG TABLE|0|7
+020026|characterOfObscuration|table|CHARACTER OF OBSCURATION|CODE TABLE|0|0|4|CODE TABLE|0|2
+020027|phenomenaOccurrence|flag|PHENOMENA OCCURRENCE|FLAG TABLE|0|0|9|FLAG TABLE|0|3
+020028|expectedChangeInIntensity|table|EXPECTED CHANGE IN INTENSITY|CODE TABLE|0|0|3|CODE TABLE|0|1
+020029|rainFlag|table|RAIN FLAG|CODE TABLE|0|0|2|CODE TABLE|0|1
+020031|iceDepositThickness|double|ICE DEPOSIT (THICKNESS)|m|2|0|7|m|2|3
+020032|rateOfIceAccretionEstimated|table|RATE OF ICE ACCRETION (ESTIMATED)|CODE TABLE|0|0|3|CODE TABLE|0|1
+020033|causeOfIceAccretion|flag|CAUSE OF ICE ACCRETION|FLAG TABLE|0|0|4|FLAG TABLE|0|2
+020034|seaIceConcentration|table|SEA ICE CONCENTRATION|CODE TABLE|0|0|5|CODE TABLE|0|2
+020035|amountAndTypeOfIce|table|AMOUNT AND TYPE OF ICE|CODE TABLE|0|0|4|CODE TABLE|0|2
+020036|iceSituation|table|ICE SITUATION|CODE TABLE|0|0|5|CODE TABLE|0|2
+020037|iceDevelopment|table|ICE DEVELOPMENT|CODE TABLE|0|0|5|CODE TABLE|0|2
+020038|iceEdgeBearing|long|BEARING OF ICE EDGE|deg|0|0|12|deg|0|3
+020039|iceDistance|long|ICE DISTANCE|m|-1|0|13|m|-1|4
+020040|evolutionOfDriftSnow|table|EVOLUTION OF DRIFT SNOW|CODE TABLE|0|0|4|CODE TABLE|0|2
+020041|airframeIcing|table|AIRFRAME ICING|CODE TABLE|0|0|4|CODE TABLE|0|2
+020042|airframeIcingPresent|table|AIRFRAME ICING PRESENT|CODE TABLE|0|0|2|CODE TABLE|0|1
+020043|peakLiquidWaterContent|double|PEAK LIQUID WATER CONTENT|kg m-3|4|0|7|kg m-3|4|2
+020044|averageLiquidWaterContent|double|AVERAGE LIQUID WATER CONTENT|kg m-3|4|0|7|kg m-3|4|2
+020045|supercooledLargeDropletConditions|table|SUPERCOOLED LARGE DROPLET (SLD) CONDITIONS|CODE TABLE|0|0|2|CODE TABLE|0|1
+020048|evolutionOfFeature|table|EVOLUTION OF FEATURE|CODE TABLE|0|0|4|CODE TABLE|0|2
+020050|cloudIndex|table|CLOUD INDEX|CODE TABLE|0|0|8|CODE TABLE|0|3
+020051|amountOfLowClouds|long|AMOUNT OF LOW CLOUDS|%|0|0|7|%|0|3
+020052|amountOfMiddleClouds|long|AMOUNT OF MIDDLE CLOUDS|%|0|0|7|%|0|3
+020053|amountOfHighClouds|long|AMOUNT OF HIGH CLOUDS|%|0|0|7|%|0|3
+020054|trueDirectionFromWhichAPhenomenonOrCloudsAreMovingOrInWhichTheyAreObserved|long|TRUE DIRECTION FROM WHICH A PHENOMENON OR CLOUDS ARE MOVING OR IN WHICH THEY ARE OBSERVED|deg|0|0|9|deg|0|3
+020055|stateOfSkyInTropics|table|STATE OF SKY IN THE TROPICS|CODE TABLE|0|0|4|CODE TABLE|0|2
+020056|cloudPhase|table|CLOUD PHASE|CODE TABLE|0|0|3|CODE TABLE|0|1
+020058|visibilitySeawardsFromACoastalStation|long|VISIBILITY SEAWARDS FROM A COASTAL STATION|m|-1|0|13|m|-1|4
+020059|minimumHorizontalVisibility|long|MINIMUM HORIZONTAL VISIBILITY|m|-1|0|9|m|-1|3
+020060|prevailingHorizontalVisibility|long|PREVAILING HORIZONTAL VISIBILITY|m|-1|0|10|m|-1|4
+020061|runwayVisualRangeRvr|long|RUNWAY VISUAL RANGE (RVR)|m|0|0|12|m|0|4
+020062|stateOfGround|table|STATE OF THE GROUND (WITH OR WITHOUT SNOW)|CODE TABLE|0|0|5|CODE TABLE|0|2
+020063|specialPhenomena|table|SPECIAL PHENOMENA|CODE TABLE|0|0|10|CODE TABLE|0|4
+020065|snowCover|long|SNOW COVER|%|0|0|7|%|0|3
+020066|maximumDiameterOfHailstones|double|MAXIMUM DIAMETER OF HAILSTONES|m|3|0|8|m|3|3
+020067|diameterOfDeposit|double|DIAMETER OF DEPOSIT|m|3|0|9|m|3|3
+020070|minimumNumberOfAtmospherics|long|MINIMUM NUMBER OF ATMOSPHERICS|Numeric|0|0|7|Numeric|0|3
+020071|accuracyOfFixAndRateOfAtmospherics|table|ACCURACY OF FIX AND RATE OF ATMOSPHERICS|CODE TABLE|0|0|4|CODE TABLE|0|2
+020081|cloudAmountInSegment|long|CLOUD AMOUNT IN SEGMENT|%|0|0|7|%|0|3
+020082|amountSegmentCloudFree|long|AMOUNT SEGMENT CLOUD FREE|%|0|0|7|%|0|3
+020083|amountOfSegmentCoveredByScene|long|AMOUNT OF SEGMENT COVERED BY SCENE|%|0|0|7|%|0|3
+020085|generalConditionOfRunway|table|GENERAL CONDITION OF RUNWAY|CODE TABLE|0|0|4|CODE TABLE|0|1
+020086|runwayDeposits|table|RUNWAY DEPOSITS|CODE TABLE|0|0|4|CODE TABLE|0|1
+020087|runwayContamination|table|RUNWAY CONTAMINATION|CODE TABLE|0|0|4|CODE TABLE|0|1
+020088|depthOfRunwayDeposits|double|DEPTH OF RUNWAY DEPOSITS|m|3|0|12|m|0|4
+020089|runwayFrictionCoefficient|table|RUNWAY FRICTION COEFFICIENT|CODE TABLE|0|0|7|CODE TABLE|0|2
+020090|specialClouds|table|SPECIAL CLOUDS|CODE TABLE|0|0|4|CODE TABLE|0|2
+020091|verticalVisibility|long|VERTICAL VISIBILITY|ft|-2|0|10|ft|-2|3
+020092|heightOfBaseOfCloud|long|HEIGHT OF BASE OF CLOUD|ft|-2|0|10|ft|-2|3
+020093|heightOfInversion|long|HEIGHT OF INVERSION|m|-1|0|8|m|-1|3
+020095|iceProbability|long|ICE PROBABILITY|Numeric|3|0|10|Numeric|3|4
+020096|iceAgeAParameter|double|ICE AGE (A PARAMETER)|dB|2|-4096|13|dB|2|4
+020101|locustAcridianName|table|LOCUST (ACRIDIAN) NAME|CODE TABLE|0|0|4|CODE TABLE|0|2
+020102|locustMaturityColour|table|LOCUST (MATURITY) COLOUR|CODE TABLE|0|0|4|CODE TABLE|0|2
+020103|stageOfDevelopmentOfLocusts|table|STAGE OF DEVELOPMENT OF LOCUSTS|CODE TABLE|0|0|4|CODE TABLE|0|2
+020104|organizationStateOfSwarm|table|ORGANIZATION STATE OF SWARM OR BAND OF LOCUSTS|CODE TABLE|0|0|4|CODE TABLE|0|2
+020105|sizeOfSwarmOrBandOfLocustsAndDurationOfPassageOfSwarm|table|SIZE OF SWARM OR BAND OF LOCUSTS AND DURATION OF PASSAGE OF SWARM|CODE TABLE|0|0|4|CODE TABLE|0|2
+020106|locustPopulationDensity|table|LOCUST POPULATION DENSITY|CODE TABLE|0|0|4|CODE TABLE|0|2
+020107|directionOfMovementsOfLocustSwarm|table|DIRECTION OF MOVEMENTS OF LOCUST SWARM|CODE TABLE|0|0|4|CODE TABLE|0|2
+020108|extentOfVegetation|table|EXTENT OF VEGETATION|CODE TABLE|0|0|4|CODE TABLE|0|2
+020111|xAxisErrorEllipseMajorComponent|long|X-AXIS ERROR ELLIPSE MAJOR COMPONENT|m|-1|0|17|m|-1|6
+020112|yAxisErrorEllipseMinorComponent|long|Y-AXIS ERROR ELLIPSE MINOR COMPONENT|m|-1|0|17|m|-1|6
+020113|zAxisErrorEllipseComponent|long|Z-AXIS ERROR ELLIPSE COMPONENT|m|-1|0|17|m|-1|6
+020114|angleOfXAxisInErrorEllipse|double|ANGLE OF X-AXIS IN ERROR ELLIPSE|deg|2|-18000|16|deg|2|5
+020115|angleOfZAxisInErrorEllipse|double|ANGLE OF Z-AXIS IN ERROR ELLIPSE|deg|2|-18000|16|deg|2|5
+020116|emissionHeightOfCloudStroke|long|EMISSION HEIGHT OF CLOUD STROKE|m|0|0|16|m|0|5
+020117|amplitudeOfLightningStrike|long|AMPLITUDE OF LIGHTNING STRIKE|A|-1|-32000|16|A|-1|5
+020118|lightningDetectionError|long|LIGHTNING DETECTION ERROR|m|0|0|19|m|0|6
+020119|lightningDischargePolarity|table|LIGHTNING DISCHARGE POLARITY|CODE TABLE|0|0|2|CODE TABLE|0|1
+020121|thresholdValueForPolarityDecision|double|THRESHOLD VALUE FOR POLARITY DECISION|V|3|0|16|V|3|5
+020122|thresholdValueForPolarityDecision|long|THRESHOLD VALUE FOR POLARITY DECISION|A|0|0|16|A|0|5
+020123|minimumDirectionThreshold|double|MINIMUM THRESHOLD FOR DETECTION|V/m|3|0|16|V/m|3|5
+020124|lightningStrokeOrFlash|table|LIGHTNING STROKE OR FLASH|CODE TABLE|0|0|2|CODE TABLE|0|1
+020126|lightningRateOfDischarge|long|LIGHTNING RATE OF DISCHARGE|/h|0|0|23|/h|0|7
+020127|lightningDistanceFromStation|long|LIGHTNING - DISTANCE FROM STATION|m|-3|0|8|m|-3|3
+020128|lightningDirectionFromStation|double|LIGHTNING - DIRECTION FROM STATION|deg|1|0|12|deg|1|4
+020129|lightningDensityStrokeFlashOrEvent|double|LIGHTNING DENSITY (STROKE, FLASH OR EVENT)|m-2|6|0|10|m-2|6|4
+020130|cloudHydrometeorConcentration|long|CLOUD HYDROMETEOR CONCENTRATION|Numeric|0|0|10|Numeric|0|3
+020131|effectiveRadiusOfCloudHydrometeors|double|EFFECTIVE RADIUS OF CLOUD HYDROMETEORS|m|5|0|6|m|5|2
+020132|cloudLiquidWaterContent|double|CLOUD LIQUID WATER CONTENT|kg m-3|5|0|11|kg m-3|5|4
+020133|hydrometeorRadius|double|HYDROMETEOR RADIUS|m|5|0|6|m|5|2
+020135|iceMassOnARod|double|ICE MASS (ON A ROD)|kg/m|1|0|10|kg/m|1|3
+020136|supplementaryCloudType|table|SUPPLEMENTARY CLOUD TYPE|CODE TABLE|0|0|9|CODE TABLE|0|3
+020137|evolutionOfClouds|table|EVOLUTION OF CLOUDS|CODE TABLE|0|0|4|CODE TABLE|0|2
+020138|roadSurfaceCondition|table|ROAD SURFACE CONDITION|CODE TABLE|0|0|4|CODE TABLE|0|2
+021001|horizontalReflectivity|long|HORIZONTAL REFLECTIVITY|dB|0|-64|7|dB|0|3
+021002|verticalReflectivity|long|VERTICAL REFLECTIVITY|dB|0|-64|7|dB|0|3
+021003|differentialReflectivity|double|DIFFERENTIAL REFLECTIVITY|dB|1|-5|7|dB|1|3
+021004|differentialReflectivity|double|DIFFERENTIAL REFLECTIVITY|dB|2|-800|11|dB|2|4
+021005|linearDepolarizationRatio|long|LINEAR DEPOLARIZATION RATIO|dB|0|-65|6|dB|0|2
+021006|circularDepolarizationRatio|long|CIRCULAR DEPOLARIZATION RATIO|dB|0|-65|6|dB|0|2
+021011|dopplerMeanVelocityXDirection|long|DOPPLER MEAN VELOCITY IN X-DIRECTION|m/s|0|-128|8|m/s|0|3
+021012|dopplerMeanVelocityYDirection|long|DOPPLER MEAN VELOCITY IN Y-DIRECTION|m/s|0|-128|8|m/s|0|3
+021013|dopplerMeanVelocityZDirection|long|DOPPLER MEAN VELOCITY IN Z-DIRECTION|m/s|0|-128|8|m/s|0|3
+021014|dopplerMeanVelocityRadial|double|DOPPLER MEAN VELOCITY (RADIAL)|m/s|1|-4096|13|m/s|1|4
+021017|dopplerVelocitySpectralWidth|double|DOPPLER VELOCITY SPECTRAL WIDTH|m/s|1|0|8|m/s|1|3
+021018|extendedNyquistVelocity|double|EXTENDED NYQUIST VELOCITY|m/s|1|0|10|m/s|1|4
+021019|highNyquistVelocity|double|HIGH NYQUIST VELOCITY|m/s|1|0|10|m/s|1|3
+021021|echoTops|long|ECHO TOPS|m|-3|0|4|m|-3|2
+021022|rangeBinOffset|double|RANGE BIN OFFSET|m|1|0|14|m|1|5
+021023|rangeBinSize|long|RANGE BIN SIZE|m|0|0|14|m|0|5
+021024|azimuthOffset|double|AZIMUTH OFFSET|deg|1|0|12|deg|1|4
+021025|azimuthalResolution|double|AZIMUTHAL RESOLUTION|deg|1|0|8|deg|1|3
+021028|differentialPhase|double|DIFFERENTIAL PHASE|deg|1|0|12|deg|1|4
+021029|crossPolarizationCorrelationCoefficient|long|CROSS-POLARIZATION CORRELATION COEFFICIENT|Numeric|2|-100|8|Numeric|2|3
+021030|signalToNoiseRatio|long|SIGNAL TO NOISE RATIO|dB|0|-32|8|dB|0|3
+021031|verticallyIntegratedLiquidWaterContent|long|VERTICALLY INTEGRATED LIQUID-WATER CONTENT|kg m-2|0|0|7|kg m-2|0|3
+021036|radarRainfallIntensity|double|RADAR RAINFALL INTENSITY|m/s|7|0|12|m/s|7|4
+021041|brightBandHeight|long|BRIGHT-BAND HEIGHT|m|-2|0|8|m|-2|3
+021051|signalPowerAbove1Mw|long|SIGNAL POWER ABOVE 1 MW|dB|0|-256|8|dB|0|3
+021062|backscatter|double|BACKSCATTER|dB|2|-5000|13|dB|2|4
+021063|radiometricResolutionNoiseValue|double|RADIOMETRIC RESOLUTION (NOISE VALUE)|%|1|0|10|%|1|4
+021064|clutterNoiseEstimate|long|CLUTTER NOISE ESTIMATE|Numeric|0|0|8|Numeric|0|3
+021065|missingPacketCounter|long|MISSING PACKET COUNTER|Numeric|0|-127|8|Numeric|0|3
+021066|waveScatterometerProductConfidenceData|flag|WAVE SCATTEROMETER PRODUCT CONFIDENCE DATA|FLAG TABLE|0|0|12|FLAG TABLE|0|4
+021067|windProductConfidenceData|flag|WIND PRODUCT CONFIDENCE DATA|FLAG TABLE|0|0|13|FLAG TABLE|0|5
+021068|radarAltimeterProductConfidenceData|flag|RADAR ALTIMETER PRODUCT CONFIDENCE DATA|FLAG TABLE|0|0|8|FLAG TABLE|0|3
+021069|sstProductConfidenceData|flag|SST PRODUCT CONFIDENCE DATA|FLAG TABLE|0|0|10|FLAG TABLE|0|4
+021070|sstProductConfidenceDataSadist2|flag|SST PRODUCT CONFIDENCE DATA (SADIST-2)|FLAG TABLE|0|0|23|FLAG TABLE|0|6
+021071|peakiness|long|PEAKINESS|Numeric|0|0|16|Numeric|0|5
+021072|satelliteAltimeterCalibrationStatus|flag|SATELLITE ALTIMETER CALIBRATION STATUS|FLAG TABLE|0|0|4|FLAG TABLE|0|2
+021073|satelliteAltimeterInstrumentMode|flag|SATELLITE ALTIMETER INSTRUMENT MODE|FLAG TABLE|0|0|9|FLAG TABLE|0|3
+021075|imageSpectrumIntensity|long|IMAGE SPECTRUM INTENSITY|Numeric|0|0|8|Numeric|0|3
+021076|representationOfIntensities|table|REPRESENTATION OF INTENSITIES|CODE TABLE|0|0|3|CODE TABLE|0|1
+021077|altitudeCorrectionIonosphere|double|ALTITUDE CORRECTION (IONOSPHERE)|m|3|0|14|m|3|5
+021078|altitudeCorrectionDryTroposphere|double|ALTITUDE CORRECTION (DRY TROPOSPHERE)|m|3|0|9|m|3|3
+021079|altitudeCorrectionWetTroposphere|double|ALTITUDE CORRECTION (WET TROPOSPHERE)|m|3|2000|10|m|3|4
+021080|altitudeCorrectionCalibrationConstant|double|ALTITUDE CORRECTION (CALIBRATION CONSTANT)|m|3|0|11|m|3|4
+021081|openLoopCorrectionHeightTimeLoop|double|OPEN LOOP CORRECTION (HEIGHT-TIME LOOP)|m|3|0|10|m|3|4
+021082|openLoopCorrectionAutoGainControl|double|OPEN LOOP CORRECTION (AUTO GAIN CONTROL)|dB|3|-3000|14|dB|3|5
+021083|warmTargetCalibration|long|WARM TARGET CALIBRATION|Numeric|0|0|16|Numeric|0|5
+021084|coldTargetCalibration|long|COLD TARGET CALIBRATION|Numeric|0|0|16|Numeric|0|5
+021085|atsrSeaSurfaceTemperatureAcrossTrackBandNumber|long|ATSR SEA-SURFACE TEMPERATURE ACROSS-TRACK BAND NUMBER|Numeric|0|0|4|Numeric|0|2
+021086|numberOfPixelsInNadirOnlyAverage|long|NUMBER OF PIXELS IN NADIR ONLY, AVERAGE|Numeric|0|0|9|Numeric|0|3
+021087|numberOfPixelsInDualViewAverage|long|NUMBER OF PIXELS IN DUAL VIEW, AVERAGE|Numeric|0|0|9|Numeric|0|3
+021088|wetBackscatter|double|WET BACKSCATTER|dB|2|-5000|13|dB|2|4
+021091|radarSignalDopplerSpectrum0thMoment|long|RADAR SIGNAL DOPPLER SPECTRUM 0TH MOMENT|dB|0|-100|8|dB|0|3
+021092|rassSignalDopplerSpectrum0thMomentReferringToRassSignal|long|RASS SIGNAL DOPPLER SPECTRUM 0TH MOMENT, REFERRING TO RASS SIGNAL|dB|0|-100|8|dB|0|3
+021093|kuBandPeakiness|long|KU BAND PEAKINESS|Numeric|3|0|16|Numeric|3|5
+021094|sBandPeakiness|long|S BAND PEAKINESS|Numeric|3|0|16|Numeric|3|5
+021101|numberOfVectorAmbiguities|long|NUMBER OF VECTOR AMBIGUITIES|Numeric|0|0|3|Numeric|0|1
+021102|indexOfSelectedWindVector|long|INDEX OF SELECTED WIND VECTOR|Numeric|0|0|3|Numeric|0|1
+021103|totalNumberOfSigma0Measurements|long|TOTAL NUMBER OF SIGMA-0 MEASUREMENTS|Numeric|0|0|5|Numeric|0|2
+021104|likelihoodComputedForSolution|long|LIKELIHOOD COMPUTED FOR SOLUTION|Numeric|3|-30000|15|Numeric|3|5
+021105|normalizedRadarCrossSection|double|NORMALIZED RADAR CROSS-SECTION|dB|2|-10000|14|dB|2|5
+021106|kpVarianceCoefficientAlpha|long|KP VARIANCE COEFFICIENT (ALPHA)|Numeric|3|0|14|Numeric|3|5
+021107|kpVarianceCoefficientBeta|long|KP VARIANCE COEFFICIENT (BETA)|Numeric|8|0|16|Numeric|8|5
+021109|seawindsWindVectorCellQuality|flag|SEAWINDS WIND VECTOR CELL QUALITY|FLAG TABLE|0|0|17|FLAG TABLE|0|6
+021110|numberOfInnerBeamSigma0ForwardOfSatellite|long|NUMBER OF INNER-BEAM SIGMA-0 (FORWARD OF SATELLITE)|Numeric|0|0|6|Numeric|0|2
+021111|numberOfOuterBeamSigma0ForwardOfSatellite|long|NUMBER OF OUTER-BEAM SIGMA-0 (FORWARD OF SATELLITE)|Numeric|0|0|6|Numeric|0|2
+021112|numberOfInnerBeamSigma0AftOfSatellite|long|NUMBER OF INNER-BEAM SIGMA-0 (AFT OF SATELLITE)|Numeric|0|0|6|Numeric|0|2
+021113|numberOfOuterBeamSigma0AftOfSatellite|long|NUMBER OF OUTER-BEAM SIGMA-0 (AFT OF SATELLITE)|Numeric|0|0|6|Numeric|0|2
+021114|kpVarianceCoefficientGamma|double|KP VARIANCE COEFFICIENT (GAMMA)|dB|3|-140000|18|dB|3|6
+021115|seawindsSigma0Quality|flag|SEAWINDS SIGMA-0 QUALITY|FLAG TABLE|0|0|17|FLAG TABLE|0|6
+021116|seawindsSigma0Mode|flag|SEAWINDS SIGMA-0 MODE|FLAG TABLE|0|0|17|FLAG TABLE|0|6
+021117|sigma0VarianceQualityControl|long|SIGMA-0 VARIANCE QUALITY CONTROL|Numeric|2|0|16|Numeric|2|5
+021118|attenuationCorrectionOnSigma0|double|ATTENUATION CORRECTION ON SIGMA-0|dB|2|-10000|14|dB|2|5
+021119|windScatterometerGeophysicalModelFunction|table|WIND SCATTEROMETER GEOPHYSICAL MODEL FUNCTION|CODE TABLE|0|0|6|CODE TABLE|0|2
+021120|probabilityOfRain|long|PROBABILITY OF RAIN|Numeric|3|0|10|Numeric|3|4
+021121|seawindsNofRainIndex|long|SEAWINDS NOF* RAIN INDEX|Numeric|0|0|8|Numeric|0|3
+021122|attenuationCorrectionOnSigma0FromTb|double|ATTENUATION CORRECTION ON SIGMA-0 (FROM TB)|dB|2|-10000|14|dB|2|5
+021123|seawindsNormalizedRadarCrossSection|double|SEAWINDS NORMALIZED RADAR CROSS-SECTION|dB|2|-30000|15|dB|2|5
+021128|numberOfValidPointsPerSecondUsedToDerivePreviousParameters|long|NUMBER OF VALID POINTS PER SECOND USED TO DERIVE PREVIOUS PARAMETERS|Numeric|0|0|8|Numeric|0|3
+021130|spectrumTotalEnergy|long|SPECTRUM TOTAL ENERGY|Numeric|6|0|28|Numeric|6|9
+021131|spectrumMaxEnergy|long|SPECTRUM MAX ENERGY|Numeric|6|0|28|Numeric|6|9
+021132|directionOfSpectrumMaxOnHigherResolutionGrid|double|DIRECTION OF SPECTRUM MAX ON HIGHER RESOLUTION GRID|deg|3|0|19|deg|3|6
+021133|wavelengthOfSpectrumMaxOnHigherResolutionGrid|double|WAVELENGTH OF SPECTRUM MAX ON HIGHER RESOLUTION GRID|m|3|0|29|m|3|9
+021134|rangeResolutionOfCressCovarianceSpectrum|double|RANGE RESOLUTION OF CRESS COVARIANCE SPECTRUM|rad/m|3|0|19|rad/m|3|6
+021135|realPartOfCrossSpectraPolarGridNumberOfBins|long|REAL PART OF CROSS SPECTRA POLAR GRID NUMBER OF BINS|Numeric|3|-524288|20|Numeric|3|7
+021136|imaginaryPartOfCrossSpectraPolarGridNumberOfBins|long|IMAGINARY PART OF CROSS SPECTRA POLAR GRID NUMBER OF BINS|Numeric|3|-524288|20|Numeric|3|7
+021137|kuBandCorrectedOceanBackscatterCoefficient|double|KU BAND CORRECTED OCEAN BACKSCATTER COEFFICIENT|dB|2|-32768|16|dB|2|5
+021138|stdKuBandCorrectedOceanBackscatterCoefficient|double|STD KU BAND CORRECTED OCEAN BACKSCATTER COEFFICIENT|dB|2|-32768|16|dB|2|5
+021139|kuBandNetInstrumentalCorrectionForAgc|double|KU BAND NET INSTRUMENTAL CORRECTION FOR AGC|dB|2|-2048|12|dB|2|4
+021140|sBandCorrectedOceanBackscatterCoefficient|double|S BAND CORRECTED OCEAN BACKSCATTER COEFFICIENT|dB|2|-32768|16|dB|2|5
+021141|stdSBandCorrectedOceanBackscatterCoefficient|double|STD S BAND CORRECTED OCEAN BACKSCATTER COEFFICIENT|dB|2|-32768|16|dB|2|5
+021142|sBandNetInstrumentalCorrectionForAgc|double|S BAND NET INSTRUMENTAL CORRECTION FOR AGC|dB|2|-1024|11|dB|2|4
+021143|kuBandRainAttenuation|double|KU BAND RAIN ATTENUATION|dB|2|-1073741824|31|dB|2|10
+021144|altimeterRainFlag|flag|ALTIMETER RAIN FLAG|FLAG TABLE|0|0|2|FLAG TABLE|0|1
+021145|kuBandAutomaticGainControl|double|KU BAND AUTOMATIC GAIN CONTROL|dB|2|0|13|dB|2|4
+021146|rmsKuBandAutomaticGainControl|double|RMS KU BAND AUTOMATIC GAIN CONTROL|dB|2|0|8|dB|2|3
+021147|numberOfValidPointsForKuBandAutomaticGainControl|long|NUMBER OF VALID POINTS FOR KU BAND AUTOMATIC GAIN CONTROL|Numeric|0|0|5|Numeric|0|2
+021148|trailingEdgeVariationFlag|flag|TRAILING EDGE VARIATION FLAG|FLAG TABLE|0|0|9|FLAG TABLE|0|3
+021150|beamCollocation|table|BEAM CO-LOCATION|CODE TABLE|0|0|2|CODE TABLE|0|1
+021151|estimatedErrorInSigma0At40DegreesIncidenceAngle|double|ESTIMATED ERROR IN SIGMA-0 AT 40 DEGREES INCIDENCE ANGLE|dB|2|0|9|dB|2|3
+021152|slopeAt40DegreesIncidenceAngle|double|SLOPE AT 40 DEGREES INCIDENCE ANGLE|dB/deg|2|-80|7|dB/deg|2|2
+021153|estimatedErrorInSlopeAt40DegreesIncidenceAngle|double|ESTIMATED ERROR IN SLOPE AT 40 DEGREES INCIDENCE ANGLE|dB/deg|2|-40|6|dB/deg|2|2
+021154|soilMoistureSensitivity|double|SOIL MOISTURE SENSITIVITY|dB|2|0|12|dB|2|4
+021155|windVectorCellQuality|flag|WIND VECTOR CELL QUALITY|FLAG TABLE|0|0|24|FLAG TABLE|0|8
+021156|backscatterDistance|long|BACKSCATTER DISTANCE|Numeric|1|-4096|13|Numeric|1|4
+021157|lossPerUnitLengthOfAtmosphere|double|LOSS PER UNIT LENGTH OF ATMOSPHERE USED|dB/m|10|0|22|dB/m|10|7
+021158|ascatKpEstimateQuality|table|ASCAT KP ESTIMATE QUALITY|CODE TABLE|0|0|2|CODE TABLE|0|1
+021159|ascatSigma0Usability|table|ASCAT SIGMA-0 USABILITY|CODE TABLE|0|0|2|CODE TABLE|0|1
+021160|ascatUseOfSyntheticData|long|ASCAT USE OF SYNTHETIC DATA|Numeric|3|0|10|Numeric|3|4
+021161|ascatSyntheticDataQuantity|long|ASCAT SYNTHETIC DATA QUANTITY|Numeric|3|0|10|Numeric|3|4
+021162|ascatSatelliteOrbitAndAttitudeQuality|long|ASCAT SATELLITE ORBIT AND ATTITUDE QUALITY|Numeric|3|0|10|Numeric|3|4
+021163|ascatSolarArrayReflectionContamination|long|ASCAT SOLAR ARRAY REFLECTION CONTAMINATION|Numeric|3|0|10|Numeric|3|4
+021164|ascatTelemetryPresenceAndQuality|long|ASCAT TELEMETRY PRESENCE AND QUALITY|Numeric|3|0|10|Numeric|3|4
+021165|ascatExtrapolatedReferenceFunctionPresence|long|ASCAT EXTRAPOLATED REFERENCE FUNCTION PRESENCE|Numeric|3|0|10|Numeric|3|4
+021166|landFraction|long|LAND FRACTION|Numeric|3|0|10|Numeric|3|4
+021169|icePresenceIndicator|table|ICE PRESENCE INDICATOR|CODE TABLE|0|0|2|CODE TABLE|0|1
+021170|cBandCorrectedOceanBackscatterCoefficient|double|C BAND CORRECTED OCEAN BACKSCATTER COEFFICIENT|dB|2|-32768|16|dB|2|5
+021171|rmsCBandCorrectedOceanBackscatterCoefficient|double|RMS C BAND CORRECTED OCEAN BACKSCATTER COEFFICIENT|dB|2|-32768|16|dB|2|5
+021172|cBandNetInstrumentalCorrectionForAgc|double|C BAND NET INSTRUMENTAL CORRECTION FOR AGC|dB|2|-2048|12|dB|2|4
+021173|cBandAutomaticGainControl|double|C BAND AUTOMATIC GAIN CONTROL|dB|2|0|13|dB|2|4
+021174|rmsCBandAutomaticGainControl|double|RMS C BAND AUTOMATIC GAIN CONTROL|dB|2|0|9|dB|2|3
+021175|numberOfValidPointsForCBandAutomaticGainControl|long|NUMBER OF VALID POINTS FOR C BAND AUTOMATIC GAIN CONTROL|Numeric|0|0|10|Numeric|0|4
+021176|highFrequencyVariabilityCorrection|double|HIGH FREQUENCY VARIABILITY CORRECTION|m|3|0|16|m|3|5
+021177|correctedOcogBackscatterCoefficient|double|CORRECTED OCOG* BACKSCATTER COEFFICIENT|dB|2|0|16|dB|2|5
+021178|stdOf20HzOcogBackscatterCoefficient|double|STD OF 20 HZ OCOG BACKSCATTER COEFFICIENT|dB|2|0|16|dB|2|5
+021179|numberOf20HzValidPointsForOcogBackscatterCoefficient|long|NUMBER OF 20 HZ VALID POINTS FOR OCOG BACKSCATTER COEFFICIENT|Numeric|0|0|16|Numeric|0|5
+021180|numberOf20HzValidPointsForOceanBackscatterCoefficient|long|NUMBER OF 20 HZ VALID POINTS FOR OCEAN BACKSCATTER COEFFICIENT|Numeric|0|0|8|Numeric|0|3
+021181|20HzOceanBackscatterCoefficient|double|20 HZ OCEAN BACKSCATTER COEFFICIENT|dB|2|0|16|dB|2|5
+021182|20HzKuBandPeakiness|long|20 HZ KU BAND PEAKINESS|Numeric|3|0|16|Numeric|3|5
+021183|specificBandCorrectedOceanBackscatterCoefficient|double|SPECIFIC BAND CORRECTED OCEAN BACKSCATTER COEFFICIENT|dB|2|-32768|16|dB|2|5
+021184|stdSpecificBandCorrectedOceanBackscatterCoefficient|double|STD SPECIFIC BAND CORRECTED OCEAN BACKSCATTER COEFFICIENT|dB|2|-32768|16|dB|2|5
+021185|specificBandNetInstrumentalCorrectionForAgc|double|SPECIFIC BAND NET INSTRUMENTAL CORRECTION FOR AGC|dB|2|-2048|12|dB|2|4
+021186|specificBandAutomaticGainControl|double|SPECIFIC BAND AUTOMATIC GAIN CONTROL|dB|2|0|13|dB|2|4
+021187|rmsSpecificBandAutomaticGainControl|double|RMS SPECIFIC BAND AUTOMATIC GAIN CONTROL|dB|2|0|8|dB|2|3
+021188|numberOfValidPointsForSpecificBandAutomaticGainControl|long|NUMBER OF VALID POINTS FOR SPECIFIC BAND AUTOMATIC GAIN CONTROL|Numeric|0|0|7|Numeric|0|3
+022001|wavesDirection|long|DIRECTION OF WAVES|deg|0|0|9|deg|0|3
+022002|windWavesDirection|long|DIRECTION OF WIND WAVES|deg|0|0|9|deg|0|3
+022003|swellWavesDirection|long|DIRECTION OF SWELL WAVES|deg|0|0|9|deg|0|3
+022004|currentDirection|long|DIRECTION OF CURRENT|deg|0|0|9|deg|0|3
+022005|seaSurfaceCurrentDirection|long|DIRECTION OF SEA-SURFACE CURRENT|deg|0|0|9|deg|0|3
+022011|periodOfWaves|long|PERIOD OF WAVES|s|0|0|6|s|0|2
+022012|periodOfWindWaves|long|PERIOD OF WIND WAVES|s|0|0|6|s|0|2
+022013|periodOfSwellWaves|long|PERIOD OF SWELL WAVES|s|0|0|6|s|0|2
+022021|heightOfWaves|double|HEIGHT OF WAVES|m|1|0|10|m|1|4
+022022|heightOfWindWaves|double|HEIGHT OF WIND WAVES|m|1|0|10|m|1|4
+022023|heightOfSwellWaves|double|HEIGHT OF SWELL WAVES|m|1|0|10|m|1|4
+022025|standardDeviationWaveHeight|double|STANDARD DEVIATION WAVE HEIGHT|m|2|0|10|m|2|4
+022026|standardDeviationOfSignificantWaveHeight|double|STANDARD DEVIATION OF SIGNIFICANT WAVE HEIGHT|m|2|0|10|m|2|4
+022031|speedOfCurrent|double|SPEED OF CURRENT|m/s|2|0|13|m/s|2|4
+022032|speedOfSeaSurfaceCurrent|double|SPEED OF SEA-SURFACE CURRENT|m/s|2|0|13|m/s|2|4
+022035|tidalElevationWithRespectToLocalChartDatum|double|TIDAL ELEVATION WITH RESPECT TO LOCAL CHART DATUM|m|2|0|14|m|2|4
+022036|meteorologicalResidualTidalElevationSurgeOrOffset|double|METEOROLOGICAL RESIDUAL TIDAL ELEVATION (SURGE OR OFFSET)|m|2|0|14|m|2|4
+022037|tidalElevationWithRespectToNationalLandDatum|double|TIDAL ELEVATION WITH RESPECT TO NATIONAL LAND DATUM|m|3|-10000|15|m|3|5
+022038|tidalElevationWithRespectToLocalChartDatum|double|TIDAL ELEVATION WITH RESPECT TO LOCAL CHART DATUM|m|3|-10000|15|m|3|5
+022039|meteorologicalResidualTidalElevationSurgeOrOffset|double|METEOROLOGICAL RESIDUAL TIDAL ELEVATION (SURGE OR OFFSET)|m|3|-5000|13|m|3|4
+022040|meteorologicalResidualTidalElevationSurgeOrOffset|double|METEOROLOGICAL RESIDUAL TIDAL ELEVATION (SURGE OR OFFSET)|m|3|-5000|14|m|3|5
+022041|seaSurfaceTemperature15DayRunningMean|double|SEA-SURFACE TEMPERATURE (15-DAY RUNNING MEAN)|K|1|0|12|K|1|4
+022042|oceanographicWaterTemperature|double|SEA/WATER TEMPERATURE|K|1|0|12|K|1|4
+022043|oceanographicWaterTemperature|double|SEA/WATER TEMPERATURE|K|2|0|15|K|2|5
+022044|soundVelocity|double|SOUND VELOCITY|m/s|1|0|14|m/s|1|5
+022045|oceanographicWaterTemperature|double|SEA/WATER TEMPERATURE|K|3|0|19|K|3|6
+022046|seaIceFraction|long|SEA ICE FRACTION|Numeric|2|0|7|Numeric|2|3
+022049|seaSurfaceTemperature|double|SEA-SURFACE TEMPERATURE|K|2|0|15|K|2|5
+022050|standardDeviationSeaSurfaceTemperature|double|STANDARD DEVIATION SEA-SURFACE TEMPERATURE|K|2|0|8|K|2|3
+022055|floatCycleNumber|long|FLOAT CYCLE NUMBER|Numeric|0|0|10|Numeric|0|3
+022056|directionOfProfile|table|DIRECTION OF PROFILE|CODE TABLE|0|0|2|CODE TABLE|0|1
+022059|seaSurfaceSalinity|double|SEA-SURFACE SALINITY|0/00|2|0|14|0/00|2|5
+022060|lagrangianDrifterDrogueStatus|table|LAGRANGIAN DRIFTER DROGUE STATUS|CODE TABLE|0|0|3|CODE TABLE|0|1
+022061|seaState|table|STATE OF THE SEA|CODE TABLE|0|0|4|CODE TABLE|0|2
+022062|salinity|double|SALINITY|0/00|2|0|14|0/00|2|5
+022063|totalWaterDepth|long|TOTAL WATER DEPTH|m|0|0|14|m|0|5
+022064|salinity|double|SALINITY|0/00|3|0|17|0/00|3|6
+022065|oceanographicWaterPressure|long|WATER PRESSURE|Pa|-3|0|17|Pa|-3|6
+022066|oceanographicWaterConductivity|double|WATER CONDUCTIVITY|S/m|6|0|26|S/m|6|8
+022067|instrumentTypeForWaterTemperatureOrSalinityProfileMeasurement|table|INSTRUMENT TYPE FOR WATER TEMPERATURE/SALINITY PROFILE MEASUREMENT|CODE TABLE|0|0|10|CODE TABLE|0|4
+022068|waterTemperatureProfileRecorderTypes|table|WATER TEMPERATURE PROFILE RECORDER TYPES|CODE TABLE|0|0|7|CODE TABLE|0|3
+022069|spectralWaveDensity|double|SPECTRAL WAVE DENSITY|m2/Hz|3|0|22|m2/Hz|3|7
+022070|significantWaveHeight|double|SIGNIFICANT WAVE HEIGHT|m|2|0|13|m|2|4
+022071|spectralPeakWavePeriod|double|SPECTRAL PEAK WAVE PERIOD|s|1|0|9|s|1|3
+022072|spectralPeakWaveLength|long|SPECTRAL PEAK WAVELENGTH|m|0|0|13|m|0|4
+022073|maximumWaveHeight|double|MAXIMUM WAVE HEIGHT|m|2|0|13|m|2|4
+022074|averageWavePeriod|double|AVERAGE WAVE PERIOD|s|1|0|9|s|1|3
+022075|averageWaveLength|long|AVERAGE WAVELENGTH|m|0|0|13|m|0|4
+022076|directionFromWhichDominantWavesAreComing|long|DIRECTION FROM WHICH DOMINANT WAVES ARE COMING|deg|0|0|9|deg|0|3
+022077|directionalSpreadOfDominantWave|long|DIRECTIONAL SPREAD OF DOMINANT WAVE|deg|0|0|9|deg|0|3
+022078|durationOfWaveRecord|long|DURATION OF WAVE RECORD|s|0|0|12|s|0|4
+022079|lengthOfWaveRecord|long|LENGTH OF WAVE RECORD|m|0|0|16|m|0|5
+022080|wavebandCentralFrequency|double|WAVEBAND CENTRAL FREQUENCY|Hz|3|0|10|Hz|3|4
+022081|wavebandCentralWaveNumber|double|WAVEBAND CENTRAL WAVE NUMBER|/m|5|0|13|/m|5|4
+022082|maximumNonDirectionalSpectralWaveDensity|double|MAXIMUM NON-DIRECTIONAL SPECTRAL WAVE DENSITY|m2 s|2|0|20|m2 s|2|7
+022083|maximumNonDirectionalSpectralWaveNumber|double|MAXIMUM NON-DIRECTIONAL SPECTRAL WAVE NUMBER|m3|2|0|20|m3|2|7
+022084|bandContainingMaximumNonDirectionalSpectralWaveDensity|long|BAND CONTAINING MAXIMUM NON-DIRECTIONAL SPECTRAL WAVE DENSITY|Numeric|0|0|7|Numeric|0|3
+022085|spectralWaveDensityRatio|long|SPECTRAL WAVE DENSITY RATIO|Numeric|0|0|7|Numeric|0|3
+022086|meanDirectionFromWhichWavesAreComing|long|MEAN DIRECTION FROM WHICH WAVES ARE COMING|deg|0|0|9|deg|0|3
+022087|principalDirectionFromWhichWavesAreComing|long|PRINCIPAL DIRECTION FROM WHICH WAVES ARE COMING|deg|0|0|9|deg|0|3
+022088|firstNormalizedPolarCoordinateFromFourierCoefficients|long|FIRST NORMALIZED POLAR COORDINATE FROM FOURIER COEFFICIENTS|Numeric|2|0|7|Numeric|2|3
+022089|secondNormalizedPolarCoordinateFromFourierCoefficients|long|SECOND NORMALIZED POLAR COORDINATE FROM FOURIER COEFFICIENTS|Numeric|2|0|7|Numeric|2|3
+022090|nonDirectionalSpectralEstimateByWaveFrequency|double|NON-DIRECTIONAL SPECTRAL ESTIMATE BY WAVE FREQUENCY|m2 s|2|0|20|m2 s|2|7
+022091|nonDirectionalSpectralEstimateByWaveNumber|double|NON-DIRECTIONAL SPECTRAL ESTIMATE BY WAVE NUMBER|m3|2|0|20|m3|2|7
+022092|directionalSpectralEstimateByWaveFrequency|double|DIRECTIONAL SPECTRAL ESTIMATE BY WAVE FREQUENCY|m2 rad-1 s|2|0|20|m2 rad-1 s|2|7
+022093|directionalSpectralEstimateByWaveNumber|double|DIRECTIONAL SPECTRAL ESTIMATE BY WAVE NUMBER|m4|2|0|20|m4|2|7
+022094|totalNumberOfWaveBands|long|TOTAL NUMBER OF WAVE BANDS|Numeric|0|0|7|Numeric|0|3
+022095|directionalSpreadOfIndividualWaves|long|DIRECTIONAL SPREAD OF INDIVIDUAL WAVES|deg|0|0|8|deg|0|3
+022096|spectralBandWidth|double|SPECTRAL BAND WIDTH|/s|3|0|4|/s|3|2
+022097|meanWavelength731MOfImageSpectrumAtLowWaveNumbers|long|MEAN WAVELENGTH > 731 M OF IMAGE SPECTRUM AT LOW WAVE NUMBERS|m|0|0|14|m|0|5
+022098|wavelengthSpreadWavelength731MAtLowWaveNumbers|long|WAVELENGTH SPREAD (WAVELENGTH > 731 M) AT LOW WAVE NUMBERS|m|0|0|14|m|0|5
+022099|meanDirectionAtLowWaveNumbersWavelength731M|long|MEAN DIRECTION AT LOW WAVE NUMBERS (WAVELENGTH > 731 M)|deg|0|0|9|deg|0|3
+022100|directionSpreadAtLowWaveNumbersWavelength731M|long|DIRECTION SPREAD AT LOW WAVE NUMBERS (WAVELENGTH > 731 M)|deg|0|0|9|deg|0|3
+022101|totalEnergyWavelength731mAtLowWaveNumbers|long|TOTAL ENERGY (WAVELENGTH > 731M) AT LOW WAVE NUMBERS|Numeric|0|0|31|Numeric|0|10
+022102|scaledMaximumNonDirectionalSpectralWaveDensityByFrequency|long|SCALED MAXIMUM NON-DIRECTIONAL SPECTRAL WAVE DENSITY BY FREQUENCY|m2 s|0|0|14|m2 s|0|5
+022103|scaledMaximumNonDirectionalSpectralWaveDensityByWavenumber|long|SCALED MAXIMUM NON-DIRECTIONAL SPECTRAL WAVE DENSITY BY WAVENUMBER|m3|0|0|14|m3|0|5
+022104|scaledNonDirectionalSpectralWaveDensityByFrequency|long|SCALED NON-DIRECTIONAL SPECTRAL WAVE DENSITY BY FREQUENCY|m2 s|0|0|14|m2 s|0|5
+022105|scaledNonDirectionalSpectralWaveDensityByWavenumber|long|SCALED NON-DIRECTIONAL SPECTRAL WAVE DENSITY BY WAVENUMBER|m3|0|0|14|m3|0|5
+022106|scaledDirectionalSpectralWaveDensityByFrequency|long|SCALED DIRECTIONAL SPECTRAL WAVE DENSITY BY FREQUENCY|m2 rad-1 s|0|0|14|m2 rad-1 s|0|5
+022107|scaledDirectionalSpectralWaveDensityByWavenumber|long|SCALED DIRECTIONAL SPECTRAL WAVE DENSITY BY WAVENUMBER|m4|0|0|14|m4|0|5
+022108|spectralWaveDensityRatio|long|SPECTRAL WAVE DENSITY RATIO|%|0|0|7|%|0|3
+022120|tideStationAutomatedWaterLevelCheck|table|TIDE STATION AUTOMATED WATER LEVEL CHECK|CODE TABLE|0|0|5|CODE TABLE|0|2
+022121|tideStationManualWaterLevelCheck|table|TIDE STATION MANUAL WATER LEVEL CHECK|CODE TABLE|0|0|5|CODE TABLE|0|2
+022122|automatedMeteorologicalDataCheck|table|TIDE STATION AUTOMATED METEOROLOGICAL DATA CHECK|CODE TABLE|0|0|5|CODE TABLE|0|2
+022123|tideStationManualMeteorologicalDataCheck|table|TIDE STATION MANUAL METEOROLOGICAL DATA CHECK|CODE TABLE|0|0|5|CODE TABLE|0|2
+022130|numberOfValidPointsForSpecificBand|long|NUMBER OF VALID POINTS FOR SPECIFIC BAND|Numeric|0|0|10|Numeric|0|4
+022131|rmsSpecificBandSignificantWaveHeight|double|RMS SPECIFIC BAND SIGNIFICANT WAVE HEIGHT|m|3|0|16|m|3|5
+022132|numberOfValidPointsForSpecificBandSignificantWaveHeight|long|NUMBER OF VALID POINTS FOR SPECIFIC BAND SIGNIFICANT WAVE HEIGHT|Numeric|0|0|10|Numeric|0|4
+022133|specificBandNetInstrumentCorrectionForSignificantWaveHeight|double|SPECIFIC BAND NET INSTRUMENT CORRECTION FOR SIGNIFICANT WAVE HEIGHT|m|3|-1000|11|m|3|4
+022134|numberOfValidPointsForSpecificBandBackscatter|long|NUMBER OF VALID POINTS FOR SPECIFIC BAND BACKSCATTER|Numeric|0|0|10|Numeric|0|4
+022141|seaSurfaceTemperature15DayRunningMean|double|SEA-SURFACE TEMPERATURE (15-DAY RUNNING MEAN)|K|2|0|15|K|2|5
+022142|squareOfSignificantWaveHeight|double|SQUARE OF SIGNIFICANT WAVE HEIGHT|m2|3|-33554432|26|m2|3|8
+022143|stdOf20HzSwhSquared|double|STD OF 20 HZ SWH SQUARED|m2|3|-8388608|24|m2|3|8
+022144|numberOf20HzValidPointsForSwhSquared|long|NUMBER OF 20 HZ VALID POINTS FOR SWH SQUARED|Numeric|0|0|9|Numeric|0|3
+022145|stdOf20HzOceanRange|double|STD OF 20 HZ OCEAN RANGE|m|3|-33554432|31|m|3|10
+022146|ocogRange|double|OCOG RANGE|m|3|0|31|m|3|10
+022147|stdOf20HzOcogRange|double|STD OF 20 HZ OCOG RANGE|m|3|-8388608|31|m|3|10
+022148|numberOf20HzValidPointsForOceanRange|long|NUMBER OF 20 HZ VALID POINTS FOR OCEAN RANGE|Numeric|0|0|9|Numeric|0|3
+022149|20HzSignificantWaveHeightSquared|double|20 HZ SIGNIFICANT WAVE HEIGHT SQUARED|m2|3|-33554432|26|m2|3|8
+022150|numberOf18HzValidPointsForKuBand|long|NUMBER OF 18 HZ VALID POINTS FOR KU BAND|Numeric|0|0|10|Numeric|0|4
+022151|kuBandOceanRange|double|KU BAND OCEAN RANGE|m|3|0|31|m|3|10
+022152|stdOf18HzKuBandOceanRange|double|STD OF 18 HZ KU BAND OCEAN RANGE|m|3|0|16|m|3|5
+022153|numberOf18HzValidPointsForSBand|long|NUMBER OF 18 HZ VALID POINTS FOR S BAND|Numeric|0|0|10|Numeric|0|4
+022154|sBandOceanRange|double|S BAND OCEAN RANGE|m|3|0|31|m|3|10
+022155|stdOf18HzSBandOceanRange|double|STD OF 18 HZ S BAND OCEAN RANGE|m|3|0|16|m|3|5
+022156|kuBandSignificantWaveHeight|double|KU BAND SIGNIFICANT WAVE HEIGHT|m|3|0|16|m|3|5
+022157|stdOf18HzKuBandOceanRange|double|STD OF 18 HZ KU BAND OCEAN RANGE|m|3|0|16|m|3|5
+022158|sBandSignificantWaveHeight|double|S BAND SIGNIFICANT WAVE HEIGHT|m|3|0|16|m|3|5
+022159|stdOf18HzSBandSignificantWaveHeight|double|STD OF 18 HZ S BAND SIGNIFICANT WAVE HEIGHT|m|3|0|16|m|3|5
+022160|normalizedInverseWaveAge|long|NORMALIZED INVERSE WAVE AGE|Numeric|6|0|21|Numeric|6|7
+022161|waveSpectra|double|WAVE SPECTRA|m4|4|0|27|m4|4|9
+022162|rmsOf20HzKuBandOceanRange|double|RMS OF 20 HZ KU BAND OCEAN RANGE|m|3|0|16|m|3|5
+022163|numberOf20HzValidPointsForKuBand|long|NUMBER OF 20HZ VALID POINTS FOR KU BAND|Numeric|0|0|10|Numeric|0|4
+022164|rms20HzKuBandSignificantWaveHeight|double|RMS 20 HZ KU BAND SIGNIFICANT WAVE HEIGHT|m|3|0|16|m|3|5
+022165|numberOf20HzValidPointsForKuBandSignificantWaveHeight|long|NUMBER OF 20 HZ VALID POINTS FOR KU BAND SIGNIFICANT WAVE HEIGHT|Numeric|0|0|10|Numeric|0|4
+022166|kuBandNetInstrumentalCorrectionForSignificantWaveHeight|double|KU BAND NET INSTRUMENTAL CORRECTION FOR SIGNIFICANT WAVE HEIGHT|m|3|-1000|11|m|3|4
+022167|numberOfValidPointsForKuBandBackscatter|long|NUMBER OF VALID POINTS FOR KU BAND BACKSCATTER|Numeric|0|0|10|Numeric|0|4
+022168|cBandOceanRange|double|C BAND OCEAN RANGE|m|3|0|31|m|3|10
+022169|rmsOfCBandOceanRange|double|RMS OF C BAND OCEAN RANGE|m|3|0|16|m|3|5
+022170|numberOf20HzValidPointsForCBand|long|NUMBER OF 20 HZ VALID POINTS FOR C BAND|Numeric|0|0|10|Numeric|0|4
+022171|cBandSignificantWaveHeight|double|C BAND SIGNIFICANT WAVE HEIGHT|m|3|0|16|m|3|5
+022172|rms20HzCBandSignificantWaveHeight|double|RMS 20 HZ C BAND SIGNIFICANT WAVE HEIGHT|m|3|0|16|m|3|5
+022173|numberOf20HzValidPointsForCBandSignificantWaveHeight|long|NUMBER OF 20 HZ VALID POINTS FOR C BAND SIGNIFICANT WAVE HEIGHT|Numeric|0|0|10|Numeric|0|4
+022174|cBandNetInstrumentalCorrectionForSignificantWaveHeight|double|C BAND NET INSTRUMENTAL CORRECTION FOR SIGNIFICANT WAVE HEIGHT|m|3|-1000|11|m|3|4
+022175|numberOfValidPointsForCBandBackscatter|long|NUMBER OF VALID POINTS FOR C BAND BACKSCATTER|Numeric|0|0|10|Numeric|0|4
+022177|heightOfXbtOrXctdLauncher|long|HEIGHT OF XBT/XCTD LAUNCHER|m|0|0|6|m|0|3
+022178|xbtOrXctdLauncherType|table|XBT/XCTD LAUNCHER TYPE|CODE TABLE|0|0|8|CODE TABLE|0|3
+022182|waterColumnHeight|double|WATER COLUMN HEIGHT|m|3|0|23|m|3|7
+022184|waterColumnHeightDeviationFromReferenceValue|double|WATER COLUMN HEIGHT DEVIATION FROM THE REFERENCE VALUE|m|3|-2000|12|m|3|4
+022185|bprTransmissionCount|long|BPR TRANSMISSION COUNT|Numeric|0|0|10|Numeric|0|3
+022186|directionFromWhichWavesAreComing|long|DIRECTION FROM WHICH WAVES ARE COMING|deg|0|0|9|deg|0|3
+022187|directionalSpreadOfWaves|long|DIRECTIONAL SPREAD OF WAVE|deg|0|0|9|deg|0|3
+022188|oceanographicDissolvedOxygen|double|DISSOLVED OXYGEN|umol/kg|3|0|19|umol/kg|3|6
+022189|specificBandOceanRange|double|SPECIFIC BAND OCEAN RANGE|m|3|0|31|m|3|10
+022190|specificBandSignificantWaveHeight|double|SPECIFIC BAND SIGNIFICANT WAVE HEIGHT|m|3|0|16|m|3|5
+022191|rmsOfSpecificBandOceanRange|double|RMS OF SPECIFIC BAND OCEAN RANGE|m|4|0|16|m|4|5
+023001|accidentEarlyNotificationArticleApplicable|table|ACCIDENT EARLY NOTIFICATION - ARTICLE APPLICABLE|CODE TABLE|0|0|3|CODE TABLE|0|1
+023002|facilityInvolvedInIncident|table|ACTIVITY OR FACILITY INVOLVED IN INCIDENT|CODE TABLE|0|0|5|CODE TABLE|0|2
+023003|releaseType|table|TYPE OF RELEASE|CODE TABLE|0|0|3|CODE TABLE|0|1
+023004|countermeasuresTakenNearBorder|table|COUNTERMEASURES TAKEN NEAR BORDER|CODE TABLE|0|0|3|CODE TABLE|0|1
+023005|causeOfIncident|table|CAUSE OF INCIDENT|CODE TABLE|0|0|2|CODE TABLE|0|1
+023006|incidentSituation|table|INCIDENT SITUATION|CODE TABLE|0|0|3|CODE TABLE|0|1
+023007|characteristicsOfRelease|table|CHARACTERISTICS OF RELEASE|CODE TABLE|0|0|3|CODE TABLE|0|1
+023008|stateOfCurrentRelease|table|STATE OF CURRENT RELEASE|CODE TABLE|0|0|2|CODE TABLE|0|1
+023009|stateOfExpectedRelease|table|STATE OF EXPECTED RELEASE|CODE TABLE|0|0|2|CODE TABLE|0|1
+023016|possibilityOfSignificantChemicalToxicHealthEffect|table|POSSIBILITY OF SIGNIFICANT CHEMICAL TOXIC HEALTH EFFECT|CODE TABLE|0|0|2|CODE TABLE|0|1
+023017|flowDischargeOfMajorRecipient|double|FLOW DISCHARGE OF MAJOR RECIPIENT|m3/s|6|0|20|m3/s|6|7
+023018|releaseBehaviourOverTime|table|RELEASE BEHAVIOUR OVER TIME|CODE TABLE|0|0|3|CODE TABLE|0|1
+023019|actualReleaseHeight|long|ACTUAL RELEASE HEIGHT|m|0|-15000|17|m|0|6
+023021|effectiveReleaseHeight|long|EFFECTIVE RELEASE HEIGHT|m|0|-15000|17|m|0|6
+023022|distanceOfReleasePointOrSiteOfIncident|long|DISTANCE OF RELEASE POINT OR SITE OF INCIDENT|m|0|0|24|m|0|8
+023023|mainTransportSpeedInAtmosphere|double|MAIN TRANSPORT SPEED IN THE ATMOSPHERE|m/s|1|0|12|m/s|1|4
+023024|mainTransportSpeedInWater|double|MAIN TRANSPORT SPEED IN WATER|m/s|2|0|13|m/s|2|4
+023025|mainTransportSpeedInGroundWater|double|MAIN TRANSPORT SPEED IN GROUND WATER|m/s|2|0|13|m/s|2|4
+023027|mainTransportDirectionInTheAtmosphere|long|MAIN TRANSPORT DIRECTION IN THE ATMOSPHERE|deg|0|0|9|deg|0|3
+023028|mainTransportDirectionInWater|long|MAIN TRANSPORT DIRECTION IN WATER|deg|0|0|9|deg|0|3
+023029|mainTransportDirectionInGroundWater|long|MAIN TRANSPORT DIRECTION IN GROUND WATER|deg|0|0|9|deg|0|3
+023031|possibilityPlume|table|POSSIBILITY THAT PLUME WILL ENCOUNTER PRECIPITATION IN STATE IN WHICH INCIDENT OCCURRED|CODE TABLE|0|0|2|CODE TABLE|0|1
+023032|plumeWillEncounterChangeInWindDirectionAndOrOrSpeedFlag|table|PLUME WILL ENCOUNTER CHANGE IN WIND DIRECTION AND/OR SPEED FLAG|CODE TABLE|0|0|2|CODE TABLE|0|1
+023040|flowDischargeRiver|double|FLOW DISCHARGE - RIVER|m3/s|1|0|22|m3/s|1|7
+023041|flowDischargeWell|double|FLOW DISCHARGE - WELL|m3/s|3|0|16|m3/s|3|5
+024001|estimateOfAmountOfRadioactivityReleasedUpToSpecifiedTime|long|ESTIMATE OF AMOUNT OF RADIOACTIVITY RELEASED UP TO SPECIFIED TIME|Bq|-11|0|28|Bq|-11|9
+024002|estimatedMaximumPotentialRelease|long|ESTIMATED MAXIMUM POTENTIAL RELEASE|Bq|-11|0|28|Bq|-11|9
+024003|compositionOfRelease|table|COMPOSITION OF RELEASE|CODE TABLE|0|0|5|CODE TABLE|0|2
+024004|elementName|string|ELEMENT NAME|CCITT IA5|0|0|16|Character|0|2
+024005|isotopeMass|long|ISOTOPE MASS|Numeric|0|0|9|Numeric|0|3
+024011|dose|double|DOSE|mSv|2|0|32|mSv|2|10
+024012|trajectoryDoseDefinedLocationAndExpectedTimeOfArrival|double|TRAJECTORY DOSE (DEFINED LOCATION AND EXPECTED TIME OF ARRIVAL)|mSv|2|0|32|mSv|2|10
+024013|gammaDoseInAirAlongMainTransportPathDefinedLocationAndTimePeriod|double|GAMMA DOSE IN AIR ALONG THE MAIN TRANSPORT PATH (DEFINED LOCATION AND TIME PERIOD)|mSv|2|0|32|mSv|2|10
+024014|gammaRadiationDoseRate|double|GAMMA RADIATION DOSE RATE|nSv/h|1|0|14|nSv/h|1|4
+024021|airConcentrationOfNamedIsotopeTypeIncludingGrossBeta|double|AIR CONCENTRATION (OF NAMED ISOTOPE TYPE INCLUDING GROSS BETA)|Bq m-3|2|0|32|Bq m-3|2|10
+024022|concentrationInPrecipitationOfNamedIsotopeType|double|CONCENTRATION IN PRECIPITATION (OF NAMED ISOTOPE TYPE)|Bq/l|2|0|32|Bq/l|2|10
+024023|pulseRateOfBetaRadiation|double|PULSE RATE OF BETA RADIATION|/s|1|0|14|/s|1|4
+024024|pulseRateOfGammaRadiation|double|PULSE RATE OF GAMMA RADIATION|/s|1|0|14|/s|1|4
+025001|rangeGateLength|long|RANGE-GATE LENGTH|m|-1|0|6|m|-1|2
+025002|numberOfGatesAveraged|long|NUMBER OF GATES AVERAGED|Numeric|0|0|4|Numeric|0|2
+025003|numberOfIntegratedPulses|long|NUMBER OF INTEGRATED PULSES|Numeric|0|0|8|Numeric|0|3
+025004|echoProcessing|table|ECHO PROCESSING|CODE TABLE|0|0|2|CODE TABLE|0|1
+025005|echoIntegration|table|ECHO INTEGRATION|CODE TABLE|0|0|2|CODE TABLE|0|1
+025006|zToRConversion|table|Z TO R CONVERSION|CODE TABLE|0|0|3|CODE TABLE|0|1
+025007|zToRConversionFactor|long|Z TO R CONVERSION FACTOR|Numeric|0|0|12|Numeric|0|4
+025008|zToRConversionExponent|long|Z TO R CONVERSION EXPONENT|Numeric|2|0|9|Numeric|2|3
+025009|calibrationMethod|flag|CALIBRATION METHOD|FLAG TABLE|0|0|4|FLAG TABLE|0|2
+025010|clutterTreatment|table|CLUTTER TREATMENT|CODE TABLE|0|0|4|CODE TABLE|0|2
+025011|groundOccultationCorrectionScreening|table|GROUND OCCULTATION CORRECTION (SCREENING)|CODE TABLE|0|0|2|CODE TABLE|0|1
+025012|rangeAttenuationCorrection|table|RANGE ATTENUATION CORRECTION|CODE TABLE|0|0|2|CODE TABLE|0|1
+025013|brightBandCorrection|flag|BRIGHT-BAND CORRECTION|FLAG TABLE|0|0|2|FLAG TABLE|0|1
+025014|azimuthClutterCutOff|long|AZIMUTH CLUTTER CUT-OFF|Numeric|0|0|12|Numeric|0|4
+025015|radomeAttenuationCorrection|flag|RADOME ATTENUATION CORRECTION|FLAG TABLE|0|0|2|FLAG TABLE|0|1
+025016|clearAirAttenuationCorrection|double|CLEAR-AIR ATTENUATION CORRECTION|dB/m|5|0|6|dB/m|5|2
+025017|precipitationAttenuationCorrection|flag|PRECIPITATION ATTENUATION CORRECTION|FLAG TABLE|0|0|2|FLAG TABLE|0|1
+025018|aToZLawForAttenuationFactor|long|A TO Z LAW FOR ATTENUATION FACTOR|Numeric|7|0|6|Numeric|7|2
+025019|aToZLawForAttenuationExponent|long|A TO Z LAW FOR ATTENUATION EXPONENT|Numeric|2|0|7|Numeric|2|3
+025020|meanSpeedEstimation|table|MEAN SPEED ESTIMATION|CODE TABLE|0|0|2|CODE TABLE|0|1
+025021|windComputationEnhancement|flag|WIND COMPUTATION ENHANCEMENT|FLAG TABLE|0|0|8|FLAG TABLE|0|3
+025022|ghrsstRejectionFlag|flag|GHRSST* REJECTION FLAG|FLAG TABLE|0|0|9|FLAG TABLE|0|3
+025023|ghrsstConfidenceFlag|flag|GHRSST CONFIDENCE FLAG|FLAG TABLE|0|0|9|FLAG TABLE|0|3
+025024|ghrsstDataQuality|table|GHRSST DATA QUALITY|CODE TABLE|0|0|4|CODE TABLE|0|2
+025025|batteryVoltage|double|BATTERY VOLTAGE|V|1|0|9|V|1|3
+025026|batteryVoltageLargeRange|double|BATTERY VOLTAGE (LARGE RANGE)|V|1|0|12|V|1|4
+025028|operatorOrManufacturerDefinedParameter|long|OPERATOR OR MANUFACTURER DEFINED PARAMETER|Numeric|1|-16384|15|Numeric|1|5
+025029|calibrationMethod|flag|CALIBRATION METHOD|FLAG TABLE|0|0|6|FLAG TABLE|0|2
+025030|runningMeanSeaSurfaceTemperatureUsage|table|RUNNING MEAN SEA-SURFACE TEMPERATURE USAGE|CODE TABLE|0|0|2|CODE TABLE|0|1
+025031|nwpGeneratedVerticalProfileThinningMethod|table|NWP-GENERATED VERTICAL PROFILE THINNING METHOD|CODE TABLE|0|0|3|CODE TABLE|0|1
+025032|windProfilerModeInformation|table|WIND PROFILER MODE INFORMATION|CODE TABLE|0|0|2|CODE TABLE|0|1
+025033|windProfilerSubmodeInformation|table|WIND PROFILER SUBMODE INFORMATION|CODE TABLE|0|0|2|CODE TABLE|0|1
+025034|windProfilerQualityControlTestResults|flag|WIND PROFILER QUALITY CONTROL TEST RESULTS|FLAG TABLE|0|0|4|FLAG TABLE|0|2
+025035|decisionMethodForPolarity|table|DECISION METHOD FOR POLARITY|CODE TABLE|0|0|3|CODE TABLE|0|1
+025036|atmosphericsLocationMethod|table|ATMOSPHERICS LOCATION METHOD|CODE TABLE|0|0|4|CODE TABLE|0|2
+025037|sstBias|double|SST BIAS|K|2|-127|8|K|2|3
+025038|differenceBetweenSstAndAnalysis|double|DIFFERENCE BETWEEN SST AND ANALYSIS|K|1|-127|8|K|1|3
+025040|co2WindProductDerivation|table|CO2 WIND PRODUCT DERIVATION|CODE TABLE|0|0|4|CODE TABLE|0|2
+025041|movingPlatformDirectionReportingMethod|table|MOVING PLATFORM DIRECTION REPORTING METHOD|CODE TABLE|0|0|2|CODE TABLE|0|1
+025042|movingPlatformSpeedReportingMethod|table|MOVING PLATFORM SPEED REPORTING METHOD|CODE TABLE|0|0|2|CODE TABLE|0|1
+025043|waveSamplingIntervalTime|double|WAVE SAMPLING INTERVAL (TIME)|s|4|0|15|s|4|5
+025044|waveSamplingIntervalSpace|double|WAVE SAMPLING INTERVAL (SPACE)|m|2|0|14|m|2|5
+025045|hirsChannelCombination|flag|HIRS CHANNEL COMBINATION|FLAG TABLE|0|0|21|FLAG TABLE|0|7
+025046|msuChannelCombination|flag|MSU CHANNEL COMBINATION|FLAG TABLE|0|0|5|FLAG TABLE|0|2
+025047|ssuChannelCombination|flag|SSU CHANNEL COMBINATION|FLAG TABLE|0|0|4|FLAG TABLE|0|2
+025048|amsuAChannelCombination|flag|AMSU-A CHANNEL COMBINATION|FLAG TABLE|0|0|16|FLAG TABLE|0|6
+025049|amsuBChannelCombination|flag|AMSU-B CHANNEL COMBINATION|FLAG TABLE|0|0|6|FLAG TABLE|0|2
+025050|principalComponentScore|long|PRINCIPAL COMPONENT SCORE|Numeric|4|-131072|18|Numeric|4|6
+025051|avhrrChannelCombination|flag|AVHRR CHANNEL COMBINATION|FLAG TABLE|0|0|7|FLAG TABLE|0|3
+025052|log10OfPrincipalComponentsNormalizedFitToData|long|LOG10 OF PRINCIPAL COMPONENTS NORMALIZED FIT TO DATA|Numeric|4|0|15|Numeric|4|5
+025053|observationQuality|flag|OBSERVATION QUALITY|FLAG TABLE|0|0|12|FLAG TABLE|0|4
+025054|ssmisSubframeIdNumber|long|SSMIS SUBFRAME ID NUMBER|Numeric|0|0|5|Numeric|0|2
+025055|multiplexerHousekeeping|double|MULTIPLEXER HOUSEKEEPING|K|2|0|16|K|2|5
+025060|softwareIdentification|long|SOFTWARE IDENTIFICATION|Numeric|0|0|14|Numeric|0|5
+025061|softwareVersionNumber|string|SOFTWARE IDENTIFICATION AND VERSION NUMBER|CCITT IA5|0|0|96|Character|0|12
+025062|databaseIdentification|long|DATABASE IDENTIFICATION|Numeric|0|0|14|Numeric|0|5
+025063|SystemIdentifier|table|CENTRAL PROCESSOR OR SYSTEM IDENTIFIER|CODE TABLE|0|0|8|CODE TABLE|0|3
+025065|orientationCorrectionAzimuth|double|ORIENTATION CORRECTION (AZIMUTH)|deg|2|-1000|11|deg|2|4
+025066|orientationCorrectionElevation|double|ORIENTATION CORRECTION (ELEVATION)|deg|2|-1000|11|deg|2|4
+025067|radiosondeReleasePointPressureCorrection|long|RADIOSONDE RELEASE POINT PRESSURE CORRECTION|Pa|0|-8000|14|Pa|0|4
+025068|numberOfArchiveRecomputes|long|NUMBER OF ARCHIVE RECOMPUTES|Numeric|0|0|7|Numeric|0|3
+025069|flightLevelPressureCorrections|flag|FLIGHT LEVEL PRESSURE CORRECTIONS|FLAG TABLE|0|0|8|FLAG TABLE|0|3
+025070|majorFrameCount|long|MAJOR FRAME COUNT|Numeric|0|0|4|Numeric|0|2
+025071|frameCount|long|FRAME COUNT|Numeric|0|0|5|Numeric|0|2
+025075|satelliteAntennaCorrectionsVersionNumber|long|SATELLITE ANTENNA CORRECTIONS VERSION NUMBER|Numeric|0|0|5|Numeric|0|2
+025076|log10OfTemperatureRadianceCentralWaveNumberForAtovs|double|LOG10 OF (TEMPERATURE-RADIANCE CENTRAL WAVE NUMBER) FOR ATOVS|log (m-1)|8|0|30|log (m-1)|8|10
+025077|bandwidthCorrectionCoefficient1ForAtovs|long|BANDWIDTH CORRECTION COEFFICIENT 1 FOR ATOVS|Numeric|5|-100000|18|Numeric|5|7
+025078|bandwidthCorrectionCoefficient2ForAtovs|long|BANDWIDTH CORRECTION COEFFICIENT 2 FOR ATOVS|Numeric|5|0|17|Numeric|5|6
+025079|albedoRadianceSolarFilteredIrradianceForAtovs|double|ALBEDO-RADIANCE SOLAR FILTERED IRRADIANCE FOR ATOVS|W m-2|4|0|24|W m-2|4|8
+025080|albedoRadianceEquivalentFilterWidthForAtovs|double|ALBEDO-RADIANCE EQUIVALENT FILTER WIDTH FOR ATOVS|m|10|0|14|m|10|5
+025081|incidenceAngle|double|INCIDENCE ANGLE|deg|3|0|17|deg|3|6
+025082|azimuthAngle|double|AZIMUTH ANGLE|deg|3|0|19|deg|3|6
+025083|faradayRotationalAngle|double|FARADAY ROTATIONAL ANGLE|deg|3|0|19|deg|3|6
+025084|geometricRotationalAngle|double|GEOMETRIC ROTATIONAL ANGLE|deg|5|0|26|deg|5|8
+025085|fractionOfClearPixelsInHirsFov|long|FRACTION OF CLEAR PIXELS IN HIRS FOV|Numeric|0|0|7|Numeric|0|3
+025086|depthCorrectionIndicator|table|DEPTH CORRECTION INDICATOR|CODE TABLE|0|0|2|CODE TABLE|0|1
+025090|orbitStateFlag|table|ORBIT STATE FLAG|CODE TABLE|0|0|4|CODE TABLE|0|2
+025091|structureConstantOfRefractionIndexCn2|double|STRUCTURE CONSTANT OF THE REFRACTION INDEX (CN2)|dB|3|-18192|13|dB|3|5
+025092|acousticPropagationVelocity|double|ACOUSTIC PROPAGATION VELOCITY|m/s|2|28000|14|m/s|2|5
+025093|rassComputationCorrection|flag|RASS COMPUTATION CORRECTION|FLAG TABLE|0|0|8|FLAG TABLE|0|3
+025095|altimeterStateFlag|flag|ALTIMETER STATE FLAG|FLAG TABLE|0|0|2|FLAG TABLE|0|1
+025096|radiometerStateFlag|flag|RADIOMETER STATE FLAG|FLAG TABLE|0|0|5|FLAG TABLE|0|2
+025097|threeDimensionalErrorEstimateOfNavigatorOrbit|table|THREE-DIMENSIONAL ERROR ESTIMATE OF THE NAVIGATOR ORBIT|CODE TABLE|0|0|4|CODE TABLE|0|2
+025098|altimeterDataQualityFlag|flag|ALTIMETER DATA QUALITY FLAG|FLAG TABLE|0|0|9|FLAG TABLE|0|3
+025099|altimeterCorrectionQualityFlag|flag|ALTIMETER CORRECTION QUALITY FLAG|FLAG TABLE|0|0|9|FLAG TABLE|0|3
+025100|xbtOrXctdFallRateEquationCoefficientA|long|XBT/XCTD FALL RATE EQUATION COEFFICIENT A|Numeric|5|0|20|Numeric|5|6
+025101|xbtOrXctdFallRateEquationCoefficientB|long|XBT/XCTD FALL RATE EQUATION COEFFICIENT B|Numeric|5|-500000|21|Numeric|5|6
+025102|numberOfMissingLinesExcludingDataGaps|long|NUMBER OF MISSING LINES EXCLUDING DATA GAPS|Numeric|0|0|8|Numeric|0|3
+025103|numberOfDirectionalBins|long|NUMBER OF DIRECTIONAL BINS|Numeric|0|0|8|Numeric|0|3
+025104|numberOfWavelengthBins|long|NUMBER OF WAVELENGTH BINS|Numeric|0|0|8|Numeric|0|3
+025105|firstDirectionalBin|double|FIRST DIRECTIONAL BIN|deg|3|0|19|deg|3|6
+025106|directionalBinStep|double|DIRECTIONAL BIN STEP|deg|3|0|19|deg|3|6
+025107|firstWavelengthBin|double|FIRST WAVELENGTH BIN|m|3|0|29|m|3|9
+025108|lastWavelengthBin|double|LAST WAVELENGTH BIN|m|3|0|29|m|3|9
+025110|imageProcessingSummary|flag|IMAGE PROCESSING SUMMARY|FLAG TABLE|0|0|10|FLAG TABLE|0|4
+025111|numberOfInputDataGaps|long|NUMBER OF INPUT DATA GAPS|Numeric|0|0|8|Numeric|0|3
+025112|bandSpecificAltimeterDataQualityFlag|flag|BAND SPECIFIC ALTIMETER DATA QUALITY FLAG|FLAG TABLE|0|0|9|FLAG TABLE|0|3
+025113|bandSpecificAltimeterCorrectionQualityFlag|flag|BAND SPECIFIC ALTIMETER CORRECTION QUALITY FLAG|FLAG TABLE|0|0|9|FLAG TABLE|0|3
+025120|ra2L2ProcessingFlag|table|RA2-L2-PROCESSING FLAG|CODE TABLE|0|0|2|CODE TABLE|0|1
+025121|ra2L2ProcessingQuality|long|RA2-L2-PROCESSING QUALITY|%|0|0|7|%|0|3
+025122|hardwareConfigurationForRf|table|HARDWARE CONFIGURATION FOR RF|CODE TABLE|0|0|2|CODE TABLE|0|1
+025123|hardwareConfigurationForHpa|table|HARDWARE CONFIGURATION FOR HPA|CODE TABLE|0|0|2|CODE TABLE|0|1
+025124|mwrL2ProcessingFlag|table|MWR-L2-PROCESSING FLAG|CODE TABLE|0|0|2|CODE TABLE|0|1
+025125|mwrL2ProcessingQuality|long|MWR-L2-PROCESSING QUALITY|%|0|0|7|%|0|3
+025126|modelDryTroposphericCorrection|double|MODEL DRY TROPOSPHERIC CORRECTION|m|3|-32768|16|m|3|5
+025127|invertedBarometerCorrection|double|INVERTED BAROMETER CORRECTION|m|3|-32768|16|m|3|5
+025128|modelWetTroposphericCorrection|double|MODEL WET TROPOSPHERIC CORRECTION|m|3|-32768|16|m|3|5
+025129|mwrDerivedWetTroposphericCorrection|double|MWR DERIVED WET TROPOSPHERIC CORRECTION|m|3|-32768|16|m|3|5
+025130|ra2IonosphericCorrectionOnKuBand|double|RA2 IONOSPHERIC CORRECTION ON KU BAND|m|3|-32768|16|m|3|5
+025131|ionosphericCorrectionFromDorisOnKuBand|double|IONOSPHERIC CORRECTION FROM DORIS ON KU BAND|m|3|-32768|16|m|3|5
+025132|ionosphericCorrectionFromModelOnKuBand|double|IONOSPHERIC CORRECTION FROM MODEL ON KU BAND|m|3|-32768|16|m|3|5
+025133|seaStateBiasCorrectionOnKuBand|double|SEA STATE BIAS CORRECTION ON KU BAND|m|3|-32768|16|m|3|5
+025134|ra2IonosphericCorrectionOnSBand|double|RA2 IONOSPHERIC CORRECTION ON S BAND|m|3|-32768|16|m|3|5
+025135|ionosphericCorrectionFromDorisOnSBand|double|IONOSPHERIC CORRECTION FROM DORIS ON S BAND|m|3|-32768|16|m|3|5
+025136|ionosphericCorrectionFromModelOnSBand|double|IONOSPHERIC CORRECTION FROM MODEL ON S BAND|m|3|-32768|16|m|3|5
+025137|seaStateBiasCorrectionOnSBand|double|SEA STATE BIAS CORRECTION ON S BAND|m|3|-32768|16|m|3|5
+025138|averageSignalToNoiseRatio|long|AVERAGE SIGNAL-TO-NOISE RATIO|Numeric|0|-2048|12|Numeric|0|4
+025140|startChannel|long|START CHANNEL|Numeric|0|0|14|Numeric|0|5
+025141|endChannel|long|END CHANNEL|Numeric|0|0|14|Numeric|0|5
+025142|channelScaleFactor|long|CHANNEL SCALE FACTOR|Numeric|0|0|6|Numeric|0|2
+025143|linearCoefficient|long|LINEAR COEFFICIENT|Numeric|6|-5000000|24|Numeric|6|8
+025150|methodOfTropicalCycloneIntensityAnalysisUsingSatelliteData|table|METHOD OF TROPICAL CYCLONE INTENSITY ANALYSIS USING SATELLITE DATA|CODE TABLE|0|0|4|CODE TABLE|0|2
+025160|kuBandNetInstrumentalCorrection|double|KU BAND NET INSTRUMENTAL CORRECTION|m|4|-120000|18|m|4|6
+025161|cBandNetInstrumentalCorrection|double|C BAND NET INSTRUMENTAL CORRECTION|m|4|-120000|18|m|4|6
+025162|seaStateBiasCorrectionOnCBand|double|SEA STATE BIAS CORRECTION ON C BAND|m|4|-6000|13|m|4|4
+025163|altimeterIonosphericCorrectionOnKuBand|double|ALTIMETER IONOSPHERIC CORRECTION ON KU BAND|m|3|-32768|16|m|3|5
+025164|radiometerWetTroposphericCorrection|double|RADIOMETER WET TROPOSPHERIC CORRECTION|m|4|-5000|13|m|4|4
+025165|ionosphericCorrectionFromModelOnSpecificBand|double|IONOSPHERIC CORRECTION FROM MODEL ON SPECIFIC BAND|m|4|-32768|16|m|4|5
+025166|seaStateBiasCorrectionOnSpecificBand|double|SEA STATE BIAS CORRECTION ON SPECIFIC BAND|m|4|-32768|16|m|4|5
+025167|specificBandNetInstrumentalCorrection|double|SPECIFIC BAND NET INSTRUMENTAL CORRECTION|m|4|-120000|18|m|4|6
+025170|samplingIntervalTime|long|SAMPLING INTERVAL (TIME)|s|0|0|10|s|0|4
+025171|sampleAveragingPeriod|long|SAMPLE AVERAGING PERIOD|s|0|0|10|s|0|4
+025172|numberOfSamples|long|NUMBER OF SAMPLES|Numeric|0|0|10|Numeric|0|4
+025174|smosInformationFlag|flag|SMOS INFORMATION FLAG|FLAG TABLE|0|0|14|FLAG TABLE|0|5
+025175|modifiedResidual|long|MODIFIED RESIDUAL|Numeric|2|0|13|Numeric|2|4
+025180|lrmPercent|double|LRM* PER CENT|%|2|0|16|%|2|5
+025181|l2ProcessingFlag|table|L2 PROCESSING FLAG|CODE TABLE|0|0|2|CODE TABLE|0|1
+025182|l1ProcessingFlag|table|L1 PROCESSING FLAG|CODE TABLE|0|0|2|CODE TABLE|0|1
+025183|l1ProcessingQuality|double|L1 PROCESSING QUALITY|%|2|0|14|%|2|5
+025184|l2ProductStatus|table|L2 PRODUCT STATUS|CODE TABLE|0|0|2|CODE TABLE|0|1
+025185|encryptionMethod|table|ENCRYPTION METHOD|CODE TABLE|0|0|8|CODE TABLE|0|3
+025186|encryptionKeyVersion|string|ENCRYPTION KEY VERSION|CCITT IA5|0|0|96|Character|0|12
+025187|confidenceFlag|table|CONFIDENCE FLAG|CODE TABLE|0|0|4|CODE TABLE|0|2
+025188|methodForReducingPressureToSeaLevel|table|METHOD FOR REDUCING PRESSURE TO SEA LEVEL|CODE TABLE|0|0|5|CODE TABLE|0|2
+025189|rangeCutOffWavelength|long|RANGE CUT-OFF WAVELENGTH|m|0|1|9|m|0|3
+026001|principalTimeOfDailyReadingInUtcOfMaximumTemperature|double|PRINCIPAL TIME OF DAILY READING IN UTC OF MAXIMUM TEMPERATURE|h|1|0|12|h|1|3
+026002|principalTimeOfDailyReadingInUtcOfMinimumTemperature|double|PRINCIPAL TIME OF DAILY READING IN UTC OF MINIMUM TEMPERATURE|h|1|0|12|h|1|3
+026003|timeDifference|long|TIME DIFFERENCE|min|0|-1440|12|min|0|4
+026010|hoursIncluded|flag|HOURS INCLUDED|FLAG TABLE|0|0|26|FLAG TABLE|0|9
+026020|durationOfPrecipitation|long|DURATION OF PRECIPITATION|min|0|0|11|min|0|4
+026021|nonCoordinateYear|long|YEAR|a|0|0|12|a|0|4
+026022|nonCoordinateMonth|long|MONTH|mon|0|0|4|mon|0|2
+026023|nonCoordinateDay|long|DAY|d|0|0|6|d|0|2
+026030|measurementIntegrationTime|double|MEASUREMENT INTEGRATION TIME|s|2|0|8|s|2|3
+027001|nonCoordinateLatitude|double|LATITUDE (HIGH ACCURACY)|deg|5|-9000000|25|deg|5|7
+027002|nonCoordinateLatitude|double|LATITUDE (COARSE ACCURACY)|deg|2|-9000|15|deg|2|4
+027003|alternateLatitude|double|ALTERNATE LATITUDE (COARSE ACCURACY)|deg|2|-9000|15|deg|2|4
+027004|alternateLatitude|double|ALTERNATE LATITUDE (HIGH ACCURACY)|deg|5|-9000000|25|deg|5|7
+027010|footprintAxis1|long|FOOTPRINT AXIS 1|m|-1|0|14|m|-1|5
+027020|satelliteLocationCounter|long|SATELLITE LOCATION COUNTER|Numeric|0|0|16|Numeric|0|5
+027021|satelliteSublocationDimension|long|SATELLITE SUBLOCATION DIMENSION|Numeric|0|0|16|Numeric|0|5
+027031|DistanceFromEarthCentreInDirectionOf0DegreesLongitude|double|IN DIRECTION OF 0 DEGREES LONGITUDE, DISTANCE FROM THE EARTH'S CENTRE|m|2|-1073741824|31|m|2|10
+027080|viewingAzimuthAngle|double|VIEWING AZIMUTH ANGLE|deg|2|0|16|deg|0|5
+028001|nonCoordinateLongitude|double|LONGITUDE (HIGH ACCURACY)|deg|5|-18000000|26|deg|5|8
+028002|nonCoordinateLongitude|double|LONGITUDE (COARSE ACCURACY)|deg|2|-18000|16|deg|2|5
+028003|alternateLongitude|double|ALTERNATE LONGITUDE (COARSE ACCURACY)|deg|2|-18000|16|deg|2|5
+028004|alternateLongitude|double|ALTERNATE LONGITUDE (HIGH ACCURACY)|deg|5|-18000000|26|deg|5|8
+028010|footprintAxis2|long|FOOTPRINT AXIS 2|m|-1|0|14|m|-1|5
+028031|DistanceFromEarthCentreInDirection90DegreesEast|double|IN DIRECTION 90 DEGREES EAST, DISTANCE FROM THE EARTH'S CENTRE|m|2|-1073741824|31|m|2|10
+029001|projectionType|table|PROJECTION TYPE|CODE TABLE|0|0|3|CODE TABLE|0|1
+029002|coordinateGridType|table|COORDINATE GRID TYPE|CODE TABLE|0|0|3|CODE TABLE|0|1
+029014|optionalListOfParametersForAnExternalMapProjectionLibrary|string|OPTIONAL LIST OF PARAMETERS FOR AN EXTERNAL MAP PROJECTION LIBRARY|CCITT IA5|0|0|504|Character|0|63
+030001|pixelValue4Bits|long|PIXEL VALUE (4 BITS)|Numeric|0|0|4|Numeric|0|2
+030002|pixelValue8Bits|long|PIXEL VALUE (8 BITS)|Numeric|0|0|8|Numeric|0|3
+030004|pixelValue16Bits|long|PIXEL VALUE (16 BITS)|Numeric|0|0|16|Numeric|0|5
+030010|numberOfGridPoints|long|NUMBER OF GRID POINTS|Numeric|0|0|13|Numeric|0|4
+030021|numberOfPixelsPerRow|long|NUMBER OF PIXELS PER ROW|Numeric|0|0|12|Numeric|0|4
+030022|numberOfPixelsPerColumn|long|NUMBER OF PIXELS PER COLUMN|Numeric|0|0|12|Numeric|0|4
+030031|pictureType|table|PICTURE TYPE|CODE TABLE|0|0|4|CODE TABLE|0|2
+030032|combinationWithOtherData|flag|COMBINATION WITH OTHER DATA|FLAG TABLE|0|0|16|FLAG TABLE|0|6
+030033|numberOfBinsAlongRadial|long|NUMBER OF BINS ALONG THE RADIAL|Numeric|0|0|12|Numeric|0|4
+030034|numberOfAzimuths|long|NUMBER OF AZIMUTHS|Numeric|0|0|12|Numeric|0|4
+031000|shortDelayedDescriptorReplicationFactor|long|SHORT DELAYED DESCRIPTOR REPLICATION FACTOR|Numeric|0|0|1|NA|0|0
+031001|delayedDescriptorReplicationFactor|long|DELAYED DESCRIPTOR REPLICATION FACTOR|Numeric|0|0|8|NA|0|0
+031002|extendedDelayedDescriptorReplicationFactor|long|EXTENDED DELAYED DESCRIPTOR REPLICATION FACTOR|Numeric|0|0|16|NA|0|0
+031011|delayedDescriptorAndDataRepetitionFactor|long|DELAYED DESCRIPTOR AND DATA REPETITION FACTOR|Numeric|0|0|8|NA|0|0
+031012|extendedDelayedDescriptorAndDataRepetitionFactor|long|EXTENDED DELAYED DESCRIPTOR AND DATA REPETITION FACTOR|Numeric|0|0|16|NA|0|0
+031021|associatedFieldSignificance|table|ASSOCIATED FIELD SIGNIFICANCE|CODE TABLE|0|0|6|NA|0|0
+031031|dataPresentIndicator|flag|DATA PRESENT INDICATOR|FLAG TABLE|0|0|1|NA|0|0
+033002|qualityInformation|table|QUALITY INFORMATION|CODE TABLE|0|0|2|CODE TABLE|0|1
+033003|qualityInformation|table|QUALITY INFORMATION|CODE TABLE|0|0|3|CODE TABLE|0|1
+033005|qualityInformationAwsData|flag|QUALITY INFORMATION (AWS DATA)|FLAG TABLE|0|0|30|FLAG TABLE|0|10
+033006|internalMeasurementStatusInformationAws|table|INTERNAL MEASUREMENT STATUS INFORMATION (AWS)|CODE TABLE|0|0|3|CODE TABLE|0|1
+033007|percentConfidence|long|PER CENT CONFIDENCE|%|0|0|7|%|0|3
+033015|dataQualityCheckIndicator|table|DATA QUALITY-CHECK INDICATOR|CODE TABLE|0|0|6|CODE TABLE|0|2
+033020|qualityControlIndicationOfFollowingValue|table|QUALITY CONTROL INDICATION OF FOLLOWING VALUE|CODE TABLE|0|0|3|CODE TABLE|0|1
+033021|qualityOfFollowingValue|table|QUALITY OF FOLLOWING VALUE|CODE TABLE|0|0|2|CODE TABLE|0|1
+033022|qualityOfBuoySatelliteTransmission|table|QUALITY OF BUOY SATELLITE TRANSMISSION|CODE TABLE|0|0|2|CODE TABLE|0|1
+033023|qualityOfBuoyLocation|table|QUALITY OF BUOY LOCATION|CODE TABLE|0|0|2|CODE TABLE|0|1
+033024|stationElevationQualityMarkForMobileStations|table|STATION ELEVATION QUALITY MARK (FOR MOBILE STATIONS)|CODE TABLE|0|0|4|CODE TABLE|0|2
+033025|acarsInterpolatedValuesIndicator|table|ACARS INTERPOLATED VALUES INDICATOR|CODE TABLE|0|0|3|CODE TABLE|0|1
+033026|moistureQuality|table|MOISTURE QUALITY|CODE TABLE|0|0|6|CODE TABLE|0|2
+033027|locationQualityClassRangeOfRadiusOf66Confidence|table|LOCATION QUALITY CLASS (RANGE OF RADIUS OF 66 % CONFIDENCE)|CODE TABLE|0|0|3|CODE TABLE|0|1
+033028|snapshotOverallQuality|table|SNAPSHOT OVERALL QUALITY|CODE TABLE|0|0|3|CODE TABLE|0|1
+033030|scanLineStatusFlagsForAtovs|flag|SCAN LINE STATUS FLAGS FOR ATOVS|FLAG TABLE|0|0|24|FLAG TABLE|0|8
+033031|scanLineQualityFlagsForAtovs|flag|SCAN LINE QUALITY FLAGS FOR ATOVS|FLAG TABLE|0|0|24|FLAG TABLE|0|8
+033032|channelQualityFlagsForAtovs|flag|CHANNEL QUALITY FLAGS FOR ATOVS|FLAG TABLE|0|0|24|FLAG TABLE|0|8
+033033|fieldOfViewQualityFlagsForAtovs|flag|FIELD OF VIEW QUALITY FLAGS FOR ATOVS|FLAG TABLE|0|0|24|FLAG TABLE|0|8
+033035|qualityControl|table|MANUAL/AUTOMATIC QUALITY CONTROL|CODE TABLE|0|0|4|CODE TABLE|0|2
+033036|nominalConfidenceThreshold|long|NOMINAL CONFIDENCE THRESHOLD|%|0|0|7|%|0|3
+033037|windCorrelationError|flag|WIND CORRELATION ERROR|FLAG TABLE|0|0|20|FLAG TABLE|0|7
+033038|qualityFlagsForGroundBasedGnssData|flag|QUALITY FLAGS FOR GROUND-BASED GNSS DATA|FLAG TABLE|0|0|10|FLAG TABLE|0|4
+033039|radioOccultationDataQualityFlags|flag|QUALITY FLAGS FOR RADIO OCCULTATION DATA|FLAG TABLE|0|0|16|FLAG TABLE|0|6
+033040|confidenceInterval|long|CONFIDENCE INTERVAL|%|0|0|7|%|0|3
+033041|attributeOfFollowingValue|table|ATTRIBUTE OF FOLLOWING VALUE|CODE TABLE|0|0|2|CODE TABLE|0|1
+033042|typeOfLimitRepresentedByFollowingValue|table|TYPE OF LIMIT REPRESENTED BY FOLLOWING VALUE|CODE TABLE|0|0|3|CODE TABLE|0|1
+033043|astConfidence|flag|AST CONFIDENCE|FLAG TABLE|0|0|8|FLAG TABLE|0|3
+033044|asarQualityInformation|flag|ASAR QUALITY INFORMATION|FLAG TABLE|0|0|15|FLAG TABLE|0|5
+033045|probabilityOfFollowingEvent|long|PROBABILITY OF FOLLOWING EVENT|%|0|0|7|%|0|3
+033046|conditionalProbability|long|CONDITIONAL PROBABILITY OF FOLLOWING EVENT WITH RESPECT TO SPECIFIED CONDITIONING EVENT|%|0|0|7|%|0|3
+033047|measurementConfidenceData|flag|MEASUREMENT CONFIDENCE DATA|FLAG TABLE|0|0|31|FLAG TABLE|0|11
+033048|confidenceMeasureOfSarInversion|table|CONFIDENCE MEASURE OF SAR INVERSION|CODE TABLE|0|0|2|CODE TABLE|0|1
+033049|confidenceMeasureOfWindRetrieval|table|CONFIDENCE MEASURE OF WIND RETRIEVAL|CODE TABLE|0|0|2|CODE TABLE|0|1
+033050|globalGtsppQualityFlag|table|GLOBAL GTSPP QUALITY FLAG|CODE TABLE|0|0|4|CODE TABLE|0|2
+033052|sBandOceanRetrackingQuality|flag|S BAND OCEAN RETRACKING QUALITY|FLAG TABLE|0|0|21|FLAG TABLE|0|7
+033053|kuBandOceanRetrackingQuality|flag|KU BAND OCEAN RETRACKING QUALITY|FLAG TABLE|0|0|21|FLAG TABLE|0|7
+033060|gqisFlagQual|table|GQISFLAGQUAL - INDIVIDUAL IASI-SYSTEM QUALITY FLAG|CODE TABLE|0|0|2|CODE TABLE|0|1
+033061|gqisQualIndex|long|GQISQUALINDEX - INDICATOR FOR INSTRUMENT NOISE PERFORMANCE (CONTRIBUTIONS FROM SPECTRAL AND RADIOMETRIC CALIBRATION)|%|0|0|7|%|0|3
+033062|gqisQualIndexLoc|long|GQISQUALINDEXLOC - INDICATOR FOR GEOMETRIC QUALITY INDEX|%|0|0|7|%|0|3
+033063|gqisQualIndexRad|long|GQISQUALINDEXRAD - INDICATOR FOR INSTRUMENT NOISE PERFORMANCE (CONTRIBUTIONS FROM RADIOMETRIC CALIBRATION)|%|0|0|7|%|0|3
+033064|gqisQualIndexSpect|long|GQISQUALINDEXSPECT - INDICATOR FOR INSTRUMENT NOISE PERFORMANCE (CONTRIBUTIONS FROM SPECTRAL CALIBRATION)|%|0|0|7|%|0|3
+033065|gqisSysTecQual|long|GQISSYSTECSONDQUAL - OUTPUT OF SYSTEM TEC (TECHNICAL EXPERTISE CENTRE) QUALITY FUNCTION|Numeric|0|0|24|Numeric|0|8
+033070|totalOzoneQuality|table|TOTAL OZONE QUALITY|CODE TABLE|0|0|4|CODE TABLE|0|2
+033071|profileOzoneQuality|table|PROFILE OZONE QUALITY|CODE TABLE|0|0|4|CODE TABLE|0|2
+033072|ozoneError|table|OZONE ERROR|CODE TABLE|0|0|5|CODE TABLE|0|2
+033075|scanLevelQualityFlags|flag|SCAN-LEVEL QUALITY FLAGS|FLAG TABLE|0|0|13|FLAG TABLE|0|5
+033076|calibrationQualityFlags|flag|CALIBRATION QUALITY FLAGS|FLAG TABLE|0|0|9|FLAG TABLE|0|3
+033077|fieldOfViewQualityFlags|flag|FIELD-OF-VIEW QUALITY FLAGS|FLAG TABLE|0|0|19|FLAG TABLE|0|7
+033078|geolocationQuality|table|GEOLOCATION QUALITY|CODE TABLE|0|0|4|CODE TABLE|0|2
+033079|granuleLevelQualityFlags|flag|GRANULE LEVEL QUALITY FLAGS|FLAG TABLE|0|0|16|FLAG TABLE|0|6
+033080|scanLevelQualityFlags|flag|SCAN LEVEL QUALITY FLAGS|FLAG TABLE|0|0|20|FLAG TABLE|0|7
+033081|channelDataQualityFlags|flag|CHANNEL DATA QUALITY FLAGS|FLAG TABLE|0|0|12|FLAG TABLE|0|4
+033082|geolocationQualityFlags|flag|GEOLOCATION QUALITY FLAGS|FLAG TABLE|0|0|16|FLAG TABLE|0|6
+033083|radianceDataQualityFlags|flag|RADIANCE DATA QUALITY FLAGS|FLAG TABLE|0|0|16|FLAG TABLE|0|6
+033084|pixelLevelQualityFlags|flag|PIXEL LEVEL QUALITY FLAGS|FLAG TABLE|0|0|16|FLAG TABLE|0|6
+033085|aerosolOpticalThicknessQualityFlags|flag|AEROSOL OPTICAL THICKNESS QUALITY FLAGS|FLAG TABLE|0|0|18|FLAG TABLE|0|6
+033086|qualityOfPixelLevelRetrieval|table|QUALITY OF PIXEL LEVEL RETRIEVAL|CODE TABLE|0|0|3|CODE TABLE|0|1
+033087|extentOfSatelliteWithinSouthAtlanticAnomalyBasedOnClimatologicalData|table|EXTENT OF SATELLITE WITHIN SOUTH ATLANTIC ANOMALY (BASED ON CLIMATOLOGICAL DATA)|CODE TABLE|0|0|4|CODE TABLE|0|1
+033088|ozoneTotalColumnQualityFlag|flag|OZONE TOTAL COLUMN QUALITY FLAG|FLAG TABLE|0|0|18|FLAG TABLE|0|6
+033089|noiseEquivalentDeltaTemperatureNedtQualityIndicatorsForWarmTargetCalibration|double|NOISE EQUIVALENT DELTA TEMPERATURE (NEDT) QUALITY INDICATORS FOR WARM TARGET CALIBRATION|K|2|0|12|K|2|4
+033090|nedtQualityIndicatorsForColdTargetCalibration|double|NEDT QUALITY INDICATORS FOR COLD TARGET CALIBRATION|K|2|0|12|K|2|4
+033091|nedtQualityIndicatorsForOverallCalibration|double|NEDT QUALITY INDICATORS FOR OVERALL CALIBRATION|K|2|0|12|K|2|4
+035000|fmAndRegionalCodeNumber|table|FM AND REGIONAL CODE NUMBER|CODE TABLE|0|0|10|CODE TABLE|0|3
+035001|timeFrameForMonitoring|table|TIME FRAME FOR MONITORING|CODE TABLE|0|0|3|CODE TABLE|0|1
+035011|numberOfReportsActuallyReceived|long|NUMBER OF REPORTS ACTUALLY RECEIVED|Numeric|0|0|14|Numeric|0|4
+035021|bulletinBeingMonitoredTtaaii|string|BULLETIN BEING MONITORED (TTAAII)|CCITT IA5|0|0|48|Character|0|6
+035022|bulletinBeingMonitoredYygggg|string|BULLETIN BEING MONITORED (YYGGGG)|CCITT IA5|0|0|48|Character|0|6
+035023|bulletinBeingMonitoredCccc|string|BULLETIN BEING MONITORED (CCCC)|CCITT IA5|0|0|32|Character|0|4
+035024|bulletinBeingMonitoredBbb|string|BULLETIN BEING MONITORED (BBB)|CCITT IA5|0|0|24|Character|0|3
+035030|discrepanciesInAvailabilityOfExpectedData|table|DISCREPANCIES IN THE AVAILABILITY OF EXPECTED DATA|CODE TABLE|0|0|4|CODE TABLE|0|1
+035031|qualifierOnMonitoringResults|table|QUALIFIER ON MONITORING RESULTS|CODE TABLE|0|0|7|CODE TABLE|0|2
+035032|causeOfMissingData|table|CAUSE OF MISSING DATA|CODE TABLE|0|0|4|CODE TABLE|0|1
+035033|observationAndCollectionDeficiencies|table|OBSERVATION AND COLLECTION DEFICIENCIES|CODE TABLE|0|0|7|CODE TABLE|0|2
+035034|statisticalTrendsForAvailabilityOfDataDuringSurveyPeriods|table|STATISTICAL TRENDS FOR AVAILABILITY OF DATA (DURING THE SURVEY PERIOD(S))|CODE TABLE|0|0|3|CODE TABLE|0|1
+035035|reasonForTermination|table|REASON FOR TERMINATION|CODE TABLE|0|0|5|CODE TABLE|0|2
+040001|surfaceSoilMoisture|double|SURFACE SOIL MOISTURE (MS)|%|1|0|10|%|1|4
+040002|estimatedErrorInSurfaceSoilMoisture|double|ESTIMATED ERROR IN SURFACE SOIL MOISTURE|%|1|0|10|%|1|4
+040003|meanSurfaceSoilMoisture|long|MEAN SURFACE SOIL MOISTURE|Numeric|3|0|10|Numeric|3|4
+040004|rainFallDetection|long|RAIN FALL DETECTION|Numeric|3|0|10|Numeric|3|4
+040005|soilMoistureCorrectionFlag|flag|SOIL MOISTURE CORRECTION FLAG|FLAG TABLE|0|0|8|FLAG TABLE|0|3
+040006|soilMoistureProcessingFlag|flag|SOIL MOISTURE PROCESSING FLAG|FLAG TABLE|0|0|16|FLAG TABLE|0|6
+040007|soilMoistureQuality|double|SOIL MOISTURE QUALITY|%|1|0|10|%|1|4
+040008|frozenLandSurfaceFraction|double|FROZEN LAND SURFACE FRACTION|%|1|0|10|%|1|4
+040009|inundationAndWetlandFraction|double|INUNDATION AND WETLAND FRACTION|%|1|0|10|%|1|4
+040010|topographicComplexity|double|TOPOGRAPHIC COMPLEXITY|%|1|0|10|%|1|4
+040011|interpolationFlag|flag|INTERPOLATION FLAG|FLAG TABLE|0|0|8|FLAG TABLE|0|3
+040012|radiometerDataQualityFlag|flag|RADIOMETER DATA QUALITY FLAG|FLAG TABLE|0|0|8|FLAG TABLE|0|3
+040013|radiometerBrightnessTemperatureInterpretationFlag|table|RADIOMETER BRIGHTNESS TEMPERATURE INTERPRETATION FLAG|CODE TABLE|0|0|3|CODE TABLE|0|1
+040014|highFrequencyFluctuationsOfSeaSurfaceTopographyCorrection|double|HIGH-FREQUENCY FLUCTUATIONS OF THE SEA-SURFACE TOPOGRAPHY CORRECTION|m|4|-3000|13|m|4|4
+040015|normalizedDifferentialVegetationIndex|long|NORMALIZED DIFFERENTIAL VEGETATION INDEX (NDVI)|Numeric|2|-100|8|Numeric|2|3
+040016|residualRmsInBand|long|RESIDUAL RMS IN BAND|Numeric|3|0|14|Numeric|3|5
+040017|nonNormalizedPrincipalComponentScore|long|NON-NORMALIZED PRINCIPAL COMPONENT SCORE|Numeric|0|-1073741824|31|Numeric|0|10
+040018|averageOfImagerMeasurements|double|GIACAVGIMAGIIS - AVERAGE OF IMAGER MEASUREMENTS|W m-2 sr-1 m|6|0|24|W m-2 sr-1 m|6|8
+040019|giacvarimagiisVarianceOfImagerMeasurements|double|GIACVARIMAGIIS - VARIANCE OF IMAGER MEASUREMENTS|W m-2 sr-1 m|6|0|24|W m-2 sr-1 m|6|8
+040020|gqisFlagQualDetailed|flag|GQISFLAGQUALDETAILED - QUALITY FLAG FOR THE SYSTEM|FLAG TABLE|0|0|17|FLAG TABLE|0|6
+040021|fractionOfWeightedAvhrrPixelInIasiFovCoveredWithSnowOrIce|long|FRACTION OF WEIGHTED AVHRR PIXEL IN IASI FOV COVERED WITH SNOW/ICE|%|0|0|7|%|0|3
+040022|numberOfMissingBadOrFailedAvhrrPixels|long|NUMBER OF MISSING, BAD OR FAILED AVHRR PIXELS|Numeric|0|0|7|Numeric|0|3
+040023|auxiliaryAltimeterStateFlags|flag|AUXILIARY ALTIMETER STATE FLAGS|FLAG TABLE|0|0|5|FLAG TABLE|0|2
+040024|meteorologicalMapAvailability|table|METEOROLOGICAL MAP AVAILABILITY|CODE TABLE|0|0|3|CODE TABLE|0|1
+040025|interpolationFlagForMeanDiurnalTide|table|INTERPOLATION FLAG FOR MEAN DIURNAL TIDE|CODE TABLE|0|0|2|CODE TABLE|0|1
+040026|scoreQuantizationFactor|long|SCORE QUANTIZATION FACTOR|Numeric|2|0|16|Numeric|2|5
+040027|sunGlintAngle|double|SUN GLINT ANGLE|deg|2|-18000|16|deg|2|5
+040028|gmiQualityFlag|table|GMI QUALITY FLAG|CODE TABLE|0|0|4|CODE TABLE|0|2
+040029|horizontalObservationIntegrationLength|long|HORIZONTAL OBSERVATION INTEGRATION LENGTH|m|0|0|26|m|0|8
+040030|horizontalLineOfSightWind|double|HORIZONTAL LINE OF SIGHT WIND|m/s|2|-32767|16|m/s|2|5
+040031|errorEstimateOfHorizontalLineOfSightWind|double|ERROR ESTIMATE OF HORIZONTAL LINE OF SIGHT WIND|m/s|2|0|15|m/s|2|5
+040032|derivativeWindToPressure|double|DERIVATIVE WIND TO PRESSURE|m s-1 Pa-1|3|-100000|18|m s-1 Pa-1|3|6
+040033|derivativeWindToTemperature|double|DERIVATIVE WIND TO TEMPERATURE|m s-1 K-1|3|-100000|18|m s-1 K-1|3|6
+040034|derivativeWindToBackscatterRatio|double|DERIVATIVE WIND TO BACKSCATTER RATIO|m/s|3|-200000|19|m/s|3|6
+040035|satelliteRange|long|SATELLITE RANGE|m|0|380000|18|m|0|6
+040036|lidarL2bClassificationType|table|LIDAR L2B CLASSIFICATION TYPE|CODE TABLE|0|0|4|CODE TABLE|0|2
+040037|backscatterRatio|long|BACKSCATTER RATIO|Numeric|3|500|20|Numeric|3|7
+040039|singleLookComplexImageIntensity|long|SINGLE LOOK COMPLEX IMAGE INTENSITY|Numeric|0|-25|5|Numeric|0|3
+040040|singleLookComplexImageSkewness|long|SINGLE LOOK COMPLEX IMAGE SKEWNESS|Numeric|2|1|13|Numeric|0|4
+040041|singleLookComplexImageKurtosis|long|SINGLE LOOK COMPLEX IMAGE KURTOSIS|Numeric|2|1|13|Numeric|0|4
+040042|singleLookComplexImageVariance|long|SINGLE LOOK COMPLEX IMAGE VARIANCE|Numeric|2|1|13|Numeric|0|4
+041001|pco2|double|PCO2|Pa|3|0|18|Pa|3|6
+041002|fluorescence|double|FLUORESCENCE|kg l-1|12|0|16|kg l-1|12|5
+041003|dissolvedNitrates|double|DISSOLVED NITRATES|umol/kg|3|0|17|umol/kg|3|5
+041005|turbidity|double|TURBIDITY|NTU|2|0|12|NTU|2|4
+042001|dominantSwellWaveDirectionOfSpectralPartition|long|DOMINANT SWELL WAVE DIRECTION OF SPECTRAL PARTITION|deg|0|0|9|deg|0|3
+042002|significantSwellWaveHeightOfSpectralPartition|double|SIGNIFICANT SWELL WAVE HEIGHT OF SPECTRAL PARTITION|m|1|0|9|m|1|3
+042003|dominantSwellWavelengthOfSpectralPartition|double|DOMINANT SWELL WAVELENGTH OF SPECTRAL PARTITION|m|2|100|17|m|2|6
+042004|confidenceOfInversionForEachPartitionOfSwellWaveSpectra|table|CONFIDENCE OF INVERSION FOR EACH PARTITION OF SWELL WAVE SPECTRA|CODE TABLE|0|0|4|CODE TABLE|0|2
+042005|ambiguityRemovalFactorForSwellWavePartition|long|AMBIGUITY REMOVAL FACTOR FOR SWELL WAVE PARTITION|Numeric|5|-100000|18|Numeric|5|6
+042006|waveAge|long|WAVE AGE|Numeric|2|1|8|Numeric|2|3
+042007|shortestOceanWavelengthOnSpectralResolution|double|SHORTEST OCEAN WAVELENGTH ON SPECTRAL RESOLUTION|m|2|0|16|m|2|5
+042008|nonlinearInverseSpectralWidth|double|NONLINEAR INVERSE SPECTRAL WIDTH|m|2|0|16|m|2|5
+042009|binPartitionReference|long|BIN PARTITION REFERENCE|Numeric|0|0|8|Numeric|0|3
+042010|partitionNumber|long|PARTITION NUMBER|Numeric|0|1|4|Numeric|0|2
diff --git a/definitions/bufr/tables/0/wmo/27/sequence.def b/definitions/bufr/tables/0/wmo/27/sequence.def
new file mode 100644
index 0000000..26a604d
--- /dev/null
+++ b/definitions/bufr/tables/0/wmo/27/sequence.def
@@ -0,0 +1,963 @@
+"300002" = [  000002, 000003 ]
+"300003" = [  000010, 000011, 000012 ]
+"300004" = [  300003, 000013, 000014, 000015, 000016, 000017, 000018, 000019, 000020 ]
+"300010" = [  300003, 101000, 031001, 000030 ]
+"300015" = [  000030, 102000, 031002, 000024, 000025 ]
+"300016" = [  000030, 102000, 031001, 000026, 000027 ]
+"301001" = [  001001, 001002 ]
+"301002" = [  001003, 001004, 001005 ]
+"301003" = [  001011, 001012, 001013 ]
+"301004" = [  001001, 001002, 001015, 002001 ]
+"301005" = [  001035, 001034 ]
+"301011" = [  004001, 004002, 004003 ]
+"301012" = [  004004, 004005 ]
+"301013" = [  004004, 004005, 004006 ]
+"301014" = [  102002, 301011, 301012 ]
+"301018" = [  001114, 025185, 025186 ]
+"301021" = [  005001, 006001 ]
+"301022" = [  005001, 006001, 007001 ]
+"301023" = [  005002, 006002 ]
+"301024" = [  005002, 006002, 007001 ]
+"301025" = [  301023, 004003, 301012 ]
+"301026" = [  301021, 004003, 004003, 004004, 004004, 004005, 004005 ]
+"301027" = [  008007, 101000, 031001, 301028, 008007 ]
+"301028" = [  008040, 033042, 007010, 101000, 031002, 301023, 019007, 008040 ]
+"301029" = [  001018, 002001, 301011 ]
+"301030" = [  001018, 002001, 301011, 301024 ]
+"301031" = [  301001, 002001, 301011, 301012, 301022 ]
+"301032" = [  301001, 002001, 301011, 301012, 301024 ]
+"301033" = [  001005, 002001, 301011, 301012, 301021 ]
+"301034" = [  001005, 002001, 301011, 301012, 301023 ]
+"301035" = [  001005, 001012, 001013, 002001, 301011, 301012, 301023 ]
+"301036" = [  301003, 002001, 301011, 301012, 301023 ]
+"301037" = [  301001, 002011, 002012, 301011, 301012, 301022 ]
+"301038" = [  301001, 002011, 002012, 301011, 301012, 301024 ]
+"301039" = [  301003, 002011, 002012, 301011, 301012, 301023 ]
+"301040" = [  301003, 002011, 002012, 301011, 301012, 301024 ]
+"301041" = [  001007, 002021, 002022, 301011, 301012 ]
+"301042" = [  301041, 301021 ]
+"301043" = [  001007, 002023, 301011, 301013, 301021 ]
+"301044" = [  001007, 002024, 301011, 301013, 301021 ]
+"301045" = [  301011, 301012, 201138, 202131, 004006, 201000, 202000, 304030, 304031 ]
+"301046" = [  001007, 001012, 002048, 021119, 025060, 202124, 002026, 002027, 202000, 005040
+               ]
+"301047" = [  001007, 025060, 001033, 001034, 001012, 301045, 002021, 301011, 301012, 201138,
+               202131, 004006, 201000, 202000, 301023 ]
+"301048" = [  002104, 002121, 002113, 002026, 002027, 002111, 002140, 202127, 001013, 202126,
+               007001, 202000, 025010, 021064 ]
+"301049" = [  002111, 002112, 021062, 021063, 021065 ]
+"301051" = [  001006, 002061, 301011, 301012, 301021, 008004 ]
+"301055" = [  001005, 002001, 301011, 301012, 301021, 001012, 001014 ]
+"301058" = [  301011, 301012, 201152, 202135, 004006, 202000, 201000, 301021, 020111, 020112,
+               020113, 020114, 020115, 020116, 020117, 020118, 020119, 025035, 020121, 020122,
+               020123, 020124, 025175, 020023, 025063, 202136, 201136, 002121, 201000, 202000,
+               025061, 002184, 002189, 025036, 101000, 031002, 301059 ]
+"301059" = [  301021, 007030, 007032 ]
+"301062" = [  101000, 031001, 301001 ]
+"301065" = [  001006, 001008, 002001, 002002, 002005, 002062, 002070, 002065 ]
+"301066" = [  301011, 301013, 301023, 007004, 002064, 008004 ]
+"301070" = [  002143, 002142, 002144 ]
+"301071" = [  001007, 001031, 002020, 002028, 002029 ]
+"301072" = [  301071, 301011, 301013, 301021 ]
+"301074" = [  002143, 002142, 002145, 002146 ]
+"301075" = [  301001, 001015, 301024, 008021, 301011, 301012 ]
+"301076" = [  002011, 002143, 002142 ]
+"301089" = [  001101, 001102 ]
+"301090" = [  301004, 301011, 301012, 301021, 007030, 007031 ]
+"301091" = [  002180, 002181, 002182, 002183, 002184, 002179, 002186, 002187, 002188, 002189
+               ]
+"301092" = [  001011, 001003, 002001, 301011, 301012, 301021, 007030, 007031, 033024 ]
+"301093" = [  301036, 007030, 007031 ]
+"301110" = [  301001, 001011, 002011, 002014, 002003 ]
+"301111" = [  301001, 001011, 002011, 002013, 002014, 002003 ]
+"301112" = [  001006, 002011, 002013, 002014, 002003 ]
+"301113" = [  008021, 301011, 301013 ]
+"301114" = [  301021, 007030, 007031, 007007, 033024 ]
+"301120" = [  301001, 001094, 002011, 301121 ]
+"301121" = [  008041, 301122, 301021, 007031, 007007 ]
+"301122" = [  301011, 301012, 201135, 202130, 004006, 202000, 201000 ]
+"301123" = [  102002, 008041, 001062, 301001, 001094, 002011, 001018, 001095, 025061, 025068,
+               001082, 001083, 001081, 002067, 002066, 002014, 025067, 025065, 025066, 002095,
+               002096, 002097, 002016, 002083, 002080, 002081, 001093, 002084, 002085, 002086,
+               002082, 008041, 301011 ]
+"301125" = [  001033, 001034, 025060, 001007, 002019, 001012 ]
+"301126" = [  001087, 001015, 002149, 301011, 301012, 301021 ]
+"301128" = [  001081, 001082, 001083, 001095, 002015, 002016, 002017, 002066, 002067, 002080,
+               002081, 002082, 002083, 002084, 002085, 002086, 002095, 002096, 002097, 002103,
+               002191, 025061, 035035 ]
+"302001" = [  010004, 010051, 010061, 010063 ]
+"302002" = [  010004, 007004, 010003, 010061, 010063 ]
+"302003" = [  011011, 011012, 012004, 012006, 013003, 020001, 020003, 020004, 020005 ]
+"302004" = [  020010, 008002, 020011, 020013, 020012, 020012, 020012 ]
+"302005" = [  008002, 020011, 020012, 020013 ]
+"302006" = [  010004, 010051, 010062, 010063 ]
+"302011" = [  302001, 302003, 302004 ]
+"302012" = [  302002, 302003, 302004 ]
+"302013" = [  302006, 302003, 101000, 031001, 302005 ]
+"302021" = [  022001, 022011, 022021 ]
+"302022" = [  022002, 022012, 022022 ]
+"302023" = [  022003, 022013, 022023 ]
+"302024" = [  302022, 101002, 302023 ]
+"302031" = [  302001, 010062, 007004, 010009 ]
+"302032" = [  007032, 012101, 012103, 013003 ]
+"302033" = [  007032, 020001 ]
+"302034" = [  007032, 013023 ]
+"302035" = [  302032, 302033, 302034, 007032, 302004, 101000, 031001, 302005 ]
+"302036" = [  105000, 031001, 008002, 020011, 020012, 020014, 020017 ]
+"302037" = [  020062, 013013, 012113 ]
+"302038" = [  020003, 004024, 020004, 020005 ]
+"302039" = [  004024, 014031 ]
+"302040" = [  007032, 102002, 004024, 013011 ]
+"302041" = [  007032, 004024, 004024, 012111, 004024, 004024, 012112 ]
+"302042" = [  007032, 002002, 008021, 004025, 011001, 011002, 008021, 103002, 004025, 011043,
+               011041 ]
+"302043" = [  302038, 101002, 302039, 302040, 302041, 302042, 007032 ]
+"302044" = [  004024, 002004, 013033 ]
+"302045" = [  004024, 014002, 014004, 014016, 014028, 014029, 014030 ]
+"302046" = [  004024, 004024, 012049 ]
+"302047" = [  102003, 008002, 020054 ]
+"302048" = [  005021, 007021, 020012, 005021, 007021 ]
+"302049" = [  008002, 020011, 020013, 020012, 020012, 020012, 008002 ]
+"302050" = [  008041, 005021, 007005, 202130, 006021, 202000, 008041, 201131, 202129, 002115,
+               010004, 002115, 013003, 202000, 201000, 002115, 011001, 011002, 002115, 102002,
+               012101, 004024, 002115, 012103, 012102, 101003, 020012, 020011, 020013, 101002,
+               020003 ]
+"302051" = [  010004, 010051, 007004, 010003, 012004, 012051, 012016, 012017, 013004, 102004,
+               008051, 008020 ]
+"302052" = [  007032, 007033, 012101, 002039, 012102, 012103, 013003 ]
+"302053" = [  007032, 007033, 020001 ]
+"302054" = [  302052, 302053, 007033, 302034, 007032, 302004, 101000, 031001, 302005 ]
+"302055" = [  020031, 020032, 020033, 020034, 020035, 020036, 020037, 020038 ]
+"302056" = [  002038, 007063, 022043, 007063 ]
+"302057" = [  302056, 302021, 302024 ]
+"302058" = [  007032, 007033, 004024, 004024, 012111, 004024, 004024, 012112 ]
+"302059" = [  007032, 007033, 002002, 008021, 004025, 011001, 011002, 008021, 103002, 004025,
+               011043, 011041 ]
+"302060" = [  302038, 302040, 302058, 302059 ]
+"302062" = [  025188, 302001, 302093, 101000, 031000, 302053, 007032, 007033, 101000, 031000,
+               302004, 101000, 031001, 302005, 008002, 101000, 031000, 302055, 101000, 031000,
+               302056, 101000, 031000, 302021, 101000, 031000, 302024 ]
+"302063" = [  302038, 101000, 031000, 302040, 101000, 031000, 302034, 007032, 101000, 031000,
+               302058, 101000, 031000, 302064 ]
+"302064" = [  007032, 007033, 002002, 008021, 004025, 011001, 011002, 008021, 103000, 031001,
+               004025, 011043, 011041 ]
+"302066" = [  020023, 020024, 020027, 020054, 020023, 020027, 020054, 020025, 020026, 020027,
+               020040, 020066, 020027, 020021, 020067, 020027 ]
+"302067" = [  001023, 004025, 002177, 101000, 031001, 020003, 103000, 031001, 005021, 020001,
+               005021, 101000, 031000, 302056, 103000, 031000, 033041, 020058, 022061, 101000,
+               031000, 302022, 101000, 031001, 302023, 104000, 031001, 020054, 020137, 020012,
+               020090, 103000, 031001, 020054, 020137, 020136, 004025, 013012, 004025, 011042,
+               104000, 031001, 008021, 004025, 011042, 008021, 115000, 031001, 008021, 004015,
+               008021, 004025, 011001, 011002, 008021, 004015, 008021, 004025, 011001, 011002,
+               008021, 004025, 004015, 103000, 031001, 004025, 004025, 020003, 110000, 031001,
+               004025, 004025, 005021, 005021, 020054, 020024, 020025, 020026, 020027, 020063
+               ]
+"302069" = [  007032, 007033, 033041, 020001 ]
+"302070" = [  007032, 007033, 011001, 011002, 011043, 011041, 011016, 011017 ]
+"302071" = [  007032, 007033, 008021, 004025, 011001, 011002, 008021, 103002, 004025, 011043,
+               011041, 004025, 011016, 011017 ]
+"302072" = [  007032, 007033, 012101, 012103, 013003 ]
+"302073" = [  020010, 105004, 008002, 020011, 020012, 033041, 020013 ]
+"302074" = [  020003, 004025, 020004, 020005 ]
+"302075" = [  008021, 004025, 013055, 013058, 008021 ]
+"302076" = [  020021, 020022, 026020, 020023, 020024, 020025, 020026 ]
+"302077" = [  007032, 007033, 004025, 012111, 012112, 007032, 004025, 012112 ]
+"302078" = [  002176, 020062, 002177, 013013 ]
+"302079" = [  007032, 002175, 002178, 004025, 013011 ]
+"302080" = [  002185, 004025, 013033 ]
+"302081" = [  004025, 014031 ]
+"302082" = [  004025, 014002, 014004, 014016, 014028, 014029, 014030 ]
+"302083" = [  004025, 008023, 010004, 011001, 011002, 012101, 013003, 008023 ]
+"302084" = [  302031, 302072, 103000, 031000, 101005, 307063, 007061, 101000, 031000, 302069,
+               007032, 007033, 105000, 031000, 020031, 020032, 002038, 022043, 302021, 101000,
+               031000, 302078, 012113, 101000, 031000, 302004, 105000, 031001, 008002, 020011,
+               020012, 033041, 020013, 302036, 101000, 031000, 302047, 008002, 101000, 031000,
+               302048 ]
+"302085" = [  105000, 031000, 020003, 103002, 004024, 020004, 020005, 101000, 031000, 302175,
+               102000, 031000, 004025, 302076, 102000, 031000, 004025, 013059, 007032, 007033,
+               008021, 004025, 011001, 011002, 008021, 103003, 004025, 011043, 011041, 004025,
+               011016, 011017, 302077, 007033, 302041, 106000, 031000, 007032, 002175, 002178,
+               102005, 004024, 013011, 007032, 103000, 031000, 002185, 101002, 302044, 102000,
+               031000, 101002, 302039, 102000, 031000, 101002, 302045, 101000, 031000, 302046,
+               101000, 031000, 302083 ]
+"302089" = [  020101, 020102, 020103, 020104, 020105, 020106, 020107, 020108 ]
+"302090" = [  002038, 007063, 022045 ]
+"302091" = [  020001, 004024, 013011 ]
+"302092" = [  011104, 001012, 001013, 010038, 010039, 011007, 011008 ]
+"302093" = [  007032, 007033, 303099, 012101, 103000, 031000, 007032, 007033, 303099, 002039,
+               002097, 003024, 003021, 012102, 012103, 013003, 007032, 007033, 303099, 002039,
+               002097, 003021, 003024 ]
+"302175" = [  008021, 004025, 013155, 013058, 008021 ]
+"303001" = [  007003, 011001, 011002 ]
+"303002" = [  007004, 011001, 011002 ]
+"303003" = [  007004, 010003, 012001, 012003 ]
+"303004" = [  007004, 010003, 012001, 012003, 011001, 011002 ]
+"303011" = [  007003, 008001, 011001, 011002 ]
+"303012" = [  007004, 008001, 011001, 011002 ]
+"303013" = [  007004, 008001, 010003, 012001, 013003, 011001, 011002 ]
+"303014" = [  007004, 008001, 010003, 012001, 012003, 011001, 011002 ]
+"303021" = [  007004, 007004, 204007, 031021 ]
+"303022" = [  303021, 010003, 204000 ]
+"303023" = [  303021, 012001, 204000 ]
+"303024" = [  303021, 013016, 204000 ]
+"303025" = [  002025, 204007, 031021, 012063, 204000 ]
+"303026" = [  007004, 008003, 204007, 031021, 012001, 204000 ]
+"303027" = [  007004, 204007, 031021, 010003, 204000 ]
+"303031" = [  007004, 008003, 007021, 007022, 008012, 012061 ]
+"303032" = [  020011, 020016 ]
+"303033" = [  020010, 020016 ]
+"303040" = [  008041, 004025, 004026, 301021, 301122, 201131, 202129, 025069, 007004, 013003,
+               202000, 201000, 002013, 012101, 010009, 102002, 008040, 035035 ]
+"303041" = [  002152, 002023, 007004, 011001, 011002, 002153, 002154, 012071 ]
+"303050" = [  004086, 008042, 007004, 005015, 006015, 011001, 011002 ]
+"303051" = [  004086, 008042, 007004, 005015, 006015, 011061, 011062 ]
+"303052" = [  004086, 008042, 007009, 005015, 006015, 011001, 011002 ]
+"303053" = [  004086, 008042, 007009, 005015, 006015, 011061, 011062 ]
+"303054" = [  004086, 008042, 007004, 010009, 005015, 006015, 012101, 012103, 011001, 011002
+               ]
+"303055" = [  004086, 008042, 007009, 005015, 006015, 012101, 013009, 012103, 011001, 011002
+               ]
+"303099" = [  003005, 003006, 003007, 002096, 003022, 003003, 003020, 003004, 003023, 003008,
+               003009 ]
+"304001" = [  008003, 010004, 012001, 011001, 011002 ]
+"304002" = [  008003, 010004, 011001, 011002 ]
+"304003" = [  008003, 012001 ]
+"304004" = [  008003, 010004, 020010, 012001 ]
+"304005" = [  002024, 007004, 007004, 013003 ]
+"304006" = [  014001, 014001, 014003 ]
+"304011" = [  002163, 002164, 008012, 007024, 002057, 008021, 004001, 004002, 004003, 004004,
+               008021, 004024, 110004, 008021, 004004, 004005, 004006, 008021, 004004, 004005,
+               004006, 011001, 011002, 103010, 002163, 007004, 012001 ]
+"304030" = [  027031, 028031, 010031 ]
+"304031" = [  001041, 001042, 001043 ]
+"304032" = [  002153, 002154, 020081, 020082, 020012 ]
+"304033" = [  002152, 002166, 002167, 002153, 002154, 012075, 012076, 012063 ]
+"304034" = [  102004, 027001, 028001, 007022, 005043, 020010, 020016, 033003, 010040 ]
+"304035" = [  002153, 002154, 012063, 008001, 012063, 008001, 012063, 008001, 008003, 012063,
+               008003, 012063, 008003, 012063, 008003 ]
+"304036" = [  020082, 008012, 020082, 008012, 020081, 008003, 020081, 008003, 020081, 008003,
+               020081, 008003 ]
+"304037" = [  002153, 002154, 012063, 008011, 012063, 008011, 012063, 008011, 008003, 012063,
+               008003, 012063, 008003, 012063 ]
+"305001" = [  011001, 011002, 013060, 013071 ]
+"305002" = [  301012, 012001, 013003, 014051, 013060, 013072, 013080, 013081, 013082, 013083,
+               013084 ]
+"305003" = [  301012, 004065, 101000, 031001, 305001 ]
+"305004" = [  301030, 305002, 305003 ]
+"305006" = [  013072, 013082, 013019, 012001, 013073, 013060 ]
+"305007" = [  301029, 301012, 004065, 101000, 031001, 305006 ]
+"305008" = [  305006, 012030 ]
+"305009" = [  301029, 301012, 004065, 101000, 031001, 305008 ]
+"305010" = [  305008, 002091, 002091 ]
+"305011" = [  301029, 301012, 004065, 101000, 031001, 305010 ]
+"305016" = [  014021, 007004, 013003, 011002, 011001, 011041, 011043 ]
+"305017" = [  013080, 013081, 013083, 013085, 013084 ]
+"305018" = [  301029, 301012, 004065, 103000, 031001, 305008, 305016, 305017 ]
+"306001" = [  002032, 102000, 031001, 007062, 022042 ]
+"306002" = [  002031, 022004, 022031 ]
+"306003" = [  002002, 011011, 011012, 012004 ]
+"306004" = [  002032, 002033, 103000, 031001, 007062, 022043, 022062 ]
+"306005" = [  002031, 103000, 031001, 007062, 022004, 022031 ]
+"306006" = [  306003, 306002, 022063 ]
+"306007" = [  001012, 001014, 306008, 004024, 027003, 028003 ]
+"306008" = [  002034, 002035, 002036 ]
+"306011" = [  301021, 001075, 002147, 301011, 301013 ]
+"306012" = [  002007, 008015, 008032, 306029 ]
+"306013" = [  306012, 301011, 301013, 022120, 022121, 004015, 004065, 102000, 031001, 022038,
+               022040 ]
+"306014" = [  306012, 301011, 301013, 022120, 022121, 004015, 004065, 101000, 031001, 022038
+               ]
+"306016" = [  301011, 301013, 010004, 010051, 302032, 007032, 002002, 008021, 004025, 011001,
+               011002, 004025, 011043, 011041, 025026, 012060 ]
+"306017" = [  002032, 008034, 106000, 031002, 007065, 008080, 033050, 022045, 008080, 033050,
+               008034 ]
+"306018" = [  002032, 008034, 109000, 031002, 007065, 008080, 033050, 022045, 008080, 033050,
+               022064, 008080, 033050, 008034 ]
+"306019" = [  001075, 301011, 301012, 022042, 022120, 022121, 004015, 004065 ]
+"306020" = [  001075, 301011, 301012, 022042, 022120, 022121, 004075, 004065 ]
+"306021" = [  001075, 301011, 301012, 022122, 022123, 012001, 303002 ]
+"306022" = [  001075, 301011, 301012, 022038, 022039 ]
+"306023" = [  001015, 301023, 301011, 301012, 022038, 022039, 022120, 022121 ]
+"306024" = [  306020, 102006, 022038, 022039 ]
+"306025" = [  306019, 102006, 022038, 022039 ]
+"306027" = [  001005, 001052, 002047, 301011, 301013 ]
+"306028" = [  306027, 301011, 301013, 301021 ]
+"306029" = [  025170, 025171, 025172 ]
+"306030" = [  306027, 306029, 111000, 031001, 033002, 301011, 301013, 025025, 025025, 025026,
+               022185, 004015, 004065, 101004, 022182 ]
+"306031" = [  306027, 306029, 001053, 033002, 301011, 301013, 301011, 301013, 022185, 022182,
+               004016, 004066, 101000, 031001, 022184 ]
+"306033" = [  002033, 007063, 022064 ]
+"306034" = [  002031, 003010, 002040, 022005, 022032 ]
+"306035" = [  112000, 031002, 007062, 008080, 033050, 007065, 008080, 033050, 022043, 008080,
+               033050, 022064, 008080, 033050 ]
+"306036" = [  112000, 031002, 007062, 008080, 033050, 007065, 008080, 033050, 022031, 008080,
+               033050, 022004, 008080, 033050 ]
+"306037" = [  109000, 031002, 007062, 008080, 033050, 007065, 008080, 033050, 022188, 008080,
+               033050 ]
+"306038" = [  010004, 010051, 007033, 012101, 012103, 013003, 007033, 008021, 004025, 011001,
+               011002, 008021, 004025, 011041, 004025, 007033, 002005, 007063, 022049 ]
+"306039" = [  022078, 022070, 022073, 022074, 022071, 022076, 022077 ]
+"306040" = [  022078, 022082, 106000, 031001, 022080, 022069, 022086, 022087, 022088, 022089
+               ]
+"306041" = [  002032, 102000, 031001, 007062, 022043 ]
+"306042" = [  002169, 007033, 008021, 004025, 011001, 011002 ]
+"306043" = [  041001, 008043, 015028, 008043, 013080, 041005, 041003, 022188, 041002, 106000,
+               031000, 004024, 014002, 014002, 014012, 014004, 004024 ]
+"307001" = [  301031, 302011 ]
+"307002" = [  301032, 302011 ]
+"307003" = [  307001, 101000, 031001, 302005 ]
+"307004" = [  307002, 101000, 031001, 302005 ]
+"307005" = [  307001, 101004, 302005 ]
+"307006" = [  307002, 101004, 302005 ]
+"307007" = [  301031, 302012 ]
+"307008" = [  301032, 302012 ]
+"307009" = [  301031, 302013 ]
+"307011" = [  001063, 002001, 301011, 301012, 301024, 007006, 011001, 011016, 011017, 011002,
+               011041, 007006, 012001, 012003, 010052, 020009 ]
+"307012" = [  103000, 031001, 008023, 005021, 020001 ]
+"307013" = [  106000, 031001, 001064, 008014, 020061, 008014, 020061, 020018 ]
+"307014" = [  101000, 031001, 020019 ]
+"307015" = [  101000, 031001, 302005, 020002 ]
+"307016" = [  101000, 031001, 020020 ]
+"307017" = [  101000, 031001, 011070 ]
+"307018" = [  008016, 102000, 031001, 008017, 301012, 104000, 031001, 007006, 011001, 011002,
+               011041, 020009, 101000, 031001, 020001, 307014 ]
+"307020" = [  307011, 307014, 307016 ]
+"307021" = [  307011, 307012, 307013, 307014, 307015, 307016, 307017, 307018, 307015 ]
+"307022" = [  001015, 301011, 301012, 301022, 008021, 004025, 010004, 012001, 013003, 033038,
+               008022, 106025, 002020, 001050, 005021, 007021, 015031, 015032, 008060, 015033,
+               015034, 008060, 015033, 015034, 015035, 201131, 202129, 013016, 202000, 201000,
+               015011 ]
+"307030" = [  015001, 015002 ]
+"307031" = [  008022, 008023, 015001, 008023, 015001, 008023, 015002 ]
+"307041" = [  301001, 001015, 301024, 301011, 301012, 301070, 307030 ]
+"307042" = [  301001, 001015, 301024, 301011, 301012, 008021, 004025, 301070, 307031 ]
+"307043" = [  301001, 001015, 301024, 301011, 301012, 301074, 307030 ]
+"307044" = [  301001, 001015, 301024, 301011, 301012, 008021, 004025, 301074, 307031 ]
+"307045" = [  001063, 008079, 002001, 301011, 301012, 301023, 007030, 007031, 007032, 011001,
+               011016, 011017, 008054, 011083, 011084, 011002, 008054, 011085, 011086, 011041,
+               008054, 007032, 012023, 012024, 007032, 010052, 020009 ]
+"307046" = [  020060, 102000, 031001, 005021, 020059 ]
+"307047" = [  105000, 031001, 008002, 020011, 020012, 020013, 020092, 020002, 020091 ]
+"307048" = [  008016, 102000, 031001, 008017, 301012, 112000, 031000, 007032, 011001, 008054,
+               011083, 011084, 011002, 008054, 011085, 011086, 011041, 008054, 007032, 020009,
+               101000, 031000, 020060, 307014, 307047 ]
+"307049" = [  102000, 031000, 022043, 022021 ]
+"307050" = [  101000, 031000, 020085, 102000, 031001, 001064, 020085, 105000, 031001, 001064,
+               020086, 020087, 020088, 020089 ]
+"307051" = [  307045, 307046, 307013, 307014, 307047, 307016, 307017, 307049, 307050, 101000,
+               031001, 307048 ]
+"307052" = [  001063, 008039, 301011, 301012, 008079, 008039, 301011, 301012, 008039, 301011,
+               301012, 301023, 007030, 007031 ]
+"307053" = [  007032, 011001, 008054, 011083, 011084, 011002, 008054, 011085, 011086, 011041,
+               008054, 007032, 020009, 020060, 307014, 307047 ]
+"307054" = [  007032, 008039, 004003, 004004, 008023, 012023, 008039, 004003, 004004, 008023,
+               012023, 008023, 007032 ]
+"307055" = [  033045, 008016, 008039, 004003, 301012, 008039, 004003, 301012, 307053 ]
+"307056" = [  307052, 307053, 307054, 101000, 031001, 307055 ]
+"307060" = [  007061, 012030 ]
+"307061" = [  301031, 101005, 307060 ]
+"307062" = [  301032, 101005, 307060 ]
+"307063" = [  007061, 012130 ]
+"307071" = [  301090, 004074, 004023, 008023, 010004, 010051, 007004, 010009, 007032, 012101,
+               002051, 004051, 012118, 004052, 012119, 013004, 008023, 012151, 007032, 102005,
+               008050, 008020, 014032, 014033, 008050, 008020, 102018, 008052, 008022, 007032,
+               008053, 004003, 012152, 008053, 004003, 012153, 008053, 004003, 008023, 012101,
+               008053, 004003, 008023, 012101, 008023, 007032, 002002, 008053, 004003, 011046,
+               008053, 004003, 004004, 004023, 007032, 013060, 013051, 004053, 008050, 008020,
+               102006, 008052, 008022, 008053, 004003, 013052, 007032 ]
+"307072" = [  004001, 004001, 004002, 004003, 004004, 004074, 004022, 008023, 010004, 010051,
+               007004, 010009, 007032, 012101, 002051, 004051, 012118, 004052, 012119, 013004,
+               012151, 007032, 014032, 008023, 004001, 004001, 004002, 004003, 004004, 004022,
+               007032, 008023, 013060, 004053, 008023, 102008, 008050, 008020 ]
+"307073" = [  307071, 307072 ]
+"307074" = [  301001, 004001, 004002, 301021, 007030, 007032, 112000, 031001, 004003, 004004,
+               004024, 102003, 008023, 012101, 008023, 004004, 004024, 013060, 013012, 013013
+               ]
+"307076" = [  301090, 004074, 004023, 008023, 010004, 010051, 007004, 010009, 007032, 012101,
+               002051, 004051, 012118, 004052, 012119, 013004, 008023, 012151, 007032, 102005,
+               008050, 008020, 014032, 014033, 008050, 008020, 102018, 008052, 008022, 007032,
+               008053, 004003, 012152, 008053, 004003, 012153, 008053, 004003, 008023, 012101,
+               008053, 004003, 008023, 012101, 008023, 007032, 002002, 008053, 004003, 011046,
+               008053, 004003, 004004, 004074, 004023, 007032, 013060, 013051, 004053, 008050,
+               008020, 102006, 008052, 008022, 008053, 004003, 013052, 007032 ]
+"307077" = [  004001, 004001, 004002, 004003, 004004, 004074, 004022, 008023, 010004, 010051,
+               007004, 010009, 007032, 012101, 002051, 004051, 012118, 004052, 012119, 013004,
+               012151, 007032, 014032, 008023, 004001, 004001, 004002, 004003, 004004, 004074,
+               004022, 007032, 008023, 013060, 004053, 008023, 102008, 008050, 008020 ]
+"307078" = [  307076, 307077 ]
+"307079" = [  301090, 302031, 302035, 302036, 101000, 031000, 302047, 008002, 101000, 031000,
+               302048, 302037, 102000, 031000, 022061, 020058, 101000, 031000, 302056, 101000,
+               031000, 302055, 302043, 302044, 101000, 031001, 302045, 101000, 031000, 302046
+               ]
+"307080" = [  301090, 302031, 302035, 302036, 302047, 008002, 302048, 302037, 302043, 302044,
+               101002, 302045, 302046 ]
+"307081" = [  301090, 302031, 302035, 302036, 302047, 008002, 302048, 302037, 012122, 013056,
+               013057, 020101, 020102, 020103, 020104, 020105, 020106, 020107, 020108, 302043,
+               302044, 101002, 302045, 302046 ]
+"307082" = [  301090, 302031, 302035, 302036, 302047, 008002, 302048, 302037, 012121, 012122,
+               302043, 302044, 101002, 302045, 302046 ]
+"307083" = [  301090, 302031, 302035, 302036, 302047, 008002, 302048, 302037, 012122, 302043,
+               302044, 101002, 302045, 302046 ]
+"307084" = [  301090, 302031, 302035, 302036, 302047, 008002, 302048, 302037, 020055, 101000,
+               031001, 205001, 302043, 302044, 101002, 302045, 302046 ]
+"307086" = [  301090, 302031, 302035, 302036, 008002, 302037, 302066, 302043, 302044, 101002,
+               302045 ]
+"307087" = [  301001, 002001, 301011, 301012, 301023, 007030, 007031, 302001, 010062, 007004,
+               010009, 007032, 012101, 012103, 013003, 007032, 020001, 302004, 101000, 031001,
+               302005 ]
+"307088" = [  020003, 004024, 020004, 020005, 004024, 002004, 013033, 102002, 004024, 014031,
+               102002, 004024, 013011, 007032, 004024, 012111, 004024, 012112, 007032, 002002,
+               008021, 004025, 011001, 011002, 008021 ]
+"307089" = [  307087, 307088 ]
+"307090" = [  301092, 302031, 302035, 302036, 302047, 008002, 302048, 302037, 302043, 302044,
+               101002, 302045, 302046 ]
+"307091" = [  301089, 301090, 008010, 301091, 302001, 007004, 010009, 302072, 103000, 031000,
+               101005, 307063, 007061, 101000, 031000, 302069, 007032, 007033, 105000, 031000,
+               020031, 020032, 002038, 022043, 302021, 101000, 031000, 302078, 101000, 031000,
+               302073, 101000, 031000, 302074, 101000, 031000, 302175, 102000, 031000, 004025,
+               302076, 302071, 302077, 007033, 101000, 031000, 302079, 007032, 101000, 031000,
+               302080, 101000, 031000, 302081, 101000, 031000, 302082, 102000, 031000, 004025,
+               013059, 101000, 031000, 302083, 033005, 033006 ]
+"307096" = [  301090, 301089, 008010, 301091, 302084, 302085, 033005, 033006 ]
+"307101" = [  301089, 001019, 002001, 301011, 301012, 301021, 007030, 007032, 012101, 007032,
+               002177, 020062, 013013 ]
+"307102" = [  301089, 001018, 001015, 001104, 001105, 001106, 003017, 003018, 003019, 301011,
+               301012, 301021, 007030, 007032, 012101, 012103, 013003, 007032, 020001, 109000,
+               031001, 003016, 012128, 102000, 031001, 007061, 012129, 007061, 013116, 020138,
+               004025, 020024, 013055, 020021, 013011, 007032, 008021, 004025, 011001, 011002,
+               008021, 004025, 011043, 011041, 033005 ]
+"307182" = [  301090, 302031, 302035, 302036, 302047, 008002, 302048, 302037, 012120, 012122,
+               302043, 302044, 101002, 302045, 302046 ]
+"308001" = [  301033, 302011, 022042 ]
+"308002" = [  301034, 302011, 022042 ]
+"308003" = [  301035, 302011, 022042 ]
+"308004" = [  301036, 302011, 022042 ]
+"308005" = [  308004, 302024 ]
+"308006" = [  010004, 010061, 010063, 011001, 011002, 012004, 013003, 022042 ]
+"308007" = [  301055, 302011, 007062, 022042 ]
+"308009" = [  301093, 302001, 302054, 008002, 302055, 302057, 302060 ]
+"308010" = [  001011, 113000, 031001, 301011, 301012, 301021, 004080, 022049, 004080, 022059,
+               004080, 022005, 002042, 022032, 002042, 004080 ]
+"308011" = [  001011, 002001, 301011, 301012, 301023, 007030, 007031, 004074, 004023, 008023,
+               010051, 007032, 007033, 012101, 013004, 007032, 007033, 302056, 008023, 004003,
+               004004, 004023, 007032, 013060, 013051, 004053, 007032 ]
+"308012" = [  004001, 004001, 004002, 004003, 004004, 004074, 004022, 008023, 010051, 007032,
+               007033, 012101, 013004, 007032, 007033, 302056, 008023, 004001, 004001, 004002,
+               004003, 004004, 004022, 007032, 008023, 013060, 004053, 008023 ]
+"308013" = [  308011, 308012 ]
+"308014" = [  101000, 031000, 301018, 003001, 301093, 208032, 001079, 208000, 302062, 302063,
+               101000, 031000, 302092, 101000, 031000, 306033, 101000, 031000, 306034, 101000,
+               031000, 306043 ]
+"308015" = [  001003, 001020, 001005, 001011, 001007, 001001, 001002, 002044, 002045, 301011,
+               301012, 301021, 022063, 022076, 022077, 022094, 025043, 022078, 105002, 002046,
+               022070, 022071, 022073, 022074, 127000, 031001, 002046, 008090, 022102, 008090,
+               022084, 120000, 031001, 022080, 022108, 022086, 022087, 022088, 022089, 105000,
+               031001, 008090, 022104, 008090, 022186, 022187, 105000, 031001, 008090, 022106,
+               008090, 022186, 022187 ]
+"308016" = [  001003, 001020, 001005, 001011, 001007, 001001, 001002, 002044, 002045, 301011,
+               301012, 301021, 022063, 022076, 022077, 022094, 025044, 022079, 105002, 002046,
+               022070, 022072, 022073, 022075, 127000, 031001, 002046, 008090, 022103, 008090,
+               022084, 120000, 031001, 022081, 022108, 022086, 022087, 022088, 022089, 105000,
+               031001, 008090, 022105, 008090, 022186, 022187, 105000, 031001, 008090, 022107,
+               008090, 022186, 022187 ]
+"308021" = [  001011, 002001, 301011, 301012, 301023, 007030, 007031, 004074, 004023, 008023,
+               010051, 007032, 007033, 012101, 013004, 007032, 007033, 302056, 008023, 004003,
+               004004, 004074, 004023, 007032, 013060, 013051, 004053, 007032 ]
+"308022" = [  004001, 004001, 004002, 004003, 004004, 004074, 004022, 008023, 010051, 007032,
+               007033, 012101, 013004, 007032, 007033, 302056, 008023, 004001, 004001, 004002,
+               004003, 004004, 004074, 004022, 007032, 008023, 013060, 004053, 008023 ]
+"308023" = [  308021, 308022 ]
+"309001" = [  301037, 101000, 031001, 303011 ]
+"309002" = [  301038, 101000, 031001, 303011 ]
+"309003" = [  301037, 101000, 031001, 303012 ]
+"309004" = [  301038, 101000, 031001, 303012 ]
+"309005" = [  301037, 302004, 101000, 031001, 303013 ]
+"309006" = [  301038, 302004, 101000, 031001, 303013 ]
+"309007" = [  301037, 302004, 101000, 031001, 303014 ]
+"309008" = [  301038, 302004, 101000, 031001, 303014 ]
+"309011" = [  301039, 101000, 031001, 303011 ]
+"309012" = [  301039, 101000, 031001, 303012 ]
+"309013" = [  301039, 302004, 101000, 031001, 303013 ]
+"309014" = [  301039, 302004, 101000, 031001, 303014 ]
+"309015" = [  301040, 101000, 031001, 303011 ]
+"309016" = [  301040, 101000, 031001, 303012 ]
+"309017" = [  301040, 302004, 101000, 031001, 303013 ]
+"309018" = [  301040, 302004, 101000, 031001, 303014 ]
+"309019" = [  301031, 002003, 101000, 031001, 303011 ]
+"309020" = [  301031, 002003, 104000, 031001, 007003, 011003, 011004, 011005 ]
+"309030" = [  015004, 015005, 104000, 031001, 004015, 008006, 007004, 015003 ]
+"309031" = [  015004, 015005, 104000, 031001, 004025, 008006, 007004, 015003 ]
+"309040" = [  301075, 301076, 309030 ]
+"309041" = [  307041, 301075, 301076, 309030 ]
+"309042" = [  307042, 301075, 301076, 309030 ]
+"309043" = [  307043, 301075, 301076, 309030 ]
+"309044" = [  307044, 301075, 301076, 309030 ]
+"309045" = [  301075, 301076, 309031 ]
+"309046" = [  307041, 301075, 301076, 309031 ]
+"309047" = [  307042, 301075, 301076, 309031 ]
+"309048" = [  307043, 301075, 301076, 309031 ]
+"309049" = [  307044, 301075, 301076, 309031 ]
+"309050" = [  301110, 301113, 301114, 101000, 031002, 303050, 101000, 031001, 303051 ]
+"309051" = [  301110, 301113, 301114, 101000, 031002, 303052, 101000, 031001, 303053 ]
+"309052" = [  301111, 301113, 301114, 302049, 022043, 101000, 031002, 303054, 101000, 031001,
+               303051 ]
+"309053" = [  301112, 301113, 301114, 101000, 031002, 303054, 101000, 031001, 303051 ]
+"309054" = [  301001, 001011, 301011, 301012, 301021, 007030, 007031, 007007, 004023, 004059,
+               115000, 031001, 008001, 008023, 007004, 010009, 012101, 012103, 008023, 011001,
+               011002, 008023, 011019, 008050, 008020, 008050, 008020 ]
+"309055" = [  301111, 025061, 001081, 001082, 002067, 002095, 002096, 002097, 002081, 002082,
+               002084, 002191, 301113, 301114, 010004, 302032, 007032, 002002, 011001, 011002,
+               007032, 020003, 302049, 022043, 101000, 031002, 303055 ]
+"309060" = [  301123, 301121, 302050, 303040 ]
+"309061" = [  301120, 008041, 301122, 201131, 202129, 025069, 007004, 202000, 201000, 033007,
+               033035, 033015, 013009, 033007, 033035, 033015, 002013, 012101, 033007, 033035,
+               033015 ]
+"309062" = [  301120, 008041, 301122, 005001, 033035, 033015, 006001, 033035, 033015, 007007,
+               033035, 033015, 011003, 033035, 033015, 011004, 033035, 033015, 033007 ]
+"309063" = [  301120, 008041, 301122, 005001, 033035, 033015, 006001, 033035, 033015, 007007,
+               033035, 033015, 011003, 033035, 033015, 011004, 033035, 033015, 033007 ]
+"309064" = [  301120, 008041, 301122, 201131, 202129, 104002, 025069, 007004, 033035, 033015,
+               013003, 033035, 033015, 202000, 201000, 104002, 002013, 012101, 033035, 033015,
+               012103, 033035, 033015, 010009, 033035, 033015 ]
+"309065" = [  301120, 008041, 301122, 005001, 033035, 033015, 006001, 033035, 033015, 007007,
+               033035, 033015, 011003, 033035, 033015, 011004, 033035, 033015 ]
+"309066" = [  301120, 008041, 301122, 008040, 201131, 202129, 025069, 007004, 013003, 202000,
+               201000, 002013, 012101, 012103, 010009, 010007, 011002, 011001 ]
+"309070" = [  001035, 001032, 001015, 001063, 301001, 301011, 301012, 301021, 207001, 010001,
+               207000, 008086, 007030, 025031, 008021, 004014, 010004, 010051, 010009, 020010,
+               013095, 128000, 031002, 113000, 031000, 008086, 007004, 011001, 011002, 012101,
+               012102, 012103, 010009, 103000, 031000, 011021, 011022, 011005, 104000, 031000,
+               008086, 007006, 011001, 011002, 105000, 031000, 008086, 007006, 012101, 012102,
+               012103 ]
+"309071" = [  301001, 002014, 002003, 301113, 301114, 301023, 007030, 007007, 103000, 031001,
+               007009, 011001, 011002 ]
+"310001" = [  301042, 303031, 303032, 101026, 303025 ]
+"310002" = [  301042, 303031, 303032, 101009, 303023 ]
+"310003" = [  301042, 303031, 303032, 101006, 303023 ]
+"310004" = [  301042, 303031, 303032, 101003, 303024 ]
+"310005" = [  301042, 303031, 303033, 101000, 031001, 303025 ]
+"310006" = [  301042, 303031, 303033, 101000, 031001, 303023 ]
+"310007" = [  301042, 303031, 303033, 101000, 031001, 303024 ]
+"310008" = [  310011, 101019, 310012, 002150, 025079, 025080, 033032, 014045 ]
+"310009" = [  310011, 101015, 310012 ]
+"310010" = [  310011, 101005, 310012 ]
+"310011" = [  008070, 001033, 001034, 008070, 001033, 001034, 001007, 002048, 005040, 025075,
+               201133, 005041, 201000, 005043, 025070, 033030, 033031, 004001, 004002, 004003,
+               004004, 004005, 202131, 201138, 004006, 201000, 202000, 005001, 006001, 202126,
+               007001, 202000, 007024, 005021, 007025, 005022, 033033, 002151, 012064, 002151,
+               012064, 002151, 012064, 002151, 012064 ]
+"310012" = [  002150, 025076, 025077, 025078, 033032, 201132, 202129, 012063, 202000, 201000
+               ]
+"310013" = [  001007, 005040, 004001, 004002, 004003, 004004, 004005, 004006, 005001, 006001,
+               007025, 005043, 025085, 201131, 202129, 002150, 008023, 008072, 014027, 008072,
+               014027, 002150, 008023, 008072, 014027, 008072, 014027, 002150, 008023, 008072,
+               014027, 008072, 014027, 202000, 201000, 201132, 202129, 002150, 008023, 008072,
+               012063, 008072, 012063, 002150, 008023, 008072, 012063, 008072, 012063, 008023,
+               008072, 012063, 008072, 012063, 002150, 008023, 008072, 012063, 008072, 012063,
+               202000, 201000 ]
+"310014" = [  301072, 303041, 304011 ]
+"310015" = [  301072, 007024, 010002, 303041, 101003, 304032, 002152, 002024, 007004, 007004,
+               013003, 101003, 304033 ]
+"310016" = [  301072, 007024, 010002, 303041, 101012, 304032, 002152, 002024, 007004, 007004,
+               013003, 101012, 304033 ]
+"310018" = [  001007, 005040, 004001, 004043, 004004, 004005, 004006, 207002, 026030, 207000,
+               005002, 006002, 033072, 007025, 005022, 207002, 015001, 207000, 008003, 207001,
+               010004, 207000, 008003, 008003, 033042, 207001, 007004, 207000, 207002, 015001,
+               207000, 008003, 207002, 020081, 207000, 020065, 008029, 207004, 015030, 207000,
+               008075 ]
+"310019" = [  001007, 002019, 301011, 301013, 301023, 007025, 008021, 007025, 008021, 007025,
+               008021, 008029, 005040, 008075, 008003, 010004, 008003, 207002, 015001, 207000,
+               033070, 015030, 207002, 020081, 207000, 008003, 033042, 007004, 207002, 015001,
+               207000, 008003, 113021, 007004, 007004, 207002, 008021, 015005, 008021, 015005,
+               033007, 207000, 008026, 101020, 025143, 008026, 008043, 109015, 007004, 008090,
+               207006, 015008, 207000, 008090, 207002, 033007, 207000, 008043, 033071, 108008,
+               202124, 201107, 002071, 201000, 202000, 207002, 020081, 207000 ]
+"310020" = [  310022, 301011, 301013, 301021, 304034, 310021 ]
+"310021" = [  108000, 031001, 201131, 202129, 007004, 007004, 202000, 201000, 015020, 010002
+               ]
+"310022" = [  001007, 002019, 001033, 002172 ]
+"310023" = [  301072, 030021, 030022, 008012, 007024, 007025, 010002, 101012, 304032, 105002,
+               002152, 002024, 007004, 007004, 013003, 101012, 304033 ]
+"310024" = [  301072, 030021, 030022, 008012, 007024, 007025, 010002, 101003, 304032, 105002,
+               002152, 002024, 007004, 007004, 013003, 101003, 304033 ]
+"310025" = [  001007, 008021, 004001, 004002, 004003, 004004, 004005, 201138, 202131, 004006,
+               202000, 201000, 201132, 005041, 201000, 201129, 005043, 201000, 005002, 006002,
+               013040, 020029, 104024, 005042, 012163, 021083, 021084, 115003, 004001, 004002,
+               004003, 201142, 202131, 004026, 202000, 201000, 005001, 006001, 201138, 202129,
+               007001, 202000, 201000, 008021, 004001, 004002, 004003, 004004, 004005, 005040,
+               101003, 012070, 025054, 101004, 025055, 008007, 104028, 005002, 006002, 002111,
+               005021 ]
+"310026" = [  310022, 025060, 008021, 301011, 301012, 201138, 202131, 004006, 202000, 201000,
+               033039, 033007, 304030, 304031, 002020, 001050, 202127, 304030, 202000, 304031,
+               201133, 202131, 004016, 202000, 201000, 301021, 304030, 010035, 005021, 010036,
+               113000, 031002, 301021, 005021, 108000, 031001, 002121, 007040, 015037, 008023,
+               201125, 015037, 201000, 008023, 033007, 108000, 031002, 007007, 015036, 008023,
+               201123, 015036, 201000, 008023, 033007, 116000, 031002, 007009, 010004, 012001,
+               013001, 008023, 201120, 010004, 201000, 201122, 012001, 201000, 201123, 013001,
+               201000, 008023, 033007, 008003, 007009, 010004, 008023, 201120, 010004, 201000,
+               008023, 033007 ]
+"310027" = [  301071, 301011, 301013, 301021, 030021, 030022, 010002, 304036, 002152, 002167,
+               101011, 304035 ]
+"310028" = [  301071, 301011, 301013, 301021, 030021, 030022, 010002, 304036, 002152, 002167,
+               101011, 304037 ]
+"310029" = [  110000, 031001, 201138, 202130, 007004, 007004, 202000, 201000, 015020, 010002,
+               012101, 013098 ]
+"310030" = [  310022, 301011, 301013, 301021, 304034, 310029 ]
+"310050" = [  310051, 310052, 101000, 031002, 310053, 101004, 310054, 020010, 310052, 101015,
+               310053, 310052, 101005, 310053 ]
+"310051" = [  001007, 005040, 201133, 005041, 201000, 201132, 025070, 201000, 202126, 007001,
+               202000, 007025, 005022, 102009, 002151, 012064 ]
+"310052" = [  002019, 301011, 301012, 202131, 201138, 004006, 201000, 202000, 301021, 007024,
+               005021, 005043 ]
+"310053" = [  201134, 005042, 201000, 025076, 033032, 012163 ]
+"310054" = [  201134, 005042, 201000, 025076, 033032, 201131, 202129, 102002, 008023, 014027,
+               008023, 202000, 201000 ]
+"310055" = [  310051, 310052, 102020, 025076, 025052, 101000, 031002, 025050 ]
+"310060" = [  001007, 001033, 002019, 002020, 301011, 301012, 207003, 004006, 207000, 304030,
+               301021, 007024, 005021, 007025, 005022, 008075, 201133, 005041, 201000, 005045,
+               005043, 005040, 010001, 201129, 007002, 201000, 202127, 201125, 021166, 201000,
+               202000, 008012, 020010, 020014, 002165, 033075, 107003, 008076, 006029, 006029,
+               025140, 025141, 033076, 033077, 008076, 033078, 033003, 104000, 031002, 201133,
+               005042, 201000, 014044 ]
+"310061" = [  001007, 001033, 001034, 002019, 002020, 301011, 301012, 207003, 004006, 207000,
+               005040, 005041, 005043, 033079, 033080, 033078, 301021, 201129, 007002, 201000,
+               007024, 005021, 007025, 005022, 025075, 111000, 031002, 005042, 202131, 002153,
+               002154, 202000, 002104, 012066, 012163, 012158, 012159, 033081 ]
+"310062" = [  001007, 001033, 001034, 002019, 002020, 301011, 301012, 207003, 004006, 207000,
+               005040, 201133, 005041, 005043, 201000, 008076, 033082, 301021, 201129, 007002,
+               201000, 007024, 005021, 007025, 005022, 008072, 008029, 105000, 031002, 005042,
+               002155, 033083, 014043, 015042 ]
+"310063" = [  001007, 001033, 001034, 002019, 002020, 301011, 301012, 207003, 004006, 207000,
+               005040, 201133, 005041, 005043, 201000, 033082, 301021, 201129, 007002, 201000,
+               007024, 005021, 007025, 005022, 008075, 008013, 008072, 033084, 007062, 033086,
+               022043, 007062, 007062, 033086, 022043 ]
+"310064" = [  001007, 001033, 001034, 002019, 002020, 301011, 301012, 207003, 004006, 207000,
+               005040, 201133, 005041, 005043, 201000, 033082, 301021, 201129, 007002, 201000,
+               007024, 005021, 007025, 005022, 008075, 008029, 008046, 033085, 033086, 015049,
+               033086, 102011, 002155, 015062 ]
+"310065" = [  001007, 001033, 001034, 002019, 002020, 301011, 301012, 207003, 004006, 207000,
+               005040, 033082, 301021, 201129, 007002, 201000, 007024, 005021, 007025, 005022,
+               008075, 033071, 033070, 020021, 015045, 015046, 008065, 033087, 008003, 010004,
+               008003, 207002, 015001, 207000, 105012, 010040, 010004, 207003, 015005, 207000,
+               008046, 107019, 010040, 010004, 008090, 207006, 015008, 207000, 008090 ]
+"310066" = [  001007, 001033, 001034, 002019, 002020, 301011, 301012, 207003, 004006, 207000,
+               005040, 033082, 301021, 201129, 007002, 201000, 007024, 005021, 007025, 005022,
+               008075, 020081, 207004, 015030, 207000, 020065, 015041, 033086, 033087, 033088,
+               008003, 207001, 007004, 207000, 008003, 207002, 015001, 207000, 008003, 033042,
+               207001, 007004, 207000, 207002, 015001, 207000, 008003, 001032, 207002, 015001,
+               207000 ]
+"311001" = [  301051, 007002, 012001, 011001, 011002, 011031, 011032, 011033, 020041 ]
+"311002" = [  301065, 301066, 311003, 311004 ]
+"311003" = [  010070, 011001, 011002, 012001, 013002 ]
+"311004" = [  101000, 031000, 011034, 101000, 031000, 011035, 101000, 031000, 011075, 101000,
+               031000, 011076, 101000, 031000, 033025, 101000, 031000, 033026 ]
+"311005" = [  001008, 001023, 301021, 301011, 301013, 007010, 008009, 011001, 011002, 011031,
+               011036, 012101, 033025 ]
+"311006" = [  007010, 011001, 011002, 002064, 012101, 012103 ]
+"311007" = [  007010, 301021, 011001, 011002, 002064, 012101, 012103 ]
+"311008" = [  001008, 301011, 301013, 301021, 008004, 101000, 031001, 311006 ]
+"311009" = [  001008, 301011, 301013, 301021, 008004, 101000, 031001, 311007 ]
+"311010" = [  001008, 001023, 001006, 001110, 001111, 001112, 204002, 031021, 301011, 301013,
+               301021, 007010, 010053, 008009, 011001, 011002, 002064, 011100, 011101, 011102,
+               011103, 011104, 012101, 002170, 201144, 202133, 013002, 202000, 201000, 201135,
+               202130, 013003, 202000, 201000, 101000, 031000, 012103, 033026, 101000, 031000,
+               020042, 103000, 031000, 020043, 020044, 020045, 101000, 031000, 033025, 103000,
+               031001, 011075, 011076, 011039, 102000, 031000, 011037, 011077, 103000, 031000,
+               011034, 011035, 011036, 204000, 119000, 031001, 301011, 301013, 301021, 007007,
+               011105, 204007, 031021, 011076, 011075, 204000, 011106, 011107, 011108, 011109,
+               012101, 011001, 201130, 011084, 201000 ]
+"311011" = [  001023, 008004, 301011, 301013, 005002, 006002, 007004, 011001, 011002, 012101,
+               106000, 031001, 008046, 201139, 202126, 015026, 202000, 201000, 106000, 031001,
+               008046, 201138, 202130, 015026, 202000, 201000, 015052, 015053, 015054, 015055,
+               007004, 007004, 013099, 013100, 013101 ]
+"312001" = [  301043, 304001 ]
+"312002" = [  301043, 304002 ]
+"312003" = [  301042, 304003 ]
+"312004" = [  301042, 304004 ]
+"312005" = [  301042, 020014 ]
+"312006" = [  301044, 304005 ]
+"312007" = [  301042, 304006 ]
+"312010" = [  001007, 005040, 002021, 005041, 004001, 004043 ]
+"312011" = [  202131, 201149, 004006, 201000, 202126, 010002, 202000, 005043, 005053 ]
+"312012" = [  202129, 201132, 101019, 012063, 201000, 202000 ]
+"312013" = [  005042, 202129, 201135, 012063, 201000, 202000 ]
+"312014" = [  312010, 312011, 105056, 301023, 005042, 005052, 312012, 312013 ]
+"312015" = [  109011, 301023, 005042, 005052, 202129, 201132, 101004, 012063, 202000, 201000
+               ]
+"312016" = [  312010, 312011, 312015 ]
+"312017" = [  109008, 301023, 005042, 005052, 202129, 201132, 101003, 012063, 202000, 201000
+               ]
+"312018" = [  312010, 312011, 312017 ]
+"312019" = [  301047, 301048, 015015, 029002, 021076, 106012, 201129, 006030, 201000, 102012,
+               005030, 021075, 021066 ]
+"312020" = [  301047, 301048, 015015, 029002, 021076, 104012, 006030, 102012, 005030, 021075,
+               021066 ]
+"312021" = [  301047, 101003, 301049, 011012, 011011, 021067 ]
+"312022" = [  301047, 008022, 011012, 011050, 022070, 022026, 312041, 010050, 021068, 021071,
+               021072, 021073, 312042, 021062, 015011 ]
+"312023" = [  301047, 103003, 008022, 012061, 022050, 021069, 021085 ]
+"312024" = [  312020, 008060, 008022, 008060, 008022, 025014, 022101, 022097, 022098, 022099,
+               022100 ]
+"312025" = [  312019, 008060, 008022, 008060, 008022, 025014, 022101, 022097, 022098, 022099,
+               022100 ]
+"312026" = [  301046, 301011, 301013, 301023, 312031, 101004, 312030, 021110, 301023, 321027,
+               021111, 301023, 321027, 021112, 301023, 321027, 021113, 301023, 321027 ]
+"312027" = [  301047, 105009, 301023, 007021, 012061, 007021, 012061, 021085, 021070 ]
+"312028" = [  301046, 301011, 301013, 301023, 008025, 201136, 004006, 201000, 312031, 312032,
+               101004, 312030, 101002, 312033, 021110, 301023, 321028, 021111, 301023, 321028,
+               021112, 301023, 321028, 021113, 301023, 321028 ]
+"312030" = [  201130, 202129, 011012, 202000, 201000, 011052, 201135, 202130, 011011, 202000,
+               201000, 011053, 021104 ]
+"312031" = [  005034, 006034, 021109, 011081, 011082, 021101, 021102, 021103 ]
+"312032" = [  021120, 021121, 013055, 021122 ]
+"312033" = [  002104, 008022, 012063, 012065 ]
+"312041" = [  201141, 202130, 007001, 201000, 202000 ]
+"312042" = [  021077, 021078, 021079, 021080, 021081, 021082 ]
+"312045" = [  001007, 002019, 001096, 025061, 005040, 301011, 301013, 301021, 007002, 012180,
+               012181, 012182, 012183, 012184, 012185, 002174, 021086, 012186, 021087, 012187,
+               033043 ]
+"312050" = [  001007, 002019, 001096, 025061, 005040, 301011, 301013, 301021, 007025, 005022,
+               010080, 027080, 008003, 007004, 013093, 008003, 201131, 202129, 007004, 007004,
+               202000, 201000, 013095 ]
+"312051" = [  001007, 002019, 001096, 025061, 005040, 008075, 301011, 301013, 301021, 001012,
+               201131, 001013, 201000, 010032, 010033, 010034, 007002, 008012, 025110, 025111,
+               025102, 002104, 025103, 025104, 025105, 025106, 025107, 025108, 002111, 002121,
+               002026, 002027, 021130, 021131, 021132, 021133, 021064, 025014, 021134, 107018,
+               005030, 105024, 201130, 006030, 201000, 021135, 021136, 033044 ]
+"312052" = [  001007, 002019, 001096, 025061, 005040, 025120, 025121, 025124, 025125, 025122,
+               025123, 301011, 301013, 301021, 007002, 002119, 033047, 010081, 010082, 010083,
+               010084, 002116, 002117, 002118, 002156, 002157, 014055, 022150, 022151, 022152,
+               022153, 022154, 022155, 022156, 022157, 022158, 022159, 021137, 021138, 021139,
+               021140, 021141, 021142, 010085, 010086, 010087, 010088, 010089, 010090, 010091,
+               010092, 010093, 011002, 025126, 025127, 025128, 025129, 025130, 025131, 025132,
+               025133, 025134, 025135, 025136, 025137, 013096, 013097, 011095, 011096, 012188,
+               012189, 002158, 002159, 033052, 033053, 021143, 021144 ]
+"312053" = [  001007, 002019, 001096, 025061, 005040, 008075, 301011, 301013, 301021, 001012,
+               201131, 001013, 201000, 010032, 010033, 010034, 007002, 008012, 025110, 025111,
+               025102, 002104, 025103, 025104, 025105, 025106, 025107, 025108, 011001, 011002,
+               022160, 025138, 201130, 202129, 022021, 202000, 201000, 033048, 033049, 002026,
+               002027, 021130, 021131, 021132, 021133, 025014, 106036, 005030, 104024, 201130,
+               006030, 201000, 022161, 033044 ]
+"312055" = [  005033, 005040, 006034, 010095, 021157 ]
+"312056" = [  025060, 001032, 011082, 011081, 020095, 020096, 021155, 201133, 021101, 021102,
+               201000 ]
+"312057" = [  201130, 202129, 011012, 202000, 201000, 201131, 202129, 011011, 202000, 201000,
+               021156, 021104 ]
+"312058" = [  301125, 301011, 301013, 301021, 312055, 021150, 101003, 321030 ]
+"312059" = [  312056, 101000, 031001, 312057 ]
+"312060" = [  025060, 025062, 040001, 040002, 021062, 021151, 021152, 021153, 021154, 021062,
+               021088, 040003, 040004, 040005, 040006, 040007, 020065, 040008, 040009, 040010
+               ]
+"312061" = [  312058, 312060, 312059 ]
+"312070" = [  001007, 002019, 001144, 001124, 030010, 301011, 301013, 301021, 007012, 015012,
+               012165, 012166, 012167, 012168, 027010, 028010, 002099, 013048, 025081, 025082,
+               025083, 025084, 012080, 012081, 012082, 025174, 033028 ]
+"312071" = [  001007, 002019, 002139, 001096, 001040, 025061, 005040, 005044, 008075, 008077,
+               004001, 004002, 004003, 004004, 004005, 004006, 005001, 006001, 010081, 022156,
+               022142, 101020, 022149, 022143, 022144, 021137, 101020, 021181, 021138, 021180,
+               021177, 021178, 021179, 010079, 010085, 010086, 010087, 010089, 010090, 010091,
+               010092, 010093, 011097, 021093, 101020, 021182, 033053, 022151, 022145, 022148,
+               022146, 022147, 025126, 025128, 025127, 021176, 025132, 025133, 025182, 025183,
+               025180, 025184, 025181, 033080 ]
+"313009" = [  021001, 101000, 031001, 021001 ]
+"313010" = [  021036, 101000, 031001, 021036 ]
+"313031" = [  006002, 006012, 101000, 031002, 030001 ]
+"313032" = [  005002, 005012, 101000, 031002, 313031 ]
+"313041" = [  006002, 110000, 031001, 104000, 031001, 006012, 101000, 031012, 030001, 006012,
+               101000, 031001, 030001 ]
+"313042" = [  005002, 005012, 101000, 031002, 313041 ]
+"313043" = [  006002, 005002, 005012, 112000, 031001, 110000, 031001, 104000, 031001, 006012,
+               101000, 031011, 030001, 006012, 101000, 031001, 030001 ]
+"315001" = [  001011, 301011, 301012, 301023, 306001 ]
+"315002" = [  001011, 301011, 301012, 301023, 306004 ]
+"315003" = [  001087, 001085, 001086, 002036, 002148, 002149, 022055, 022056, 022067, 301011,
+               301012, 301021, 008080, 033050, 109000, 031002, 007065, 008080, 033050, 022045,
+               008080, 033050, 022064, 008080, 033050 ]
+"315004" = [  001079, 001011, 001103, 001087, 001019, 001080, 005036, 001036, 001013, 001012,
+               301011, 301012, 301021, 007032, 007033, 002002, 011002, 011001, 007032, 007033,
+               012101, 012103, 007032, 007033, 302021, 002031, 002030, 022005, 022032, 022063,
+               008080, 033050, 022178, 022177, 022067, 008041, 026021, 026022, 026023, 022068,
+               025061, 008041, 008080, 002171, 302090, 002171, 002032, 315005 ]
+"315005" = [  106000, 031002, 007063, 008080, 033050, 022043, 008080, 033050 ]
+"315007" = [  301003, 001019, 001103, 001087, 001036, 001115, 001080, 005036, 301011, 301012,
+               301021, 001079, 001023, 022063, 101000, 031000, 302001, 101000, 031000, 302021,
+               101000, 031000, 302052, 101000, 031000, 302059, 022067, 002171, 302090, 306033,
+               306034, 002171, 022067, 002038, 022067, 022068, 002171, 002033, 002032, 022056,
+               003011, 306035, 107000, 031000, 002032, 003010, 002031, 002040, 022056, 003011,
+               306036, 104000, 031000, 002032, 003012, 003011, 306037 ]
+"315008" = [  301126, 306038, 101000, 031000, 302091, 101000, 031000, 302082, 101000, 031000,
+               306039, 101000, 031000, 306040, 102000, 031000, 002005, 306041, 102000, 031000,
+               002005, 306004, 101000, 031000, 306005 ]
+"315009" = [  001087, 001019, 002149, 008021, 301011, 301012, 301021, 208016, 001051, 208000,
+               002148, 001012, 001014, 033022, 033023, 033027, 025026, 002034, 022060, 007070,
+               002190, 008021, 301011, 301012, 002005, 022043, 002033, 022059, 008029, 013115,
+               103000, 031000, 002005, 306004, 002005, 010004, 010051, 102000, 031000, 007033,
+               012101, 101000, 031000, 306042, 101000, 031000, 306039 ]
+"316001" = [  301011, 004004, 301023, 001021, 002041, 019001, 010051, 019002, 019003, 019004
+               ]
+"316002" = [  008021, 004001, 004002, 004003, 004004, 004005, 001033, 008021, 004001, 004002,
+               004003, 004004, 004005, 007002, 007002 ]
+"316003" = [  110000, 031001, 008011, 008007, 104000, 031001, 005002, 006002, 010002, 011002,
+               008007, 008011 ]
+"316004" = [  111000, 031001, 008011, 008007, 007002, 007002, 102000, 031001, 005002, 006002,
+               011031, 008007, 008011 ]
+"316005" = [  108000, 031001, 008005, 008007, 005002, 006002, 001026, 019001, 008007, 008005
+               ]
+"316006" = [  112000, 031001, 008011, 008007, 007002, 007002, 102000, 031001, 005002, 006002,
+               020011, 020012, 008007, 008011 ]
+"316007" = [  110000, 031001, 008011, 008007, 104000, 031001, 005002, 006002, 019005, 019006,
+               008007, 008011 ]
+"316008" = [  111000, 031001, 008001, 008007, 008023, 103000, 031001, 005002, 006002, 010002,
+               008023, 008007, 008001 ]
+"316009" = [  111000, 031001, 008011, 008007, 007002, 007002, 102000, 031001, 005002, 006002,
+               020041, 008007, 008011 ]
+"316010" = [  107000, 031001, 008011, 008007, 001022, 005002, 006002, 008007, 008011 ]
+"316011" = [  117000, 031001, 008011, 001022, 008007, 102000, 031001, 005002, 006002, 008021,
+               004001, 004002, 004003, 004004, 004005, 020090, 008021, 008007, 008011 ]
+"316020" = [  001033, 001025, 001027, 301011, 301012 ]
+"316021" = [  301023, 002041, 019001, 019007, 019005, 019006, 019008, 008005, 010004, 008005,
+               010004, 019007, 008005, 008021, 004075, 011040, 019007, 105004, 005021, 005021,
+               102002, 019003, 019004 ]
+"316022" = [  001032, 002041, 019001, 019010, 118000, 031001, 008021, 004014, 008005, 301023,
+               019005, 019006, 010004, 011041, 008021, 004075, 011040, 019008, 105004, 005021,
+               005021, 102002, 019003, 019004 ]
+"316026" = [  316020, 316021 ]
+"316027" = [  316020, 316022 ]
+"316030" = [  301014, 001037, 010064, 008019, 001062, 008019, 001065, 008019, 001062, 008019
+               ]
+"316031" = [  008021, 301011, 301012, 301027, 019005, 019006, 020028, 008021 ]
+"316032" = [  008021, 301011, 301012, 301027, 008021 ]
+"316033" = [  008021, 301011, 301012, 101000, 031001, 301027, 008021 ]
+"316034" = [  008079, 316030, 008011, 001022, 008007, 301023, 008007, 020090, 316031, 101000,
+               031000, 316032, 101000, 031001, 316033, 008011, 008079 ]
+"316035" = [  008079, 316030, 008011, 020023, 020021, 020008, 316031, 008011, 008079 ]
+"316036" = [  008079, 316030, 008011, 001027, 316031, 101000, 031000, 316032, 101000, 031001,
+               316033, 008011, 008079 ]
+"316037" = [  008079, 316030, 008011, 011031, 316031, 008011, 008079 ]
+"316038" = [  008079, 316030, 008011, 020041, 020021, 316031, 008011, 008079 ]
+"316039" = [  008079, 316030, 008011, 020024, 316031, 008011, 008079 ]
+"316040" = [  316030, 008079, 301014, 001037, 010064, 008079 ]
+"316050" = [  301001, 301011, 301012, 002160, 008005, 005002, 006002, 008005, 019100, 019005,
+               019006, 019101, 019102, 019103, 019104, 019105 ]
+"316052" = [  301005, 301011, 301012, 001007, 025150, 122000, 031001, 001027, 019150, 019106,
+               008005, 005002, 006002, 008005, 019107, 019005, 019006, 019108, 019109, 019110,
+               019111, 019112, 019113, 019114, 019115, 019116, 019117, 019118, 019119 ]
+"316060" = [  301011, 301012, 005002, 006002, 019005, 019006, 005002, 006002, 005002, 006002,
+               004074, 020048, 011041, 013055 ]
+"316061" = [  301011, 301012, 005002, 006002, 019005, 019006, 102000, 031001, 005002, 006002,
+               102000, 031001, 005002, 006002, 004074, 020048, 011041, 013055 ]
+"316071" = [  301014, 101000, 031002, 316075, 101000, 031002, 316076 ]
+"316072" = [  301014, 101000, 031002, 316077, 101000, 031002, 316078, 101000, 031002, 316079
+               ]
+"316073" = [  301014, 101000, 031002, 316080, 101000, 031002, 316081 ]
+"316074" = [  001039, 008021, 301014, 301027, 008021 ]
+"316075" = [  008079, 008041, 316074, 020006, 033042, 020013, 033042, 020001, 020025, 020026,
+               008041, 008079 ]
+"316076" = [  008079, 008041, 316074, 020006, 020025, 020026, 008041, 008079 ]
+"316077" = [  008079, 008011, 316074, 011031, 008011, 008079 ]
+"316078" = [  008079, 008041, 316074, 033042, 011012, 008041, 008079 ]
+"316079" = [  008079, 008011, 316074, 020023, 020024, 008011, 008079 ]
+"316080" = [  008079, 008011, 316074, 020041, 008011, 008079 ]
+"316081" = [  008079, 008041, 316074, 008041, 008079 ]
+"318001" = [  301025, 024011 ]
+"318003" = [  301026, 024005, 024004, 024021 ]
+"318004" = [  301025, 004023, 013011, 024005, 024004, 024022 ]
+"321001" = [  002101, 002114, 002105, 002106, 002107, 002121 ]
+"321003" = [  021051, 021014, 021017, 021030 ]
+"321004" = [  301031, 002003, 101000, 031001, 321003 ]
+"321005" = [  025004, 002121, 002122, 002123, 002124, 002125, 002126, 002127, 002128, 002129,
+               002130, 002131 ]
+"321006" = [  025001, 025002, 025003, 025005 ]
+"321007" = [  025009, 025010, 025011, 025012, 025013, 025015, 025016, 025017 ]
+"321008" = [  025006, 025007, 025008 ]
+"321009" = [  025018, 025019 ]
+"321010" = [  002101, 007002, 002102, 002103, 002104, 002105, 002106, 002107, 002108, 002109,
+               002110, 002132, 002133 ]
+"321011" = [  030031, 030032, 029002 ]
+"321012" = [  101000, 031001, 002135 ]
+"321021" = [  002003, 002101, 201130, 002106, 201000, 201132, 202130, 002121, 202000, 201000,
+               201133, 202129, 025001, 202000, 201000 ]
+"321022" = [  007007, 204001, 031021, 011001, 204000, 011002, 204001, 031021, 011006, 204000,
+               021030 ]
+"321023" = [  007007, 021091, 021030, 202129, 021014, 201129, 021017, 202000, 201000 ]
+"321024" = [  007007, 204001, 031021, 012007, 011006, 204000, 021030 ]
+"321025" = [  007007, 021091, 021030, 202129, 021014, 201129, 021017, 202000, 201000, 021092,
+               021030, 025092, 201129, 202129, 021017, 202000, 201000 ]
+"321026" = [  007007, 204001, 031021, 012007, 025091, 011071, 011072, 011073, 011074, 204000
+               ]
+"321027" = [  021118, 202129, 201132, 002112, 201000, 201131, 002111, 201000, 202000, 002104,
+               021105, 021106, 021107, 021114, 021115, 021116, 008018, 021117 ]
+"321028" = [  021118, 202129, 201132, 002112, 201000, 201131, 002111, 201000, 202000, 002104,
+               021123, 021106, 021107, 021114, 021115, 021116, 008018, 021117 ]
+"321030" = [  008085, 202129, 201131, 002111, 201000, 202000, 002134, 021062, 021063, 021158,
+               021159, 021160, 021161, 021162, 021163, 021164, 021165, 021166 ]
+"322028" = [  001007, 002019, 004001, 004002, 004003, 004004, 004005, 004006, 005001, 006001,
+               027001, 028001, 027001, 028001, 027001, 028001, 027001, 028001, 010001, 014019,
+               007025, 010080, 005023, 020010, 008003, 007004, 014026, 020014, 013093, 105000,
+               031001, 007004, 007004, 008043, 008044, 015021 ]
+"340001" = [  001007, 001031, 002019, 002020, 004001, 004002, 004003, 004004, 004005, 202131,
+               201138, 004006, 201000, 202000, 005001, 006001, 007024, 005021, 007025, 005022,
+               005043, 005040, 201133, 005041, 201000, 201132, 025070, 201000, 202126, 007001,
+               202000, 033060, 033061, 033062, 033063, 033064, 033065, 101010, 340002, 101087,
+               340003, 002019, 025051, 101007, 340004 ]
+"340002" = [  025140, 025141, 025142 ]
+"340003" = [  104100, 201136, 005042, 201000, 014046 ]
+"340004" = [  005060, 005061, 025085, 105006, 005042, 025142, 014047, 025142, 014048 ]
+"340005" = [  001007, 002019, 001096, 025061, 005044, 005040, 001030, 004001, 004002, 004003,
+               004004, 004005, 004007, 005001, 006001, 008029, 008074, 008077, 040011, 025097,
+               025095, 025098, 025099, 021144, 025096, 040012, 040013, 021169, 022151, 022162,
+               022163, 025160, 025133, 022156, 022164, 022165, 022166, 021137, 021138, 022167,
+               021139, 021118, 021145, 021146, 021147, 022168, 022169, 022170, 025161, 025162,
+               022171, 022172, 022173, 022174, 021170, 021171, 022175, 021172, 021118, 021173,
+               021174, 021175, 002153, 012063, 002153, 012063, 002153, 012063, 013090, 013091,
+               007002, 011097, 011098, 007002, 011095, 011096, 010096, 010081, 010082, 010083,
+               010101, 025132, 025163, 025126, 025128, 025164, 010085, 010097, 010086, 010087,
+               010092, 010088, 010089, 010098, 010099, 010090, 010100, 010093, 025127, 040014
+               ]
+"340007" = [  001007, 001031, 002019, 002020, 004001, 004002, 004003, 004004, 004005, 202131,
+               201138, 004006, 201000, 202000, 005001, 006001, 007024, 005021, 007025, 005022,
+               005043, 005040, 201133, 005041, 201000, 201132, 025070, 201000, 202126, 007001,
+               202000, 103003, 025140, 025141, 033060, 033061, 033062, 033063, 033064, 033065,
+               040020, 101010, 340002, 101087, 340003, 002019, 025051, 101007, 340004, 020081,
+               008029, 020083, 008029, 040018, 040019, 040021, 040022 ]
+"340008" = [  001007, 001031, 002019, 002020, 004001, 004002, 004003, 004004, 004005, 202131,
+               201138, 004006, 201000, 202000, 005001, 006001, 007024, 005021, 007025, 005022,
+               005043, 005040, 201133, 005041, 201000, 201132, 025070, 201000, 202126, 007001,
+               202000, 103003, 025140, 025141, 033060, 033061, 033062, 033063, 033064, 033065,
+               040020, 101010, 340002, 104000, 031002, 201136, 005042, 201000, 014046, 108003,
+               025140, 025141, 040026, 040016, 025062, 101000, 031002, 040017, 002019, 025051,
+               101007, 340004, 020081, 008029, 020083, 008029, 040018, 040019, 040021, 040022
+               ]
+"340009" = [  001007, 001031, 002019, 002020, 301011, 301013, 005040, 201136, 005041, 201000,
+               025071, 005001, 005001, 006001, 006001, 107064, 106032, 008012, 008013, 008065,
+               008072, 013039, 040015 ]
+"340010" = [  001007, 002019, 001096, 025061, 005044, 005040, 001030, 004001, 004002, 004003,
+               004004, 004005, 004007, 005001, 006001, 008029, 008074, 008077, 040011, 025097,
+               025095, 025098, 025099, 021144, 025096, 040012, 040013, 021169, 040023, 040024,
+               040025, 022151, 022162, 022163, 025160, 025133, 022156, 022164, 022165, 022166,
+               021137, 021138, 022167, 021139, 021118, 021145, 021146, 021147, 022168, 022169,
+               022170, 025161, 025162, 022171, 022172, 022173, 022174, 021170, 021171, 022175,
+               021172, 021118, 021173, 021174, 021175, 002153, 012063, 002153, 012063, 002153,
+               012063, 013090, 013091, 007002, 011097, 011098, 007002, 011095, 011096, 010096,
+               010081, 010082, 010083, 010101, 025132, 025163, 025126, 025128, 025164, 010085,
+               010097, 010086, 010087, 010092, 010088, 010089, 010098, 010099, 010090, 010100,
+               010093, 025127, 040014, 010102 ]
+"340011" = [  001007, 002019, 001096, 025061, 005044, 005040, 001030, 004001, 004002, 004003,
+               004004, 004005, 004007, 005001, 006001, 008029, 008077, 040011, 025097, 025112,
+               025113, 021148, 021169, 040024, 040025, 002153, 022189, 022191, 022130, 025167,
+               025166, 022190, 022131, 022132, 022133, 021183, 021184, 022134, 021185, 021118,
+               021186, 021187, 021188, 002153, 012063, 002153, 012063, 013090, 013160, 007002,
+               011097, 007002, 011095, 011096, 010096, 010081, 010082, 010083, 010101, 002153,
+               025165, 025126, 025128, 025164, 010085, 010086, 010087, 010092, 010088, 010089,
+               010098, 010099, 010090, 010100, 010093, 025127, 040014, 010102 ]
+"340012" = [  001007, 002019, 008091, 005001, 006001, 007002, 005063, 005064, 005066, 005041,
+               005067, 301011, 301012, 004007, 008091, 005001, 006001, 107000, 031001, 005042,
+               002153, 002104, 040028, 007024, 040027, 012063 ]
+"340013" = [  001007, 002019, 001033, 001034, 004001, 004002, 004003, 004004, 004005, 004007,
+               005068, 005070, 005069, 040036, 008091, 005001, 006001, 004016, 008091, 005001,
+               006001, 004016, 008091, 005001, 006001, 004016, 008091, 007071, 005021, 007021,
+               040035, 008091, 007071, 005021, 007021, 040035, 008091, 007071, 005021, 007021,
+               040035, 040029, 040030, 040031, 025187, 010004, 012001, 040037, 040032, 040033,
+               040034 ]
diff --git a/definitions/check_grib_defs.pl b/definitions/check_grib_defs.pl
index f4ec150..c9a3353 100755
--- a/definitions/check_grib_defs.pl
+++ b/definitions/check_grib_defs.pl
@@ -1,7 +1,7 @@
 #!/usr/bin/env perl
 
 #
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -59,7 +59,7 @@ my %name_map = process("name.def");
 my $count = scalar(keys %name_map);
 
 ok($count > 0, "Check some params found");
-die "No params found" if ($count eq 0);
+die "No params found." if ($count eq 0);
 
 my %paramId_map   = process("paramId.def");
 print Data::Dumper->Dump([\%paramId_map], ["paramId_map"]), $/ if ($debug);
@@ -152,6 +152,7 @@ sub process {
     open FILE, $filename or die "Tried to open $filename\n$!";
     my @lines = <FILE>;
     close(FILE);
+    print "Processing $filename\n";
 
     my $error = 0; # boolean: 1 if at least one error encountered
     my %map1 = ();
@@ -171,7 +172,8 @@ sub process {
             $desc = $1;
             $desc =~ s/^\s+//;  #remove leading spaces
             $desc =~ s/\s+$//;  #remove trailing spaces
-            die "File: $filename, line: $lineNum: Empty description" if ($desc eq "");
+            die "File: $filename, line: $lineNum: Description contains invalid characters." if (non_printable($desc));
+            die "File: $filename, line: $lineNum: Empty description." if ($desc eq "");
         }
         # key = value
         elsif ($this =~ /(\w+)\s*=\s*([^ ]+)\s*;/ && $desc) {
@@ -199,8 +201,9 @@ sub process {
             }
             $map2{$key} = $val;
         }
-        elsif ($this =~ /'(.*)'.*=/) {
+        elsif ($this =~ /'(.*)' *= *{/) {
             $concept = $1;
+            die "File: $filename, line: $lineNum: Value contains invalid characters." if (non_printable($concept));
             if ($filename eq 'cfVarName.def') {
                #if ($concept =~ /^[0-9]/) {
                # Check CF naming convention. Do not allow numeric initial char or ~
@@ -282,6 +285,11 @@ sub is_integer {
     return ($val =~ /^\d+$/);
 }
 
+sub non_printable {
+    my $str = shift;
+    return ($str =~ /[^[:ascii:]]/);
+}
+
 ################
 sub check_paramIDs {
     my ($filename) = @_;
diff --git a/definitions/common/statistics_grid.def b/definitions/common/statistics_grid.def
index 78182df..ba8d492 100644
--- a/definitions/common/statistics_grid.def
+++ b/definitions/common/statistics_grid.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/common/statistics_spectral.def b/definitions/common/statistics_spectral.def
index 1cc87c7..a57de66 100644
--- a/definitions/common/statistics_spectral.def
+++ b/definitions/common/statistics_spectral.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/2.98.174.table b/definitions/grib1/2.98.174.table
index 2a4facb..4cbeeb3 100644
--- a/definitions/grib1/2.98.174.table
+++ b/definitions/grib1/2.98.174.table
@@ -25,7 +25,7 @@
 90 90 - Top outgoing solar radiation (J m**-2)
 94 94 - Mean sea surface temperature (K)
 95 95 - 1.5m specific humidity (kg kg**-1)
-96 96 - 2m specific humidity (kg kg**-1)
+96 96 - 2 metre specific humidity (kg kg**-1)
 97 97 SIST Sea-ice Snow Thickness (m)
 98 98 SIT Sea-ice thickness (m)
 99 99 - Liquid water potential temperature (K)
diff --git a/definitions/grib1/2.98.228.table b/definitions/grib1/2.98.228.table
index b473514..4d85609 100644
--- a/definitions/grib1/2.98.228.table
+++ b/definitions/grib1/2.98.228.table
@@ -34,8 +34,8 @@
 43 swi4 SWI4 Soil wetness index in layer 4 (dimensionless)
 44 capes CAPES Convective available potential energy shear (m**2 s**-2)
 46 hcct HCCT Height of convective cloud top (m)
-47 hwbt0 HWBT0 Height of Zero Deg Wet Bulb Temperature (m)
-48 hwbt1 HWBT1 Height of One Deg Wet Bulb Temperature (m)
+47 hwbt0 HWBT0 Height of zero-degree wet-bulb temperature (m)
+48 hwbt1 HWBT1 Height of one-degree wet-bulb temperature (m)
 50 litoti LITOTI Instantaneous total lightning density (flashes/km2/day)
 51 litota LITOTA Averaged total lightning density (flashes/km2/day)
 52 licgi LICGI Instantaneous cloud-to-ground lightning density (flashes/km2/day)
diff --git a/definitions/grib1/boot.def b/definitions/grib1/boot.def
index 5860eab..8a1a958 100644
--- a/definitions/grib1/boot.def
+++ b/definitions/grib1/boot.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/data.grid_ieee.def b/definitions/grib1/data.grid_ieee.def
index ed42e79..231ad12 100644
--- a/definitions/grib1/data.grid_ieee.def
+++ b/definitions/grib1/data.grid_ieee.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/data.grid_second_order.def b/definitions/grib1/data.grid_second_order.def
index 1c4f500..4ddc866 100644
--- a/definitions/grib1/data.grid_second_order.def
+++ b/definitions/grib1/data.grid_second_order.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -51,6 +51,7 @@ if(bitmapPresent)   {
      referenceValue,
      binaryScaleFactor,
      decimalScaleFactor,
+     optimizeScaleFactor,
 	#g1second_order_row_by_row args
 	 halfByte,
 	 packingType,
@@ -109,6 +110,7 @@ if(bitmapPresent)   {
 		 referenceValue,
 		 binaryScaleFactor,
 		 decimalScaleFactor,
+         optimizeScaleFactor,
 		#g1second_order_row_by_row args
 		 halfByte,
 		 packingType,
@@ -148,6 +150,7 @@ if(bitmapPresent)   {
 		 referenceValue,
 		 binaryScaleFactor,
 		 decimalScaleFactor,
+         optimizeScaleFactor,
 		#g1second_order_row_by_row args
 		 halfByte,
 		 packingType,
diff --git a/definitions/grib1/data.grid_second_order_constant_width.def b/definitions/grib1/data.grid_second_order_constant_width.def
index 55ce554..b35989f 100644
--- a/definitions/grib1/data.grid_second_order_constant_width.def
+++ b/definitions/grib1/data.grid_second_order_constant_width.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -35,6 +35,7 @@ if(bitmapPresent)   {
      referenceValue,
      binaryScaleFactor,
      decimalScaleFactor,
+     optimizeScaleFactor,
 	#g1second_order_row_by_row args
 	 halfByte,
 	 packingType,
@@ -89,6 +90,7 @@ if(bitmapPresent)   {
 		 referenceValue,
 		 binaryScaleFactor,
 		 decimalScaleFactor,
+         optimizeScaleFactor,
 		#g1second_order_row_by_row args
 		 halfByte,
 		 packingType,
@@ -123,6 +125,7 @@ if(bitmapPresent)   {
 		 referenceValue,
 		 binaryScaleFactor,
 		 decimalScaleFactor,
+         optimizeScaleFactor,
 		#g1second_order_row_by_row args
 		 halfByte,
 		 packingType,
diff --git a/definitions/grib1/data.grid_second_order_general_grib1.def b/definitions/grib1/data.grid_second_order_general_grib1.def
index 92710b7..89d3fae 100644
--- a/definitions/grib1/data.grid_second_order_general_grib1.def
+++ b/definitions/grib1/data.grid_second_order_general_grib1.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -35,6 +35,7 @@ if(bitmapPresent)   {
      referenceValue,
      binaryScaleFactor,
      decimalScaleFactor,
+     optimizeScaleFactor,
 	#g1second_order_row_by_row args
 	 halfByte,
 	 packingType,
@@ -88,6 +89,7 @@ if(bitmapPresent)   {
 		 referenceValue,
 		 binaryScaleFactor,
 		 decimalScaleFactor,
+         optimizeScaleFactor,
 		#g1second_order_row_by_row args
 		 halfByte,
 		 packingType,
@@ -122,6 +124,7 @@ if(bitmapPresent)   {
 		 referenceValue,
 		 binaryScaleFactor,
 		 decimalScaleFactor,
+         optimizeScaleFactor,
 		#g1second_order_row_by_row args
 		 halfByte,
 		 packingType,
diff --git a/definitions/grib1/data.grid_second_order_row_by_row.def b/definitions/grib1/data.grid_second_order_row_by_row.def
index ec78bf6..c74aac6 100644
--- a/definitions/grib1/data.grid_second_order_row_by_row.def
+++ b/definitions/grib1/data.grid_second_order_row_by_row.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -35,6 +35,7 @@ if(bitmapPresent)   {
      referenceValue,
      binaryScaleFactor,
      decimalScaleFactor,
+     optimizeScaleFactor,
 	#g1second_order_row_by_row args
 	 halfByte,
 	 packingType,
@@ -72,6 +73,7 @@ if(bitmapPresent)   {
      referenceValue,
      binaryScaleFactor,
      decimalScaleFactor,
+     optimizeScaleFactor,
 	#g1second_order_row_by_row args
 	 halfByte,
 	 packingType,
diff --git a/definitions/grib1/data.grid_simple.def b/definitions/grib1/data.grid_simple.def
index 6840ea0..f0384a6 100644
--- a/definitions/grib1/data.grid_simple.def
+++ b/definitions/grib1/data.grid_simple.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -34,6 +34,7 @@ if( bitmapPresent || !GDSPresent ) {
      referenceValue,
      binaryScaleFactor,
      decimalScaleFactor,
+     optimizeScaleFactor,
   #g1simple_packing args
      halfByte,
      packingType,
@@ -58,6 +59,7 @@ if( bitmapPresent || !GDSPresent ) {
       referenceValue,
       binaryScaleFactor,
       decimalScaleFactor,
+      optimizeScaleFactor,
       halfByte,
       packingType,
       grid_ieee,precision
diff --git a/definitions/grib1/data.grid_simple_matrix.def b/definitions/grib1/data.grid_simple_matrix.def
index db072dc..cb7d3d3 100644
--- a/definitions/grib1/data.grid_simple_matrix.def
+++ b/definitions/grib1/data.grid_simple_matrix.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -81,6 +81,7 @@ if(matrixOfValues == 0)
                referenceValue,
                binaryScaleFactor,
                decimalScaleFactor,
+               optimizeScaleFactor,
                halfByte,
                packingType,
                grid_ieee
@@ -106,6 +107,7 @@ if(matrixOfValues == 0)
               referenceValue,
               binaryScaleFactor,
               decimalScaleFactor,
+              optimizeScaleFactor,
               halfByte
         ) : dump;
 
@@ -168,6 +170,7 @@ if(matrixOfValues == 0)
                referenceValue,
                binaryScaleFactor,
                decimalScaleFactor,
+               optimizeScaleFactor,
                halfByte
             ) : read_only;
 
diff --git a/definitions/grib1/data.spectral_complex.def b/definitions/grib1/data.spectral_complex.def
index 8ddea35..21b7dfb 100644
--- a/definitions/grib1/data.spectral_complex.def
+++ b/definitions/grib1/data.spectral_complex.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -59,6 +59,7 @@ constant PUnset = -32767;
       referenceValue,
       binaryScaleFactor,
       decimalScaleFactor,
+      optimizeScaleFactor,
 
       GRIBEXShBugPresent,
       ieeeFloats,
@@ -89,6 +90,7 @@ constant PUnset = -32767;
       referenceValue,
       binaryScaleFactor,
       decimalScaleFactor,
+      optimizeScaleFactor,
 
       GRIBEXShBugPresent,
       ieeeFloats,
@@ -117,6 +119,7 @@ constant PUnset = -32767;
       referenceValue,
       binaryScaleFactor,
       decimalScaleFactor,
+      optimizeScaleFactor,
 
       GRIBEXShBugPresent,
       ieeeFloats,
diff --git a/definitions/grib1/data.spectral_ieee.def b/definitions/grib1/data.spectral_ieee.def
index 94b05fc..3a3a50b 100644
--- a/definitions/grib1/data.spectral_ieee.def
+++ b/definitions/grib1/data.spectral_ieee.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -55,6 +55,7 @@ constant PUnset = -32767;
       referenceValue,
       binaryScaleFactor,
       decimalScaleFactor,
+      optimizeScaleFactor,
 
       GRIBEXShBugPresent,
       ieeeFloats,
@@ -85,6 +86,7 @@ constant PUnset = -32767;
       referenceValue,
       binaryScaleFactor,
       decimalScaleFactor,
+      optimizeScaleFactor,
 
       GRIBEXShBugPresent,
       ieeeFloats,
@@ -113,6 +115,7 @@ constant PUnset = -32767;
       referenceValue,
       binaryScaleFactor,
       decimalScaleFactor,
+      optimizeScaleFactor,
 
       GRIBEXShBugPresent,
       ieeeFloats,
diff --git a/definitions/grib1/data.spectral_simple.def b/definitions/grib1/data.spectral_simple.def
index bbbf1ac..9d8b7f6 100644
--- a/definitions/grib1/data.spectral_simple.def
+++ b/definitions/grib1/data.spectral_simple.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -36,6 +36,7 @@ meta codedValues data_g1simple_packing(
    referenceValue,
    binaryScaleFactor,
    decimalScaleFactor,
+   optimizeScaleFactor,
    halfByte
 ): read_only;
 
diff --git a/definitions/grib1/gds_not_present_bitmap.def b/definitions/grib1/gds_not_present_bitmap.def
index 3afaeff..e513537 100644
--- a/definitions/grib1/gds_not_present_bitmap.def
+++ b/definitions/grib1/gds_not_present_bitmap.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/grid_21.def b/definitions/grib1/grid_21.def
index a66045a..fe67b99 100644
--- a/definitions/grib1/grid_21.def
+++ b/definitions/grib1/grid_21.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/grid_22.def b/definitions/grib1/grid_22.def
index 9d965e3..e4762b4 100644
--- a/definitions/grib1/grid_22.def
+++ b/definitions/grib1/grid_22.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/grid_23.def b/definitions/grib1/grid_23.def
index 0634733..8cce512 100644
--- a/definitions/grib1/grid_23.def
+++ b/definitions/grib1/grid_23.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/grid_24.def b/definitions/grib1/grid_24.def
index a498450..f46132c 100644
--- a/definitions/grib1/grid_24.def
+++ b/definitions/grib1/grid_24.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/grid_25.def b/definitions/grib1/grid_25.def
index 27c4870..0afd0ea 100644
--- a/definitions/grib1/grid_25.def
+++ b/definitions/grib1/grid_25.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/grid_26.def b/definitions/grib1/grid_26.def
index d72f969..a8e912f 100644
--- a/definitions/grib1/grid_26.def
+++ b/definitions/grib1/grid_26.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/grid_61.def b/definitions/grib1/grid_61.def
index 571e043..3491ea9 100644
--- a/definitions/grib1/grid_61.def
+++ b/definitions/grib1/grid_61.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/grid_62.def b/definitions/grib1/grid_62.def
index 03ce3e0..69f56d8 100644
--- a/definitions/grib1/grid_62.def
+++ b/definitions/grib1/grid_62.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/grid_63.def b/definitions/grib1/grid_63.def
index a5bd230..bd48e8d 100644
--- a/definitions/grib1/grid_63.def
+++ b/definitions/grib1/grid_63.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/grid_64.def b/definitions/grib1/grid_64.def
index a4b4d26..8db8593 100644
--- a/definitions/grib1/grid_64.def
+++ b/definitions/grib1/grid_64.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/grid_definition_0.def b/definitions/grib1/grid_definition_0.def
index 41d9ab6..93ce6e8 100644
--- a/definitions/grib1/grid_definition_0.def
+++ b/definitions/grib1/grid_definition_0.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/grid_definition_1.def b/definitions/grib1/grid_definition_1.def
index f5135f5..bd8888e 100644
--- a/definitions/grib1/grid_definition_1.def
+++ b/definitions/grib1/grid_definition_1.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/grid_definition_10.def b/definitions/grib1/grid_definition_10.def
index 850b0a6..e9d1658 100644
--- a/definitions/grib1/grid_definition_10.def
+++ b/definitions/grib1/grid_definition_10.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/grid_definition_13.def b/definitions/grib1/grid_definition_13.def
index d3bfa70..7435b69 100644
--- a/definitions/grib1/grid_definition_13.def
+++ b/definitions/grib1/grid_definition_13.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/grid_definition_14.def b/definitions/grib1/grid_definition_14.def
index 17d8e9e..1dca9b0 100644
--- a/definitions/grib1/grid_definition_14.def
+++ b/definitions/grib1/grid_definition_14.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/grid_definition_192.78.def b/definitions/grib1/grid_definition_192.78.def
index 514fbde..7783373 100755
--- a/definitions/grib1/grid_definition_192.78.def
+++ b/definitions/grib1/grid_definition_192.78.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/grid_definition_192.98.def b/definitions/grib1/grid_definition_192.98.def
index fa639c4..92ea65f 100644
--- a/definitions/grib1/grid_definition_192.98.def
+++ b/definitions/grib1/grid_definition_192.98.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/grid_definition_193.98.def b/definitions/grib1/grid_definition_193.98.def
index 327af69..5fbf448 100644
--- a/definitions/grib1/grid_definition_193.98.def
+++ b/definitions/grib1/grid_definition_193.98.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/grid_definition_20.def b/definitions/grib1/grid_definition_20.def
index 369b999..e4c1ae4 100644
--- a/definitions/grib1/grid_definition_20.def
+++ b/definitions/grib1/grid_definition_20.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/grid_definition_24.def b/definitions/grib1/grid_definition_24.def
index 60f75bc..cf0a2e4 100644
--- a/definitions/grib1/grid_definition_24.def
+++ b/definitions/grib1/grid_definition_24.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/grid_definition_3.def b/definitions/grib1/grid_definition_3.def
index ab1fdf2..8909ac8 100644
--- a/definitions/grib1/grid_definition_3.def
+++ b/definitions/grib1/grid_definition_3.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/grid_definition_30.def b/definitions/grib1/grid_definition_30.def
index 1c0c94b..59dde79 100644
--- a/definitions/grib1/grid_definition_30.def
+++ b/definitions/grib1/grid_definition_30.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/grid_definition_34.def b/definitions/grib1/grid_definition_34.def
index 3e435d8..ea81659 100644
--- a/definitions/grib1/grid_definition_34.def
+++ b/definitions/grib1/grid_definition_34.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/grid_definition_4.def b/definitions/grib1/grid_definition_4.def
index c2ea508..3d3ccb6 100644
--- a/definitions/grib1/grid_definition_4.def
+++ b/definitions/grib1/grid_definition_4.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/grid_definition_5.def b/definitions/grib1/grid_definition_5.def
index 80b11df..8ec6c28 100644
--- a/definitions/grib1/grid_definition_5.def
+++ b/definitions/grib1/grid_definition_5.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/grid_definition_50.def b/definitions/grib1/grid_definition_50.def
index 0d8f33a..8559ee8 100644
--- a/definitions/grib1/grid_definition_50.def
+++ b/definitions/grib1/grid_definition_50.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/grid_definition_60.def b/definitions/grib1/grid_definition_60.def
index dac74fc..ecd903f 100644
--- a/definitions/grib1/grid_definition_60.def
+++ b/definitions/grib1/grid_definition_60.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/grid_definition_70.def b/definitions/grib1/grid_definition_70.def
index 49f7317..b2606a3 100644
--- a/definitions/grib1/grid_definition_70.def
+++ b/definitions/grib1/grid_definition_70.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/grid_definition_8.def b/definitions/grib1/grid_definition_8.def
index 4bc3cd5..4352c1a 100644
--- a/definitions/grib1/grid_definition_8.def
+++ b/definitions/grib1/grid_definition_8.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/grid_definition_80.def b/definitions/grib1/grid_definition_80.def
index 086d519..2f7909a 100644
--- a/definitions/grib1/grid_definition_80.def
+++ b/definitions/grib1/grid_definition_80.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/grid_definition_90.def b/definitions/grib1/grid_definition_90.def
index b66a560..de91697 100644
--- a/definitions/grib1/grid_definition_90.def
+++ b/definitions/grib1/grid_definition_90.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -49,7 +49,7 @@ include "grib1/scanning_mode.def";
 unsigned[3] orientationOfTheGrid : edition_specific ;
 meta geography.orientationOfTheGridInDegrees  scale(orientationOfTheGrid,oneConstant,grib1divider,truncateDegrees) : dump;
 
-unsigned[3] NrInRadiusOfEarth : edition_specific,no_copy;
+unsigned[3] NrInRadiusOfEarth : edition_specific,can_be_missing,no_copy;
 alias altitudeOfTheCameraFromTheEarthSCenterMeasuredInUnitsOfTheEarth = NrInRadiusOfEarth;
 
 unsigned[2]  Xo : dump;
diff --git a/definitions/grib1/grid_definition_gaussian.def b/definitions/grib1/grid_definition_gaussian.def
index bcd3e56..5b8eef6 100644
--- a/definitions/grib1/grid_definition_gaussian.def
+++ b/definitions/grib1/grid_definition_gaussian.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/grid_definition_lambert.def b/definitions/grib1/grid_definition_lambert.def
index 1ba5c4c..b220dd2 100644
--- a/definitions/grib1/grid_definition_lambert.def
+++ b/definitions/grib1/grid_definition_lambert.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/grid_definition_latlon.def b/definitions/grib1/grid_definition_latlon.def
index 8c33a12..ce247b7 100644
--- a/definitions/grib1/grid_definition_latlon.def
+++ b/definitions/grib1/grid_definition_latlon.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/grid_definition_spherical_harmonics.def b/definitions/grib1/grid_definition_spherical_harmonics.def
index f4cb391..523bb9a 100644
--- a/definitions/grib1/grid_definition_spherical_harmonics.def
+++ b/definitions/grib1/grid_definition_spherical_harmonics.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/grid_first_last_resandcomp.def b/definitions/grib1/grid_first_last_resandcomp.def
index db1718d..5f817af 100644
--- a/definitions/grib1/grid_first_last_resandcomp.def
+++ b/definitions/grib1/grid_first_last_resandcomp.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/grid_rotation.def b/definitions/grib1/grid_rotation.def
index bc883ef..e34cff2 100644
--- a/definitions/grib1/grid_rotation.def
+++ b/definitions/grib1/grid_rotation.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/grid_stretching.def b/definitions/grib1/grid_stretching.def
index 19681b5..945e757 100644
--- a/definitions/grib1/grid_stretching.def
+++ b/definitions/grib1/grid_stretching.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.1.def b/definitions/grib1/local.1.def
index aeadd87..bc226bc 100644
--- a/definitions/grib1/local.1.def
+++ b/definitions/grib1/local.1.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.214.1.def b/definitions/grib1/local.214.1.def
index f186360..722de4b 100644
--- a/definitions/grib1/local.214.1.def
+++ b/definitions/grib1/local.214.1.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.214.244.def b/definitions/grib1/local.214.244.def
index c56d898..1a0382d 100644
--- a/definitions/grib1/local.214.244.def
+++ b/definitions/grib1/local.214.244.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.214.245.def b/definitions/grib1/local.214.245.def
index 9255312..35128f0 100644
--- a/definitions/grib1/local.214.245.def
+++ b/definitions/grib1/local.214.245.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.253.def b/definitions/grib1/local.253.def
index f9316e2..74f8f28 100644
--- a/definitions/grib1/local.253.def
+++ b/definitions/grib1/local.253.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.254.def b/definitions/grib1/local.254.def
index a2d8cb5..b0cbca7 100644
--- a/definitions/grib1/local.254.def
+++ b/definitions/grib1/local.254.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.46.def b/definitions/grib1/local.46.def
index 8e261a2..ad28112 100644
--- a/definitions/grib1/local.46.def
+++ b/definitions/grib1/local.46.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.54.def b/definitions/grib1/local.54.def
index e691159..8f8b035 100644
--- a/definitions/grib1/local.54.def
+++ b/definitions/grib1/local.54.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.7.1.def b/definitions/grib1/local.7.1.def
index fd2332e..ee699ad 100644
--- a/definitions/grib1/local.7.1.def
+++ b/definitions/grib1/local.7.1.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.80.def b/definitions/grib1/local.80.def
index 2c2e147..240e786 100644
--- a/definitions/grib1/local.80.def
+++ b/definitions/grib1/local.80.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.1.def b/definitions/grib1/local.98.1.def
index 448d1c3..4390be6 100644
--- a/definitions/grib1/local.98.1.def
+++ b/definitions/grib1/local.98.1.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.10.def b/definitions/grib1/local.98.10.def
index 1a4514e..54be0fe 100644
--- a/definitions/grib1/local.98.10.def
+++ b/definitions/grib1/local.98.10.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.11.def b/definitions/grib1/local.98.11.def
index f8bd53b..c9f9ef9 100644
--- a/definitions/grib1/local.98.11.def
+++ b/definitions/grib1/local.98.11.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.13.def b/definitions/grib1/local.98.13.def
index a69e672..5e5ba6c 100644
--- a/definitions/grib1/local.98.13.def
+++ b/definitions/grib1/local.98.13.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.14.def b/definitions/grib1/local.98.14.def
index 4954946..3a0859c 100644
--- a/definitions/grib1/local.98.14.def
+++ b/definitions/grib1/local.98.14.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.15.def b/definitions/grib1/local.98.15.def
index 5a1c445..80cdb7b 100644
--- a/definitions/grib1/local.98.15.def
+++ b/definitions/grib1/local.98.15.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.16.def b/definitions/grib1/local.98.16.def
index a905c5d..aba096e 100644
--- a/definitions/grib1/local.98.16.def
+++ b/definitions/grib1/local.98.16.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.17.def b/definitions/grib1/local.98.17.def
index 878cee6..55f9f7e 100644
--- a/definitions/grib1/local.98.17.def
+++ b/definitions/grib1/local.98.17.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.18.def b/definitions/grib1/local.98.18.def
index d9dc593..c4434fc 100644
--- a/definitions/grib1/local.98.18.def
+++ b/definitions/grib1/local.98.18.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.19.def b/definitions/grib1/local.98.19.def
index 10c71bf..5158c4d 100644
--- a/definitions/grib1/local.98.19.def
+++ b/definitions/grib1/local.98.19.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.190.def b/definitions/grib1/local.98.190.def
index f4c6d32..d7c7ac9 100644
--- a/definitions/grib1/local.98.190.def
+++ b/definitions/grib1/local.98.190.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.191.def b/definitions/grib1/local.98.191.def
index 6a7fce4..ab22d21 100644
--- a/definitions/grib1/local.98.191.def
+++ b/definitions/grib1/local.98.191.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.192.def b/definitions/grib1/local.98.192.def
index 9d8b5e6..108e2ed 100644
--- a/definitions/grib1/local.98.192.def
+++ b/definitions/grib1/local.98.192.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.2.def b/definitions/grib1/local.98.2.def
index ea96600..ceb201c 100644
--- a/definitions/grib1/local.98.2.def
+++ b/definitions/grib1/local.98.2.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.20.def b/definitions/grib1/local.98.20.def
index a1e4758..43e4d38 100644
--- a/definitions/grib1/local.98.20.def
+++ b/definitions/grib1/local.98.20.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.21.def b/definitions/grib1/local.98.21.def
index cfd0ba4..f9e190b 100644
--- a/definitions/grib1/local.98.21.def
+++ b/definitions/grib1/local.98.21.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.218.def b/definitions/grib1/local.98.218.def
index e3dfa11..fd773f6 100644
--- a/definitions/grib1/local.98.218.def
+++ b/definitions/grib1/local.98.218.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.23.def b/definitions/grib1/local.98.23.def
index 83f3906..c90db91 100644
--- a/definitions/grib1/local.98.23.def
+++ b/definitions/grib1/local.98.23.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.24.def b/definitions/grib1/local.98.24.def
index d7f4fdf..a7eeb9e 100644
--- a/definitions/grib1/local.98.24.def
+++ b/definitions/grib1/local.98.24.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.25.def b/definitions/grib1/local.98.25.def
index a8562b3..710c4aa 100644
--- a/definitions/grib1/local.98.25.def
+++ b/definitions/grib1/local.98.25.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.26.def b/definitions/grib1/local.98.26.def
index 53fe7b4..3fcb920 100644
--- a/definitions/grib1/local.98.26.def
+++ b/definitions/grib1/local.98.26.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.27.def b/definitions/grib1/local.98.27.def
index 5e2a6cf..9781b98 100644
--- a/definitions/grib1/local.98.27.def
+++ b/definitions/grib1/local.98.27.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.28.def b/definitions/grib1/local.98.28.def
index 68b7491..2a8b135 100644
--- a/definitions/grib1/local.98.28.def
+++ b/definitions/grib1/local.98.28.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.29.def b/definitions/grib1/local.98.29.def
index 644e821..68b5b3a 100644
--- a/definitions/grib1/local.98.29.def
+++ b/definitions/grib1/local.98.29.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.3.def b/definitions/grib1/local.98.3.def
index efbfd9a..3dad31d 100644
--- a/definitions/grib1/local.98.3.def
+++ b/definitions/grib1/local.98.3.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.30.def b/definitions/grib1/local.98.30.def
index a46912c..684ae5c 100644
--- a/definitions/grib1/local.98.30.def
+++ b/definitions/grib1/local.98.30.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.31.def b/definitions/grib1/local.98.31.def
index d45eaff..cc77c48 100644
--- a/definitions/grib1/local.98.31.def
+++ b/definitions/grib1/local.98.31.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.32.def b/definitions/grib1/local.98.32.def
index 04717fe..a135cf5 100644
--- a/definitions/grib1/local.98.32.def
+++ b/definitions/grib1/local.98.32.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.33.def b/definitions/grib1/local.98.33.def
index 410fa84..ab19dab 100644
--- a/definitions/grib1/local.98.33.def
+++ b/definitions/grib1/local.98.33.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.35.def b/definitions/grib1/local.98.35.def
index 9814e96..b6b4e2f 100644
--- a/definitions/grib1/local.98.35.def
+++ b/definitions/grib1/local.98.35.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.36.def b/definitions/grib1/local.98.36.def
index 1cb248e..104220d 100644
--- a/definitions/grib1/local.98.36.def
+++ b/definitions/grib1/local.98.36.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.37.def b/definitions/grib1/local.98.37.def
index 491cff6..b8d6552 100644
--- a/definitions/grib1/local.98.37.def
+++ b/definitions/grib1/local.98.37.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.38.def b/definitions/grib1/local.98.38.def
index a0ab347..744964c 100644
--- a/definitions/grib1/local.98.38.def
+++ b/definitions/grib1/local.98.38.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.39.def b/definitions/grib1/local.98.39.def
index 3f5f2bf..e7ceb20 100644
--- a/definitions/grib1/local.98.39.def
+++ b/definitions/grib1/local.98.39.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.4.def b/definitions/grib1/local.98.4.def
index 273bef5..607bf23 100644
--- a/definitions/grib1/local.98.4.def
+++ b/definitions/grib1/local.98.4.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.40.def b/definitions/grib1/local.98.40.def
index 54affa1..524fa7c 100644
--- a/definitions/grib1/local.98.40.def
+++ b/definitions/grib1/local.98.40.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.5.def b/definitions/grib1/local.98.5.def
index 2f77297..2858149 100644
--- a/definitions/grib1/local.98.5.def
+++ b/definitions/grib1/local.98.5.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.50.def b/definitions/grib1/local.98.50.def
index acaa823..31cb96f 100644
--- a/definitions/grib1/local.98.50.def
+++ b/definitions/grib1/local.98.50.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.6.def b/definitions/grib1/local.98.6.def
index c91cbf1..904c9f2 100644
--- a/definitions/grib1/local.98.6.def
+++ b/definitions/grib1/local.98.6.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.7.def b/definitions/grib1/local.98.7.def
index 16a2119..0f1faee 100644
--- a/definitions/grib1/local.98.7.def
+++ b/definitions/grib1/local.98.7.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.8.def b/definitions/grib1/local.98.8.def
index f31b0f1..d48924f 100644
--- a/definitions/grib1/local.98.8.def
+++ b/definitions/grib1/local.98.8.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.9.def b/definitions/grib1/local.98.9.def
index 105fe94..85268c3 100644
--- a/definitions/grib1/local.98.9.def
+++ b/definitions/grib1/local.98.9.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local.98.def b/definitions/grib1/local.98.def
index 9d27a13..e1fd371 100644
--- a/definitions/grib1/local.98.def
+++ b/definitions/grib1/local.98.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/localConcepts/ecmf/cfVarName.def b/definitions/grib1/localConcepts/ecmf/cfVarName.def
index a6b8bb7..469a0d8 100644
--- a/definitions/grib1/localConcepts/ecmf/cfVarName.def
+++ b/definitions/grib1/localConcepts/ecmf/cfVarName.def
@@ -434,12 +434,12 @@
 	 table2Version = 128 ;
 	 indicatorOfParameter = 77 ;
 	}
-#Total column liquid water
+#Total column cloud liquid water
 'tclw' = {
 	 table2Version = 128 ;
 	 indicatorOfParameter = 78 ;
 	}
-#Total column ice water
+#Total column cloud ice water
 'tciw' = {
 	 table2Version = 128 ;
 	 indicatorOfParameter = 79 ;
@@ -3714,8 +3714,8 @@
 	 table2Version = 174 ;
 	 indicatorOfParameter = 52 ;
 	}
-#2m specific humidity
-'p174096' = {
+#2 metre specific humidity
+'sh2' = {
 	 table2Version = 174 ;
 	 indicatorOfParameter = 96 ;
 	}
@@ -9309,12 +9309,12 @@
 	 table2Version = 228 ;
 	 indicatorOfParameter = 46 ;
 	}
-#Height of Zero Deg Wet Bulb Temperature
+#Height of zero-degree wet-bulb temperature
 'hwbt0' = {
 	 table2Version = 228 ;
 	 indicatorOfParameter = 47 ;
 	}
-#Height of One Deg Wet Bulb Temperature
+#Height of one-degree wet-bulb temperature
 'hwbt1' = {
 	 table2Version = 228 ;
 	 indicatorOfParameter = 48 ;
diff --git a/definitions/grib1/localConcepts/ecmf/name.def b/definitions/grib1/localConcepts/ecmf/name.def
index 62cd253..55c0b30 100644
--- a/definitions/grib1/localConcepts/ecmf/name.def
+++ b/definitions/grib1/localConcepts/ecmf/name.def
@@ -434,13 +434,13 @@
 	 table2Version = 128 ;
 	 indicatorOfParameter = 77 ;
 	}
-#Total column liquid water
-'Total column liquid water' = {
+#Total column cloud liquid water
+'Total column cloud liquid water' = {
 	 table2Version = 128 ;
 	 indicatorOfParameter = 78 ;
 	}
-#Total column ice water
-'Total column ice water' = {
+#Total column cloud ice water
+'Total column cloud ice water' = {
 	 table2Version = 128 ;
 	 indicatorOfParameter = 79 ;
 	}
@@ -3714,8 +3714,8 @@
 	 table2Version = 174 ;
 	 indicatorOfParameter = 52 ;
 	}
-#2m specific humidity
-'2m specific humidity' = {
+#2 metre specific humidity
+'2 metre specific humidity' = {
 	 table2Version = 174 ;
 	 indicatorOfParameter = 96 ;
 	}
@@ -9309,13 +9309,13 @@
 	 table2Version = 228 ;
 	 indicatorOfParameter = 46 ;
 	}
-#Height of Zero Deg Wet Bulb Temperature
-'Height of Zero Deg Wet Bulb Temperature' = {
+#Height of zero-degree wet-bulb temperature
+'Height of zero-degree wet-bulb temperature' = {
 	 table2Version = 228 ;
 	 indicatorOfParameter = 47 ;
 	}
-#Height of One Deg Wet Bulb Temperature
-'Height of One Deg Wet Bulb Temperature' = {
+#Height of one-degree wet-bulb temperature
+'Height of one-degree wet-bulb temperature' = {
 	 table2Version = 228 ;
 	 indicatorOfParameter = 48 ;
 	}
diff --git a/definitions/grib1/localConcepts/ecmf/paramId.def b/definitions/grib1/localConcepts/ecmf/paramId.def
index 8894182..2d86f90 100644
--- a/definitions/grib1/localConcepts/ecmf/paramId.def
+++ b/definitions/grib1/localConcepts/ecmf/paramId.def
@@ -434,12 +434,12 @@
 	 table2Version = 128 ;
 	 indicatorOfParameter = 77 ;
 	}
-#Total column liquid water
+#Total column cloud liquid water
 '78' = {
 	 table2Version = 128 ;
 	 indicatorOfParameter = 78 ;
 	}
-#Total column ice water
+#Total column cloud ice water
 '79' = {
 	 table2Version = 128 ;
 	 indicatorOfParameter = 79 ;
@@ -3714,7 +3714,7 @@
 	 table2Version = 174 ;
 	 indicatorOfParameter = 52 ;
 	}
-#2m specific humidity
+#2 metre specific humidity
 '174096' = {
 	 table2Version = 174 ;
 	 indicatorOfParameter = 96 ;
@@ -9309,12 +9309,12 @@
 	 table2Version = 228 ;
 	 indicatorOfParameter = 46 ;
 	}
-#Height of Zero Deg Wet Bulb Temperature
+#Height of zero-degree wet-bulb temperature
 '228047' = {
 	 table2Version = 228 ;
 	 indicatorOfParameter = 47 ;
 	}
-#Height of One Deg Wet Bulb Temperature
+#Height of one-degree wet-bulb temperature
 '228048' = {
 	 table2Version = 228 ;
 	 indicatorOfParameter = 48 ;
diff --git a/definitions/grib1/localConcepts/ecmf/shortName.def b/definitions/grib1/localConcepts/ecmf/shortName.def
index bae073d..e9ae904 100644
--- a/definitions/grib1/localConcepts/ecmf/shortName.def
+++ b/definitions/grib1/localConcepts/ecmf/shortName.def
@@ -434,12 +434,12 @@
 	 table2Version = 128 ;
 	 indicatorOfParameter = 77 ;
 	}
-#Total column liquid water
+#Total column cloud liquid water
 'tclw' = {
 	 table2Version = 128 ;
 	 indicatorOfParameter = 78 ;
 	}
-#Total column ice water
+#Total column cloud ice water
 'tciw' = {
 	 table2Version = 128 ;
 	 indicatorOfParameter = 79 ;
@@ -3714,8 +3714,8 @@
 	 table2Version = 174 ;
 	 indicatorOfParameter = 52 ;
 	}
-#2m specific humidity
-'~' = {
+#2 metre specific humidity
+'2sh' = {
 	 table2Version = 174 ;
 	 indicatorOfParameter = 96 ;
 	}
@@ -9309,12 +9309,12 @@
 	 table2Version = 228 ;
 	 indicatorOfParameter = 46 ;
 	}
-#Height of Zero Deg Wet Bulb Temperature
+#Height of zero-degree wet-bulb temperature
 'hwbt0' = {
 	 table2Version = 228 ;
 	 indicatorOfParameter = 47 ;
 	}
-#Height of One Deg Wet Bulb Temperature
+#Height of one-degree wet-bulb temperature
 'hwbt1' = {
 	 table2Version = 228 ;
 	 indicatorOfParameter = 48 ;
diff --git a/definitions/grib1/localConcepts/ecmf/units.def b/definitions/grib1/localConcepts/ecmf/units.def
index f6b8840..fba4757 100644
--- a/definitions/grib1/localConcepts/ecmf/units.def
+++ b/definitions/grib1/localConcepts/ecmf/units.def
@@ -434,12 +434,12 @@
 	 table2Version = 128 ;
 	 indicatorOfParameter = 77 ;
 	}
-#Total column liquid water
+#Total column cloud liquid water
 'kg m**-2' = {
 	 table2Version = 128 ;
 	 indicatorOfParameter = 78 ;
 	}
-#Total column ice water
+#Total column cloud ice water
 'kg m**-2' = {
 	 table2Version = 128 ;
 	 indicatorOfParameter = 79 ;
@@ -3714,7 +3714,7 @@
 	 table2Version = 174 ;
 	 indicatorOfParameter = 52 ;
 	}
-#2m specific humidity
+#2 metre specific humidity
 'kg kg**-1' = {
 	 table2Version = 174 ;
 	 indicatorOfParameter = 96 ;
@@ -9309,12 +9309,12 @@
 	 table2Version = 228 ;
 	 indicatorOfParameter = 46 ;
 	}
-#Height of Zero Deg Wet Bulb Temperature
+#Height of zero-degree wet-bulb temperature
 'm' = {
 	 table2Version = 228 ;
 	 indicatorOfParameter = 47 ;
 	}
-#Height of One Deg Wet Bulb Temperature
+#Height of one-degree wet-bulb temperature
 'm' = {
 	 table2Version = 228 ;
 	 indicatorOfParameter = 48 ;
diff --git a/definitions/grib1/localConcepts/rjtd/cfVarName.def b/definitions/grib1/localConcepts/rjtd/cfVarName.def
index baf0821..9a4dd4e 100644
--- a/definitions/grib1/localConcepts/rjtd/cfVarName.def
+++ b/definitions/grib1/localConcepts/rjtd/cfVarName.def
@@ -19,6 +19,16 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 32 ;
 	}
+#Sea-ice cover
+'ci' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 91 ;
+	}
+#Montgomery potential
+'mont' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 37 ;
+	}
 #Pressure
 'pres' = {
 	 table2Version = 200 ;
@@ -54,11 +64,22 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 51 ;
 	}
+#Surface pressure
+'sp' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 1 ;
+	 indicatorOfTypeOfLevel = 1 ;
+	}
 #Vertical velocity
 'w' = {
 	 table2Version = 200 ;
 	 indicatorOfParameter = 39 ;
 	}
+#Total column water vapour
+'tcwv' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 54 ;
+	}
 #Vorticity (relative)
 'vo' = {
 	 table2Version = 200 ;
@@ -84,6 +105,27 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 52 ;
 	}
+#10 metre U wind component
+'u10' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 33 ;
+	 indicatorOfTypeOfLevel = 105 ;
+	 level = 10 ;
+	}
+#10 metre V wind component
+'v10' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 34 ;
+	 indicatorOfTypeOfLevel = 105 ;
+	 topLevel = 10 ;
+	}
+#2 metre temperature
+'t2m' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 11 ;
+	 indicatorOfTypeOfLevel = 105 ;
+	 level = 2 ;
+	}
 #Land-sea mask
 'lsm' = {
 	 table2Version = 200 ;
@@ -105,7 +147,7 @@
 	 indicatorOfParameter = 229 ;
 	}
 #Snow depth
-'sd' = {
+'sde' = {
 	 table2Version = 200 ;
 	 indicatorOfParameter = 66 ;
 	}
@@ -149,6 +191,13 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 123 ;
 	}
+#2 metre specific humidity
+'sh2' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 51 ;
+	 indicatorOfTypeOfLevel = 105 ;
+	 level = 2 ;
+	}
 #Convective snow
 'snoc' = {
 	 table2Version = 200 ;
@@ -194,8 +243,8 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 146 ;
 	}
-#Total ozone
-'tozne' = {
+#Total column integrated ozone
+'tcioz' = {
 	 table2Version = 200 ;
 	 indicatorOfParameter = 10 ;
 	}
@@ -204,6 +253,13 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 155 ;
 	}
+#2 metre relative humidity
+'r2' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 52 ;
+	 indicatorOfTypeOfLevel = 105 ;
+	 level = 2 ;
+	}
 #Clear Sky Downward Solar Flux
 'csdsf' = {
 	 table2Version = 200 ;
@@ -269,11 +325,6 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 151 ;
 	}
-#Meridional water vapour flux
-'vwvclm' = {
-	 table2Version = 200 ;
-	 indicatorOfParameter = 152 ;
-	}
 #Adiabatic meridional acceleration
 'advaprs' = {
 	 table2Version = 200 ;
@@ -379,16 +430,6 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 159 ;
 	}
-#Zonal thermal energy flux
-'utheclm' = {
-	 table2Version = 200 ;
-	 indicatorOfParameter = 190 ;
-	}
-#Meridional thermal energy flux
-'vtheclm' = {
-	 table2Version = 200 ;
-	 indicatorOfParameter = 191 ;
-	}
 #Convective meridional acceleration
 'cnvvahbl' = {
 	 table2Version = 200 ;
@@ -589,11 +630,6 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 31 ;
 	}
-#Montgomery stream Function
-'mntsf' = {
-	 table2Version = 200 ;
-	 indicatorOfParameter = 37 ;
-	}
 #Sigma coordinate vertical velocity
 'sgcvv' = {
 	 table2Version = 200 ;
@@ -644,11 +680,6 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 53 ;
 	}
-#Precipitable water
-'pwat' = {
-	 table2Version = 200 ;
-	 indicatorOfParameter = 54 ;
-	}
 #Vapour pressure
 'vp' = {
 	 table2Version = 200 ;
@@ -719,11 +750,6 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 89 ;
 	}
-#Ice cover (1=ice, 0=no ice)
-'icec' = {
-	 table2Version = 200 ;
-	 indicatorOfParameter = 91 ;
-	}
 #Ice thickness
 'icetk' = {
 	 table2Version = 200 ;
@@ -830,7 +856,7 @@
 	 indicatorOfParameter = 112 ;
 	}
 #Net short-wave radiation flux(atmosph.top)
-'nlwrt' = {
+'nswrt' = {
 	 table2Version = 200 ;
 	 indicatorOfParameter = 113 ;
 	}
@@ -894,11 +920,26 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 87 ;
 	}
+#Vertical integral of eastward heat flux
+'vithee' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 190 ;
+	}
+#Vertical integral of northward heat flux
+'vithen' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 191 ;
+	}
 #Vertical integral of eastward water vapour flux
-'vi' = {
+'viwve' = {
 	 table2Version = 200 ;
 	 indicatorOfParameter = 157 ;
 	}
+#Vertical integral of northward water vapour flux
+'viwvn' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 152 ;
+	}
 #specific cloud water content
 'qc' = {
 	 table2Version = 200 ;
diff --git a/definitions/grib1/localConcepts/rjtd/name.def b/definitions/grib1/localConcepts/rjtd/name.def
index 6be149d..e0b2d03 100644
--- a/definitions/grib1/localConcepts/rjtd/name.def
+++ b/definitions/grib1/localConcepts/rjtd/name.def
@@ -19,6 +19,16 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 32 ;
 	}
+#Sea-ice cover
+'Sea-ice cover' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 91 ;
+	}
+#Montgomery potential
+'Montgomery potential' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 37 ;
+	}
 #Pressure
 'Pressure' = {
 	 table2Version = 200 ;
@@ -54,11 +64,22 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 51 ;
 	}
+#Surface pressure
+'Surface pressure' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 1 ;
+	 indicatorOfTypeOfLevel = 1 ;
+	}
 #Vertical velocity
 'Vertical velocity' = {
 	 table2Version = 200 ;
 	 indicatorOfParameter = 39 ;
 	}
+#Total column water vapour
+'Total column water vapour' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 54 ;
+	}
 #Vorticity (relative)
 'Vorticity (relative)' = {
 	 table2Version = 200 ;
@@ -84,6 +105,27 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 52 ;
 	}
+#10 metre U wind component
+'10 metre U wind component' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 33 ;
+	 indicatorOfTypeOfLevel = 105 ;
+	 level = 10 ;
+	}
+#10 metre V wind component
+'10 metre V wind component' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 34 ;
+	 indicatorOfTypeOfLevel = 105 ;
+	 topLevel = 10 ;
+	}
+#2 metre temperature
+'2 metre temperature' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 11 ;
+	 indicatorOfTypeOfLevel = 105 ;
+	 level = 2 ;
+	}
 #Land-sea mask
 'Land-sea mask' = {
 	 table2Version = 200 ;
@@ -149,6 +191,13 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 123 ;
 	}
+#2 metre specific humidity
+'2 metre specific humidity' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 51 ;
+	 indicatorOfTypeOfLevel = 105 ;
+	 level = 2 ;
+	}
 #Convective snow
 'Convective snow' = {
 	 table2Version = 200 ;
@@ -194,8 +243,8 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 146 ;
 	}
-#Total ozone
-'Total ozone' = {
+#Total column integrated ozone
+'Total column integrated ozone' = {
 	 table2Version = 200 ;
 	 indicatorOfParameter = 10 ;
 	}
@@ -204,6 +253,13 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 155 ;
 	}
+#2 metre relative humidity
+'2 metre relative humidity' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 52 ;
+	 indicatorOfTypeOfLevel = 105 ;
+	 level = 2 ;
+	}
 #Clear Sky Downward Solar Flux
 'Clear Sky Downward Solar Flux' = {
 	 table2Version = 200 ;
@@ -269,11 +325,6 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 151 ;
 	}
-#Meridional water vapour flux
-'Meridional water vapour flux' = {
-	 table2Version = 200 ;
-	 indicatorOfParameter = 152 ;
-	}
 #Adiabatic meridional acceleration
 'Adiabatic meridional acceleration' = {
 	 table2Version = 200 ;
@@ -379,16 +430,6 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 159 ;
 	}
-#Zonal thermal energy flux
-'Zonal thermal energy flux' = {
-	 table2Version = 200 ;
-	 indicatorOfParameter = 190 ;
-	}
-#Meridional thermal energy flux
-'Meridional thermal energy flux' = {
-	 table2Version = 200 ;
-	 indicatorOfParameter = 191 ;
-	}
 #Convective meridional acceleration
 'Convective meridional acceleration' = {
 	 table2Version = 200 ;
@@ -589,11 +630,6 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 31 ;
 	}
-#Montgomery stream Function
-'Montgomery stream Function' = {
-	 table2Version = 200 ;
-	 indicatorOfParameter = 37 ;
-	}
 #Sigma coordinate vertical velocity
 'Sigma coordinate vertical velocity' = {
 	 table2Version = 200 ;
@@ -644,11 +680,6 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 53 ;
 	}
-#Precipitable water
-'Precipitable water' = {
-	 table2Version = 200 ;
-	 indicatorOfParameter = 54 ;
-	}
 #Vapour pressure
 'Vapour pressure' = {
 	 table2Version = 200 ;
@@ -719,11 +750,6 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 89 ;
 	}
-#Ice cover (1=ice, 0=no ice)
-'Ice cover (1=ice, 0=no ice)' = {
-	 table2Version = 200 ;
-	 indicatorOfParameter = 91 ;
-	}
 #Ice thickness
 'Ice thickness' = {
 	 table2Version = 200 ;
@@ -894,11 +920,26 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 87 ;
 	}
+#Vertical integral of eastward heat flux
+'Vertical integral of eastward heat flux' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 190 ;
+	}
+#Vertical integral of northward heat flux
+'Vertical integral of northward heat flux' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 191 ;
+	}
 #Vertical integral of eastward water vapour flux
 'Vertical integral of eastward water vapour flux' = {
 	 table2Version = 200 ;
 	 indicatorOfParameter = 157 ;
 	}
+#Vertical integral of northward water vapour flux
+'Vertical integral of northward water vapour flux' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 152 ;
+	}
 #specific cloud water content
 'specific cloud water content' = {
 	 table2Version = 200 ;
diff --git a/definitions/grib1/localConcepts/rjtd/paramId.def b/definitions/grib1/localConcepts/rjtd/paramId.def
index d118500..8c32276 100644
--- a/definitions/grib1/localConcepts/rjtd/paramId.def
+++ b/definitions/grib1/localConcepts/rjtd/paramId.def
@@ -19,6 +19,16 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 32 ;
 	}
+#Sea-ice cover
+'31' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 91 ;
+	}
+#Montgomery potential
+'53' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 37 ;
+	}
 #Pressure
 '54' = {
 	 table2Version = 200 ;
@@ -54,11 +64,22 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 51 ;
 	}
+#Surface pressure
+'134' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 1 ;
+	 indicatorOfTypeOfLevel = 1 ;
+	}
 #Vertical velocity
 '135' = {
 	 table2Version = 200 ;
 	 indicatorOfParameter = 39 ;
 	}
+#Total column water vapour
+'137' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 54 ;
+	}
 #Vorticity (relative)
 '138' = {
 	 table2Version = 200 ;
@@ -84,6 +105,27 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 52 ;
 	}
+#10 metre U wind component
+'165' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 33 ;
+	 indicatorOfTypeOfLevel = 105 ;
+	 level = 10 ;
+	}
+#10 metre V wind component
+'166' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 34 ;
+	 indicatorOfTypeOfLevel = 105 ;
+	 topLevel = 10 ;
+	}
+#2 metre temperature
+'167' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 11 ;
+	 indicatorOfTypeOfLevel = 105 ;
+	 level = 2 ;
+	}
 #Land-sea mask
 '172' = {
 	 table2Version = 200 ;
@@ -149,6 +191,13 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 123 ;
 	}
+#2 metre specific humidity
+'174096' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 51 ;
+	 indicatorOfTypeOfLevel = 105 ;
+	 level = 2 ;
+	}
 #Convective snow
 '260011' = {
 	 table2Version = 200 ;
@@ -194,8 +243,8 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 146 ;
 	}
-#Total ozone
-'260130' = {
+#Total column integrated ozone
+'260132' = {
 	 table2Version = 200 ;
 	 indicatorOfParameter = 10 ;
 	}
@@ -204,6 +253,13 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 155 ;
 	}
+#2 metre relative humidity
+'260242' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 52 ;
+	 indicatorOfTypeOfLevel = 105 ;
+	 level = 2 ;
+	}
 #Clear Sky Downward Solar Flux
 '260342' = {
 	 table2Version = 200 ;
@@ -269,11 +325,6 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 151 ;
 	}
-#Meridional water vapour flux
-'260608' = {
-	 table2Version = 200 ;
-	 indicatorOfParameter = 152 ;
-	}
 #Adiabatic meridional acceleration
 '260609' = {
 	 table2Version = 200 ;
@@ -379,16 +430,6 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 159 ;
 	}
-#Zonal thermal energy flux
-'260630' = {
-	 table2Version = 200 ;
-	 indicatorOfParameter = 190 ;
-	}
-#Meridional thermal energy flux
-'260631' = {
-	 table2Version = 200 ;
-	 indicatorOfParameter = 191 ;
-	}
 #Convective meridional acceleration
 '260632' = {
 	 table2Version = 200 ;
@@ -589,11 +630,6 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 31 ;
 	}
-#Montgomery stream Function
-'3037' = {
-	 table2Version = 200 ;
-	 indicatorOfParameter = 37 ;
-	}
 #Sigma coordinate vertical velocity
 '3038' = {
 	 table2Version = 200 ;
@@ -644,11 +680,6 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 53 ;
 	}
-#Precipitable water
-'3054' = {
-	 table2Version = 200 ;
-	 indicatorOfParameter = 54 ;
-	}
 #Vapour pressure
 '3055' = {
 	 table2Version = 200 ;
@@ -719,11 +750,6 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 89 ;
 	}
-#Ice cover (1=ice, 0=no ice)
-'3091' = {
-	 table2Version = 200 ;
-	 indicatorOfParameter = 91 ;
-	}
 #Ice thickness
 '3092' = {
 	 table2Version = 200 ;
@@ -894,11 +920,26 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 87 ;
 	}
+#Vertical integral of eastward heat flux
+'162069' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 190 ;
+	}
+#Vertical integral of northward heat flux
+'162070' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 191 ;
+	}
 #Vertical integral of eastward water vapour flux
 '162071' = {
 	 table2Version = 200 ;
 	 indicatorOfParameter = 157 ;
 	}
+#Vertical integral of northward water vapour flux
+'162072' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 152 ;
+	}
 #specific cloud water content
 '201031' = {
 	 table2Version = 200 ;
diff --git a/definitions/grib1/localConcepts/rjtd/shortName.def b/definitions/grib1/localConcepts/rjtd/shortName.def
index 299432f..f0dd3be 100644
--- a/definitions/grib1/localConcepts/rjtd/shortName.def
+++ b/definitions/grib1/localConcepts/rjtd/shortName.def
@@ -19,6 +19,16 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 32 ;
 	}
+#Sea-ice cover
+'ci' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 91 ;
+	}
+#Montgomery potential
+'mont' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 37 ;
+	}
 #Pressure
 'pres' = {
 	 table2Version = 200 ;
@@ -54,11 +64,22 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 51 ;
 	}
+#Surface pressure
+'sp' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 1 ;
+	 indicatorOfTypeOfLevel = 1 ;
+	}
 #Vertical velocity
 'w' = {
 	 table2Version = 200 ;
 	 indicatorOfParameter = 39 ;
 	}
+#Total column water vapour
+'tcwv' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 54 ;
+	}
 #Vorticity (relative)
 'vo' = {
 	 table2Version = 200 ;
@@ -84,6 +105,27 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 52 ;
 	}
+#10 metre U wind component
+'10u' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 33 ;
+	 indicatorOfTypeOfLevel = 105 ;
+	 level = 10 ;
+	}
+#10 metre V wind component
+'10v' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 34 ;
+	 indicatorOfTypeOfLevel = 105 ;
+	 topLevel = 10 ;
+	}
+#2 metre temperature
+'2t' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 11 ;
+	 indicatorOfTypeOfLevel = 105 ;
+	 level = 2 ;
+	}
 #Land-sea mask
 'lsm' = {
 	 table2Version = 200 ;
@@ -149,6 +191,13 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 123 ;
 	}
+#2 metre specific humidity
+'2sh' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 51 ;
+	 indicatorOfTypeOfLevel = 105 ;
+	 level = 2 ;
+	}
 #Convective snow
 'snoc' = {
 	 table2Version = 200 ;
@@ -194,8 +243,8 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 146 ;
 	}
-#Total ozone
-'tozne' = {
+#Total column integrated ozone
+'tcioz' = {
 	 table2Version = 200 ;
 	 indicatorOfParameter = 10 ;
 	}
@@ -204,6 +253,13 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 155 ;
 	}
+#2 metre relative humidity
+'2r' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 52 ;
+	 indicatorOfTypeOfLevel = 105 ;
+	 level = 2 ;
+	}
 #Clear Sky Downward Solar Flux
 'csdsf' = {
 	 table2Version = 200 ;
@@ -269,11 +325,6 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 151 ;
 	}
-#Meridional water vapour flux
-'vwvclm' = {
-	 table2Version = 200 ;
-	 indicatorOfParameter = 152 ;
-	}
 #Adiabatic meridional acceleration
 'advaprs' = {
 	 table2Version = 200 ;
@@ -379,16 +430,6 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 159 ;
 	}
-#Zonal thermal energy flux
-'utheclm' = {
-	 table2Version = 200 ;
-	 indicatorOfParameter = 190 ;
-	}
-#Meridional thermal energy flux
-'vtheclm' = {
-	 table2Version = 200 ;
-	 indicatorOfParameter = 191 ;
-	}
 #Convective meridional acceleration
 'cnvvahbl' = {
 	 table2Version = 200 ;
@@ -589,11 +630,6 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 31 ;
 	}
-#Montgomery stream Function
-'mntsf' = {
-	 table2Version = 200 ;
-	 indicatorOfParameter = 37 ;
-	}
 #Sigma coordinate vertical velocity
 'sgcvv' = {
 	 table2Version = 200 ;
@@ -644,11 +680,6 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 53 ;
 	}
-#Precipitable water
-'pwat' = {
-	 table2Version = 200 ;
-	 indicatorOfParameter = 54 ;
-	}
 #Vapour pressure
 'vp' = {
 	 table2Version = 200 ;
@@ -719,11 +750,6 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 89 ;
 	}
-#Ice cover (1=ice, 0=no ice)
-'icec' = {
-	 table2Version = 200 ;
-	 indicatorOfParameter = 91 ;
-	}
 #Ice thickness
 'icetk' = {
 	 table2Version = 200 ;
@@ -894,11 +920,26 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 87 ;
 	}
+#Vertical integral of eastward heat flux
+'vithee' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 190 ;
+	}
+#Vertical integral of northward heat flux
+'vithen' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 191 ;
+	}
 #Vertical integral of eastward water vapour flux
 'viwve' = {
 	 table2Version = 200 ;
 	 indicatorOfParameter = 157 ;
 	}
+#Vertical integral of northward water vapour flux
+'viwvn' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 152 ;
+	}
 #specific cloud water content
 'qc' = {
 	 table2Version = 200 ;
diff --git a/definitions/grib1/localConcepts/rjtd/units.def b/definitions/grib1/localConcepts/rjtd/units.def
index 4b562a5..2d67d1f 100644
--- a/definitions/grib1/localConcepts/rjtd/units.def
+++ b/definitions/grib1/localConcepts/rjtd/units.def
@@ -19,6 +19,16 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 32 ;
 	}
+#Sea-ice cover
+'(0 - 1)' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 91 ;
+	}
+#Montgomery potential
+'m**2 s**-2' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 37 ;
+	}
 #Pressure
 'Pa' = {
 	 table2Version = 200 ;
@@ -54,11 +64,22 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 51 ;
 	}
+#Surface pressure
+'Pa' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 1 ;
+	 indicatorOfTypeOfLevel = 1 ;
+	}
 #Vertical velocity
 'Pa s**-1' = {
 	 table2Version = 200 ;
 	 indicatorOfParameter = 39 ;
 	}
+#Total column water vapour
+'kg m**-2' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 54 ;
+	}
 #Vorticity (relative)
 's**-1' = {
 	 table2Version = 200 ;
@@ -84,6 +105,27 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 52 ;
 	}
+#10 metre U wind component
+'m s**-1' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 33 ;
+	 indicatorOfTypeOfLevel = 105 ;
+	 level = 10 ;
+	}
+#10 metre V wind component
+'m s**-1' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 34 ;
+	 indicatorOfTypeOfLevel = 105 ;
+	 topLevel = 10 ;
+	}
+#2 metre temperature
+'K' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 11 ;
+	 indicatorOfTypeOfLevel = 105 ;
+	 level = 2 ;
+	}
 #Land-sea mask
 '(0 - 1)' = {
 	 table2Version = 200 ;
@@ -149,6 +191,13 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 123 ;
 	}
+#2 metre specific humidity
+'kg kg**-1' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 51 ;
+	 indicatorOfTypeOfLevel = 105 ;
+	 level = 2 ;
+	}
 #Convective snow
 'kg m**-2' = {
 	 table2Version = 200 ;
@@ -194,7 +243,7 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 146 ;
 	}
-#Total ozone
+#Total column integrated ozone
 'DU' = {
 	 table2Version = 200 ;
 	 indicatorOfParameter = 10 ;
@@ -204,6 +253,13 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 155 ;
 	}
+#2 metre relative humidity
+'%' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 52 ;
+	 indicatorOfTypeOfLevel = 105 ;
+	 level = 2 ;
+	}
 #Clear Sky Downward Solar Flux
 'W m**-2' = {
 	 table2Version = 200 ;
@@ -269,11 +325,6 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 151 ;
 	}
-#Meridional water vapour flux
-'kg m**-1 s**-1' = {
-	 table2Version = 200 ;
-	 indicatorOfParameter = 152 ;
-	}
 #Adiabatic meridional acceleration
 'm s**-1 per day' = {
 	 table2Version = 200 ;
@@ -379,16 +430,6 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 159 ;
 	}
-#Zonal thermal energy flux
-'W m**-1' = {
-	 table2Version = 200 ;
-	 indicatorOfParameter = 190 ;
-	}
-#Meridional thermal energy flux
-'W m**-1' = {
-	 table2Version = 200 ;
-	 indicatorOfParameter = 191 ;
-	}
 #Convective meridional acceleration
 'm s**-1 per day' = {
 	 table2Version = 200 ;
@@ -589,11 +630,6 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 31 ;
 	}
-#Montgomery stream Function
-'m**2 s**-2' = {
-	 table2Version = 200 ;
-	 indicatorOfParameter = 37 ;
-	}
 #Sigma coordinate vertical velocity
 's**-1' = {
 	 table2Version = 200 ;
@@ -644,11 +680,6 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 53 ;
 	}
-#Precipitable water
-'kg m**-2' = {
-	 table2Version = 200 ;
-	 indicatorOfParameter = 54 ;
-	}
 #Vapour pressure
 'Pa' = {
 	 table2Version = 200 ;
@@ -719,11 +750,6 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 89 ;
 	}
-#Ice cover (1=ice, 0=no ice)
-'(0 - 1)' = {
-	 table2Version = 200 ;
-	 indicatorOfParameter = 91 ;
-	}
 #Ice thickness
 'm' = {
 	 table2Version = 200 ;
@@ -894,11 +920,26 @@
 	 table2Version = 200 ;
 	 indicatorOfParameter = 87 ;
 	}
+#Vertical integral of eastward heat flux
+'W m**-1' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 190 ;
+	}
+#Vertical integral of northward heat flux
+'W m**-1' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 191 ;
+	}
 #Vertical integral of eastward water vapour flux
 'kg m**-1 s**-1' = {
 	 table2Version = 200 ;
 	 indicatorOfParameter = 157 ;
 	}
+#Vertical integral of northward water vapour flux
+'kg m**-1 s**-1' = {
+	 table2Version = 200 ;
+	 indicatorOfParameter = 152 ;
+	}
 #specific cloud water content
 'kg kg**-1' = {
 	 table2Version = 200 ;
diff --git a/definitions/grib1/local_no_mars.98.1.def b/definitions/grib1/local_no_mars.98.1.def
index d8e4a63..2b6b17c 100644
--- a/definitions/grib1/local_no_mars.98.1.def
+++ b/definitions/grib1/local_no_mars.98.1.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/local_no_mars.98.24.def b/definitions/grib1/local_no_mars.98.24.def
index 0386239..37910f1 100644
--- a/definitions/grib1/local_no_mars.98.24.def
+++ b/definitions/grib1/local_no_mars.98.24.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/mars_labeling.23.def b/definitions/grib1/mars_labeling.23.def
index b2a1452..1cc0456 100644
--- a/definitions/grib1/mars_labeling.23.def
+++ b/definitions/grib1/mars_labeling.23.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/mars_labeling.4.def b/definitions/grib1/mars_labeling.4.def
index b2809b8..aafbfa0 100644
--- a/definitions/grib1/mars_labeling.4.def
+++ b/definitions/grib1/mars_labeling.4.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/mars_labeling.def b/definitions/grib1/mars_labeling.def
index e67758e..56e5aea 100644
--- a/definitions/grib1/mars_labeling.def
+++ b/definitions/grib1/mars_labeling.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/predefined_grid.def b/definitions/grib1/predefined_grid.def
index c35a5d7..292d86f 100644
--- a/definitions/grib1/predefined_grid.def
+++ b/definitions/grib1/predefined_grid.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/resolution_flags.def b/definitions/grib1/resolution_flags.def
index 4aad647..671e0b8 100644
--- a/definitions/grib1/resolution_flags.def
+++ b/definitions/grib1/resolution_flags.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/scanning_mode.def b/definitions/grib1/scanning_mode.def
index faa8dfe..10a0db4 100644
--- a/definitions/grib1/scanning_mode.def
+++ b/definitions/grib1/scanning_mode.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/section.0.def b/definitions/grib1/section.0.def
index f47c8e9..cc545f4 100644
--- a/definitions/grib1/section.0.def
+++ b/definitions/grib1/section.0.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/section.1.def b/definitions/grib1/section.1.def
index a4c9cbe..a62f802 100644
--- a/definitions/grib1/section.1.def
+++ b/definitions/grib1/section.1.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -175,6 +175,9 @@ concept name(nameECMF,"name.def",conceptsMasterDir,conceptsLocalDirAll) : dump,n
 signed[2] decimalScaleFactor :dump;
 transient setLocalDefinition= 0 : no_copy;
 
+# Try different values of binaryScaleFactor and decimalScaleFactor to reduce packing error
+transient optimizeScaleFactor = 0;
+
 meta      dataDate            g1date(centuryOfReferenceTimeOfData,yearOfCentury,month,day) : dump;
 meta      year                evaluate(dataDate / 10000) ;
 
diff --git a/definitions/grib1/section.2.def b/definitions/grib1/section.2.def
index 94f68f6..70e3036 100644
--- a/definitions/grib1/section.2.def
+++ b/definitions/grib1/section.2.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/section.3.def b/definitions/grib1/section.3.def
index 21d5e5d..bf98422 100644
--- a/definitions/grib1/section.3.def
+++ b/definitions/grib1/section.3.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib1/section.4.def b/definitions/grib1/section.4.def
index ea2fbf4..fb40273 100644
--- a/definitions/grib1/section.4.def
+++ b/definitions/grib1/section.4.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -156,6 +156,7 @@ alias numberOfBitsContainingEachPackedValue = bitsPerValue;
         referenceValue,
         binaryScaleFactor,
         decimalScaleFactor,
+        optimizeScaleFactor,
         halfByte,
 		packingType,
 		grid_ieee,precision,
diff --git a/definitions/grib1/section.5.def b/definitions/grib1/section.5.def
index 2a2b908..ce835fe 100644
--- a/definitions/grib1/section.5.def
+++ b/definitions/grib1/section.5.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/boot.def b/definitions/grib2/boot.def
index 6ff0941..5edcc86 100644
--- a/definitions/grib2/boot.def
+++ b/definitions/grib2/boot.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/boot_multifield.def b/definitions/grib2/boot_multifield.def
index 10a74e6..dbd5ce8 100644
--- a/definitions/grib2/boot_multifield.def
+++ b/definitions/grib2/boot_multifield.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/cfVarName.def b/definitions/grib2/cfVarName.def
index 538cd03..bca73d8 100644
--- a/definitions/grib2/cfVarName.def
+++ b/definitions/grib2/cfVarName.def
@@ -1,4 +1,22 @@
 # Automatically generated by ./create_def.pl, do not edit
+#Unbalanced component of temperature
+'uctp' = {
+	 discipline = 0 ;
+	 parameterCategory = 0 ;
+	 parameterNumber = 28 ;
+	}
+#Unbalanced component of logarithm of surface pressure
+'ucln' = {
+	 discipline = 0 ;
+	 parameterCategory = 3 ;
+	 parameterNumber = 31 ;
+	}
+#Unbalanced component of divergence
+'ucdv' = {
+	 discipline = 0 ;
+	 parameterCategory = 2 ;
+	 parameterNumber = 45 ;
+	}
 #Sea-ice cover
 'ci' = {
 	 discipline = 10 ;
@@ -470,7 +488,7 @@
 	 parameterCategory = 0 ;
 	 parameterNumber = 9 ;
 	}
-#Surface air relative humidity
+#2 metre relative humidity
 'r2' = {
 	 discipline = 0 ;
 	 parameterCategory = 1 ;
diff --git a/definitions/grib2/local.98.11.def b/definitions/grib2/local.98.11.def
index 95919a8..2707954 100644
--- a/definitions/grib2/local.98.11.def
+++ b/definitions/grib2/local.98.11.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/local.98.14.def b/definitions/grib2/local.98.14.def
index a1c92ea..37e50d0 100644
--- a/definitions/grib2/local.98.14.def
+++ b/definitions/grib2/local.98.14.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/local.98.15.def b/definitions/grib2/local.98.15.def
index f5cfc91..bde1b0a 100644
--- a/definitions/grib2/local.98.15.def
+++ b/definitions/grib2/local.98.15.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/local.98.16.def b/definitions/grib2/local.98.16.def
index e395d5e..ada7dfb 100644
--- a/definitions/grib2/local.98.16.def
+++ b/definitions/grib2/local.98.16.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/local.98.18.def b/definitions/grib2/local.98.18.def
index dffc784..d2c1bb8 100644
--- a/definitions/grib2/local.98.18.def
+++ b/definitions/grib2/local.98.18.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/local.98.192.def b/definitions/grib2/local.98.192.def
index a8cc606..00c35c8 100644
--- a/definitions/grib2/local.98.192.def
+++ b/definitions/grib2/local.98.192.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/local.98.20.def b/definitions/grib2/local.98.20.def
index 12c00c5..a6212f6 100644
--- a/definitions/grib2/local.98.20.def
+++ b/definitions/grib2/local.98.20.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/local.98.21.def b/definitions/grib2/local.98.21.def
index ac37450..d190855 100644
--- a/definitions/grib2/local.98.21.def
+++ b/definitions/grib2/local.98.21.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/local.98.24.def b/definitions/grib2/local.98.24.def
index 99b2569..3623931 100644
--- a/definitions/grib2/local.98.24.def
+++ b/definitions/grib2/local.98.24.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/local.98.25.def b/definitions/grib2/local.98.25.def
index 696fb3d..6d001f4 100644
--- a/definitions/grib2/local.98.25.def
+++ b/definitions/grib2/local.98.25.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/local.98.26.def b/definitions/grib2/local.98.26.def
index ddd024e..7bc16a3 100644
--- a/definitions/grib2/local.98.26.def
+++ b/definitions/grib2/local.98.26.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/local.98.28.def b/definitions/grib2/local.98.28.def
index 23fe0b4..34893e8 100644
--- a/definitions/grib2/local.98.28.def
+++ b/definitions/grib2/local.98.28.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/local.98.30.def b/definitions/grib2/local.98.30.def
index 13e6b16..9aad146 100644
--- a/definitions/grib2/local.98.30.def
+++ b/definitions/grib2/local.98.30.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/local.98.300.def b/definitions/grib2/local.98.300.def
index db5d9f4..843b09c 100644
--- a/definitions/grib2/local.98.300.def
+++ b/definitions/grib2/local.98.300.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/local.98.36.def b/definitions/grib2/local.98.36.def
index 008fcf5..0c3c151 100644
--- a/definitions/grib2/local.98.36.def
+++ b/definitions/grib2/local.98.36.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/local.98.38.def b/definitions/grib2/local.98.38.def
index 2beffec..b5012ee 100644
--- a/definitions/grib2/local.98.38.def
+++ b/definitions/grib2/local.98.38.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/local.98.39.def b/definitions/grib2/local.98.39.def
index 8c91876..5df6142 100644
--- a/definitions/grib2/local.98.39.def
+++ b/definitions/grib2/local.98.39.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/local.98.7.def b/definitions/grib2/local.98.7.def
index 776aa3a..a7750c5 100644
--- a/definitions/grib2/local.98.7.def
+++ b/definitions/grib2/local.98.7.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/local.98.9.def b/definitions/grib2/local.98.9.def
index ba7024e..d0a1132 100644
--- a/definitions/grib2/local.98.9.def
+++ b/definitions/grib2/local.98.9.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/local/edzw/2.0.3.table b/definitions/grib2/local/edzw/2.0.3.table
deleted file mode 100755
index efa3bd1..0000000
--- a/definitions/grib2/local/edzw/2.0.3.table
+++ /dev/null
@@ -1,130 +0,0 @@
-1 p P Pressure Pa
-2 msl MSL Mean sea level pressure Pa
-3 3 None Pressure tendency Pa s**-1
-4 pv PV Potential vorticity K m**2 kg**-1 s**-1
-5 5 None ICAO Standard Atmosphere reference height m
-6 z Z Geopotential m**2 s**-2
-7 gh GH Geopotential height gpm
-8 h H Geometrical height m
-9 9 None Standard deviation of height m
-10 tco3 TCO3 Total (column) ozone Dobson (kg m**-2)
-11 t T Temperature K
-12 12 None Virtual temperature K
-13 13 None Potential temperature K
-14 14 None Pseudo-adiabatic potential temperature K
-15 15 None Maximum temperature K
-16 16 None Minimum temperature K
-17 17 None Dew-point temperature K
-18 18 None Dew-point depression (or deficit) K
-19 19 None Lapse rate K s**-1
-20 20 None Visibility m
-21 21 None Radar spectra (1) -
-22 22 None Radar spectra (2) -
-23 23 None Radar spectra (3) -
-24 24 None Parcel lifted index (to 500 hPa) K
-25 25 None Temperature anomaly K
-26 26 None Pressure anomaly Pa
-27 27 None Geopotential height anomaly gpm
-28 28 None Wave spectra (1) -
-29 29 None Wave spectra (2) -
-30 30 None Wave spectra (3) -
-31 31 None Wind direction Degree true
-32 32 None Wind speed m s**-1
-33 u U U-component of wind m s**-1
-34 v V V-component of wind m s**-1
-35 35 None Stream Function m**2 s**-1
-36 36 None Velocity Potential m**2 s**-1
-37 37 None Montgomery stream Function m**2 s**-1
-38 38 None Sigma coordinate vertical velocity s**-1
-39 w W Vertical velocity Pa s**-1
-40 40 None Vertical velocity m s**-1
-41 41 None Absolute vorticity s**-1
-42 42 None Absolute divergence s**-1
-43 vo VO Relative vorticity s**-1
-44 d D Relative divergence s**-1
-45 45 None Vertical u-component shear s**-1
-46 46 None Vertical v-component shear s**-1
-47 47 None Direction of current Degree true
-48 48 None Speed of current m s**-1
-49 49 None U-component of current m s**-1
-50 50 None V-component of current m s**-1
-51 q Q Specific humidity kg kg**-1
-52 r R Relative humidity %
-53 53 None Humidity mixing ratio kg m**-2
-54 54 None Precipitable water kg m**-2
-55 55 None Vapour pressure Pa
-56 56 None Saturation deficit Pa
-57 e E Evaporation kg m**-2
-58 ciwc CIWC Cloud ice kg m**-2
-59 59 None Precipitation rate kg m**-2 s**-1
-60 60 None Thunderstorm probability %
-61 tp TP Total precipitation kg m**-2
-62 62 LSP Large scale precipitation kg m**-2
-63 63 None Convective precipitation (water) kg m**-2
-64 64 None Snow fall rate water equivalent kg m**-2 s**-1
-65 sf SF Water equivalentof accumulated snow depth kg m**-2
-66 sd SD Snow depth m (of water equivalent)
-67 67 None Mixed layer depth m
-68 68 None Transient thermocline depth m
-69 69 None Main thermocline depth m
-70 70 None Main thermocline anomaly m
-71 tcc TCC Total cloud cover %
-72 ccc CCC Convective cloud cover %
-73 lcc LCC Low cloud cover %
-74 mcc MCC Medium cloud cover %
-75 hcc HCC High cloud cover %
-76 clwc CLWC Cloud liquid water content kg kg**-1
-77 77 None Best lifted index (to 500 hPa) K
-78 csf CSF Convective snow-fall kg m**-2
-79 lsf LSF Large scale snow-fall kg m**-2
-80 80 None Water temperature K
-81 lsm LSM Land cover (1=land, 0=sea) (0 - 1)
-82 82 None Deviation of sea-level from mean m
-83 sr SR Surface roughness m
-84 al AL Albedo -
-85 st ST Surface temperature of soil K
-86 ssw SSW Soil moisture content kg m**-2
-87 veg VEG Percentage of vegetation %
-88 88 None Salinity kg kg**-1
-89 89 None Density kg m**-3
-90 ro RO Water run-off kg m**-2
-91 91 None Ice cover (1=land, 0=sea) (0 - 1)
-92 92 None Ice thickness m
-93 93 None Direction of ice drift Degree true
-94 94 None Speed of ice drift m s*-1
-95 95 None U-component of ice drift m s**-1
-96 96 None V-component of ice drift m s**-1
-97 97 None Ice growth rate m s**-1
-98 98 None Ice divergence s**-1
-99 99 None Snow melt kg m**-2
-100 swh SWH Signific.height,combined wind waves+swell m
-101 mdww MDWW Mean direction of wind waves Degree true
-102 shww SHWW Significant height of wind waves m
-103 mpww MPWW Mean period of wind waves s
-104 104 None Direction of swell waves Degree true
-105 105 None Significant height of swell waves m
-106 106 None Mean period of swell waves s
-107 mdps MDPS Mean direction of primary swell Degree true
-108 mpps MPPS Mean period of primary swell s
-109 109 None Secondary wave direction Degree true
-110 110 None Secondary wave period s
-111 111 None Net short-wave radiation flux (surface) W m**-2
-112 112 None Net long-wave radiation flux (surface) W m**-2
-113 113 None Net short-wave radiation flux(atmosph.top) W m**-2
-114 114 None Net long-wave radiation flux(atmosph.top) W m**-2
-115 115 None Long-wave radiation flux W m**-2
-116 116 None Short-wave radiation flux W m**-2
-117 117 None Global radiation flux W m**-2
-118 118 None Brightness temperature K
-119 119 None Radiance (with respect to wave number) W m**-1 sr**-1
-120 120 None Radiance (with respect to wave length) W m**-1 sr**-1
-121 slhf SLHF (surface) Latent heat flux W m**-2
-122 sshf SSHF (surface) Sensible heat flux W m**-2
-123 bld BLD Boundary layer dissipation W m**-2
-124 124 None Momentum flux, u-component N m**-2
-125 125 None Momentum flux, v-component N m**-2
-126 126 None Wind mixing energy J
-127 127 None Image data -
-148 lsm LSM LandSeaMask
-160 160 Unknown
-255 - - Indicates a missing value -
diff --git a/definitions/grib2/local/edzw/3.table b/definitions/grib2/local/edzw/3.table
deleted file mode 100755
index 7c4cc88..0000000
--- a/definitions/grib2/local/edzw/3.table
+++ /dev/null
@@ -1,51 +0,0 @@
-# CODE TABLE 3 Fixed levels or layers for wich the data are included
-0 0 Reserved
-1 G Surface (of the Earth, which includes sea surface)
-2 CB Cloud base level
-3 CT Cloud top level
-4 IZ 0 deg (C) isotherm level
-5 AC Adiabatic condensation level (parcel lifted from surface)
-6 WM Maximum wind speed level
-7 TP Tropopause level
-8 AU Nominal top of atmosphere
-9 9 Sea bottom
-# 10-19 Reserved
-20 20 Isothermal level Temperature in 1/100 K
-# 21-99 Reserved
-100 P Isobaric level pressure in hectoPascals (hPa) (2 octets)
-101 PI Layer between two isobaric levels pressure of top (kPa) pressure of bottom (kPa)
-102 MSL Mean sea level 0 0
-103 HMSL Fixed height level height above mean sea level (MSL) in meters
-104 HMSLI Layer between two specfied altitudes above mean sea level - altitude of top, altitude of bottom (hm)
-105 HG Fixed height above ground height in meters (2 octets)
-106 HGI Layer between two height levels above ground - height of top, height of bottom (hm)
-107 SIG Sigma level sigma value in 1/10000 (2 octets)
-108 SIGI Layer between two sigma levels sigma value at top in 1/100 sigma value at bottom in 1/100
-109 H Hybrid level level number (2 octets)
-110 HI Layer between two hybrid levels level number of top level number of bottom
-111 B Depth below land surface centimeters (2 octets)
-112 S Layer between two depths below land surface - depth of upper surface, depth of lower surface (cm)
-113 pt Isentropic (theta) level Potential Temp. degrees K (2 octets)
-114 114 Layer between two isentropic levels 475K minus theta of top in Deg. K 475K minus theta of bottom in Deg. K
-115 115 Level at specified pressure difference from ground to level hPa (2 octets)
-116 116 Layer between two levels at specified pressure differences from ground to levels pressure difference from ground to top level hPa pressure difference from ground to bottom level hPa
-117 pv Potential vorticity surface 10-9 K m2 kg-1 s-1
-# 118 Reserved
-119 119 ETA level: ETA value in 1/10000 (2 octets)
-120 120 Layer between two ETA levels: ETA value at top of layer in 1/100, ETA value at bottom of layer in 1/100
-121 121 Layer between two isobaric surfaces (high precision) 1100 hPa minus pressure of top, in hPa 1100 hPa minus pressure of bottom, in hPa
-# 122-124 Reserved
-125 125 Height level above ground (high precision) centimeters (2 octets)
-# 126-127 Reserved
-128 128 Layer between two sigma levels (high precision) 1.1 minus sigma of top, in 1/1000 of sigma 1.1 minus sigma of bottom, in 1/1000 of sigma
-# 129-140 Reserved
-141 141 Layer between two isobaric surfaces (mixed precision) pressure of top, in kPa 1100hPa minus pressure of bottom, in hPa
-# 142-159 Reserved
-160 dp Depth below sea level meters (2 octets)
-# 161-199Reserved
-200 R Entire atmosphere considered as a single layer 0 (2 octets)
-201 201 Entire ocean considered as a single layer 0 (2 octets)
-210 pl Isobaric surface (Pa) (ECMWF extension)
-211 wv Ocean wave level (ECMWF extension)
-212 oml Ocean mixed layer (ECMWF extension)
-222 SYN Synthetic Satellite Images (DWD extension)
diff --git a/definitions/grib2/local/edzw/5.table b/definitions/grib2/local/edzw/5.table
deleted file mode 100755
index 7f7c99d..0000000
--- a/definitions/grib2/local/edzw/5.table
+++ /dev/null
@@ -1,24 +0,0 @@
-# CODE TABLE 5 Time Range Indicator
-0 0 Forecast product valid at reference time + P1 (P1>0)
-1 1 Initialized analysis product for reference time (P1=0).
-2 2 Product with a valid time ranging between reference time + P1 and reference time + P2
-3 3 Average (reference time + P1 to reference time + P2)
-4 4 Accumulation (reference time + P1 to reference time + P2) product considered valid at reference time + P2
-5 5 Difference (reference time + P2 minus reference time + P1) product considered valid at reference time + P2
-6 6 Average (reference time - P1 to reference time - P2)
-7 7 Average (reference time - P1 to reference time + P2)
-10 10 P1 occupies octets 19 and 20; product valid at reference time + P1
-11 11 local use: Initialized forecast (P1 > 0) for IDFI
-13 13 local use: Fields from analyses valid at reference time for P1 = 0
-14 14 local use: IFS forecast interpolated to GME triangular grid
-51 51 Climatological Mean Value:
-113 113 Average of N forecasts (or initialized analyses); each product has forecast period of P1 (P1=0 for initialized analyses); products have reference times at intervals of P2, beginning at the given reference time.
-114 114 Accumulation of N forecasts (or initialized analyses); each product has forecast period of P1 (P1=0 for initialized analyses); products have reference times at intervals of P2, beginning at the given reference time.
-115 115 Average of N forecasts, all with the same reference time; the first has a forecast period of P1, the remaining forecasts follow at intervals of P2.
-116 116 Accumulation of N forecasts, all with the same reference time; the first has a forecast period of P1, the remaining follow at intervals of P2.
-117 117 Average of N forecasts, the first has a period of P1, the subsequent ones have forecast periods reduced from the previous one by an interval of P2; the reference time for the first is given in octets 13- 17, the subsequent ones have reference times increased from the previous one by an interval of P2. Thus all the forecasts have the same valid time, given by the initial reference time + P1.
-118 118 Temporal variance, or covariance, of N initialized analyses; each product has forecast period P1=0; products have reference times at intervals of P2, beginning at the given reference time.
-119 119 Standard deviation of N forecasts, all with the same reference time with respect to the time average of forecasts; the first forecast has a forecast period of P1, the remaining forecasts follow at intervals of P2
-123 123 Average of N uninitialized analyses, starting at the reference time, at intervals of P2.
-124 124 Accumulation of N uninitialized analyses, starting at the reference time, at intervals of P2.
-125 125 Standard deviation of N forecasts, all with the same reference time with respect to time average of the time tendency of forecasts; the first forecast has a forecast period of P1, the remaining forecasts follow at intervals of P2
diff --git a/definitions/grib2/local/edzw/generatingProcessIdentifier.table b/definitions/grib2/local/edzw/generatingProcessIdentifier.table
deleted file mode 100755
index f2ecd9a..0000000
--- a/definitions/grib2/local/edzw/generatingProcessIdentifier.table
+++ /dev/null
@@ -1,86 +0,0 @@
-025 AN2MO AN2MO
-033 ANALY ANALY
-034 WAMIT WAMIT
-036 GPEPS GPEPS
-037 KWGFS KWGFS
-038 KWGF5 KWGF5
-044 B106V B106V
-049 S106V S106V
-053 AN1MO AN1MO
-058 EM3AN EM3AN
-059 EM3MO EM3MO
-061 ECMFM ECMFM
-064 KWBCM KWBCM
-065 LFPWM LFPWM
-068 KWB01 KWB01
-069 SGGLO SGGLO
-074 B106A B106A
-075 SGMED SGMED
-079 S106A S106A
-080 ECENS ECENS
-081 NORMW NORMW
-084 NORM3 NORM3
-085 SGNAT SGNAT
-086 SGESH SGESH
-087 SGBAL SGBAL
-088 MOMI3 MOMI3
-094 P106A P106A
-111 DM3AN DM3AN
-112 DM3MO DM3MO
-115 DM4AN DM4AN
-116 DM4MO DM4MO
-121 WAFTF WAFTF
-122 WAFSZ WAFSZ
-123 KWB02 KWB02
-124 KWB03 KWB03
-126 KWB04 KWB04
-127 NAEGR NAEGR
-131 LM1AN LM1AN
-132 LM1MO LM1MO
-134 LM2AN LM2AN
-135 LM2MO LM2MO
-137 LM3AN LM3AN
-138 LM3MO LM3MO
-140 ecgm_diag_fc05 ecgm_diag_fc05 
-141 I032A I032A
-143 I048A I048A
-145 I064A I064A
-147 I096A I096A
-148 I096F I096F
-149 I128A I128A
-150 I128F I128F
-157 R096A R096A
-159 R128A R128A
-160 R128F R128F
-173 I192A I192A
-174 I192F I192F
-175 I256A I256A
-176 I256F I256F
-185 R192A R192A
-186 R192F R192F
-187 R256A R256A
-188 R256F R256F
-194 E128A E128A
-195 E192A E192A
-196 E256A E256A
-197 SGGM0 SGGM0
-198 SGGM1 SGGM1
-199 SGGM2 SGGM2
-201 SGLM0 SGLM0
-202 SGLM1 SGLM1
-205 SGBSH SGBSH
-206 I384A I384A
-207 I384F I384F
-208 R384A R384A
-209 R384F R384F
-210 E384A E384A
-211 EGMES EGMES
-212 LFMES LFMES
-213 LM4MO LM4MO
-214 LM4AN LM4AN
-215 LM5MO LM5MO
-216 LM5AN LM5AN
-217 LM6MO LM6MO
-218 LM6AN LM6AN
-219 LM7MO LM7MO
-225 SGBS1 SGBS1
diff --git a/definitions/grib2/localConcepts/ecmf/cfVarName.def b/definitions/grib2/localConcepts/ecmf/cfVarName.def
index a85b2b3..1e04c29 100644
--- a/definitions/grib2/localConcepts/ecmf/cfVarName.def
+++ b/definitions/grib2/localConcepts/ecmf/cfVarName.def
@@ -431,13 +431,13 @@
 	 parameterCategory = 128 ;
 	 parameterNumber = 74 ;
 	}
-#Total column liquid water
+#Total column cloud liquid water
 'tclw' = {
 	 discipline = 192 ;
 	 parameterCategory = 128 ;
 	 parameterNumber = 78 ;
 	}
-#Total column ice water
+#Total column cloud ice water
 'tciw' = {
 	 discipline = 192 ;
 	 parameterCategory = 128 ;
@@ -9119,13 +9119,13 @@
 	 parameterCategory = 228 ;
 	 parameterNumber = 43 ;
 	}
-#Height of Zero Deg Wet Bulb Temperature
+#Height of zero-degree wet-bulb temperature
 'hwbt0' = {
 	 discipline = 192 ;
 	 parameterCategory = 228 ;
 	 parameterNumber = 47 ;
 	}
-#Height of One Deg Wet Bulb Temperature
+#Height of one-degree wet-bulb temperature
 'hwbt1' = {
 	 discipline = 192 ;
 	 parameterCategory = 228 ;
diff --git a/definitions/grib2/localConcepts/ecmf/name.def b/definitions/grib2/localConcepts/ecmf/name.def
index 3141ac5..c8f78c2 100644
--- a/definitions/grib2/localConcepts/ecmf/name.def
+++ b/definitions/grib2/localConcepts/ecmf/name.def
@@ -431,14 +431,14 @@
 	 parameterCategory = 128 ;
 	 parameterNumber = 74 ;
 	}
-#Total column liquid water
-'Total column liquid water' = {
+#Total column cloud liquid water
+'Total column cloud liquid water' = {
 	 discipline = 192 ;
 	 parameterCategory = 128 ;
 	 parameterNumber = 78 ;
 	}
-#Total column ice water
-'Total column ice water' = {
+#Total column cloud ice water
+'Total column cloud ice water' = {
 	 discipline = 192 ;
 	 parameterCategory = 128 ;
 	 parameterNumber = 79 ;
@@ -9119,14 +9119,14 @@
 	 parameterCategory = 228 ;
 	 parameterNumber = 43 ;
 	}
-#Height of Zero Deg Wet Bulb Temperature
-'Height of Zero Deg Wet Bulb Temperature' = {
+#Height of zero-degree wet-bulb temperature
+'Height of zero-degree wet-bulb temperature' = {
 	 discipline = 192 ;
 	 parameterCategory = 228 ;
 	 parameterNumber = 47 ;
 	}
-#Height of One Deg Wet Bulb Temperature
-'Height of One Deg Wet Bulb Temperature' = {
+#Height of one-degree wet-bulb temperature
+'Height of one-degree wet-bulb temperature' = {
 	 discipline = 192 ;
 	 parameterCategory = 228 ;
 	 parameterNumber = 48 ;
diff --git a/definitions/grib2/localConcepts/ecmf/paramId.def b/definitions/grib2/localConcepts/ecmf/paramId.def
index 7ff7d1c..b6f8802 100644
--- a/definitions/grib2/localConcepts/ecmf/paramId.def
+++ b/definitions/grib2/localConcepts/ecmf/paramId.def
@@ -431,13 +431,13 @@
 	 parameterCategory = 128 ;
 	 parameterNumber = 74 ;
 	}
-#Total column liquid water
+#Total column cloud liquid water
 '78' = {
 	 discipline = 192 ;
 	 parameterCategory = 128 ;
 	 parameterNumber = 78 ;
 	}
-#Total column ice water
+#Total column cloud ice water
 '79' = {
 	 discipline = 192 ;
 	 parameterCategory = 128 ;
@@ -9119,13 +9119,13 @@
 	 parameterCategory = 228 ;
 	 parameterNumber = 43 ;
 	}
-#Height of Zero Deg Wet Bulb Temperature
+#Height of zero-degree wet-bulb temperature
 '228047' = {
 	 discipline = 192 ;
 	 parameterCategory = 228 ;
 	 parameterNumber = 47 ;
 	}
-#Height of One Deg Wet Bulb Temperature
+#Height of one-degree wet-bulb temperature
 '228048' = {
 	 discipline = 192 ;
 	 parameterCategory = 228 ;
diff --git a/definitions/grib2/localConcepts/ecmf/shortName.def b/definitions/grib2/localConcepts/ecmf/shortName.def
index ae34c9a..ab594d1 100644
--- a/definitions/grib2/localConcepts/ecmf/shortName.def
+++ b/definitions/grib2/localConcepts/ecmf/shortName.def
@@ -431,13 +431,13 @@
 	 parameterCategory = 128 ;
 	 parameterNumber = 74 ;
 	}
-#Total column liquid water
+#Total column cloud liquid water
 'tclw' = {
 	 discipline = 192 ;
 	 parameterCategory = 128 ;
 	 parameterNumber = 78 ;
 	}
-#Total column ice water
+#Total column cloud ice water
 'tciw' = {
 	 discipline = 192 ;
 	 parameterCategory = 128 ;
@@ -9119,13 +9119,13 @@
 	 parameterCategory = 228 ;
 	 parameterNumber = 43 ;
 	}
-#Height of Zero Deg Wet Bulb Temperature
+#Height of zero-degree wet-bulb temperature
 'hwbt0' = {
 	 discipline = 192 ;
 	 parameterCategory = 228 ;
 	 parameterNumber = 47 ;
 	}
-#Height of One Deg Wet Bulb Temperature
+#Height of one-degree wet-bulb temperature
 'hwbt1' = {
 	 discipline = 192 ;
 	 parameterCategory = 228 ;
diff --git a/definitions/grib2/localConcepts/ecmf/units.def b/definitions/grib2/localConcepts/ecmf/units.def
index 050f224..7d8811b 100644
--- a/definitions/grib2/localConcepts/ecmf/units.def
+++ b/definitions/grib2/localConcepts/ecmf/units.def
@@ -431,13 +431,13 @@
 	 parameterCategory = 128 ;
 	 parameterNumber = 74 ;
 	}
-#Total column liquid water
+#Total column cloud liquid water
 'kg m**-2' = {
 	 discipline = 192 ;
 	 parameterCategory = 128 ;
 	 parameterNumber = 78 ;
 	}
-#Total column ice water
+#Total column cloud ice water
 'kg m**-2' = {
 	 discipline = 192 ;
 	 parameterCategory = 128 ;
@@ -9119,13 +9119,13 @@
 	 parameterCategory = 228 ;
 	 parameterNumber = 43 ;
 	}
-#Height of Zero Deg Wet Bulb Temperature
+#Height of zero-degree wet-bulb temperature
 'm' = {
 	 discipline = 192 ;
 	 parameterCategory = 228 ;
 	 parameterNumber = 47 ;
 	}
-#Height of One Deg Wet Bulb Temperature
+#Height of one-degree wet-bulb temperature
 'm' = {
 	 discipline = 192 ;
 	 parameterCategory = 228 ;
diff --git a/definitions/grib2/mars_labeling.def b/definitions/grib2/mars_labeling.def
index cefcb5f..3ede9b2 100644
--- a/definitions/grib2/mars_labeling.def
+++ b/definitions/grib2/mars_labeling.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/meta.def b/definitions/grib2/meta.def
index 23b92fb..672693a 100644
--- a/definitions/grib2/meta.def
+++ b/definitions/grib2/meta.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/name.def b/definitions/grib2/name.def
index d0fed7a..a31fc5c 100644
--- a/definitions/grib2/name.def
+++ b/definitions/grib2/name.def
@@ -1,4 +1,22 @@
 # Automatically generated by ./create_def.pl, do not edit
+#Unbalanced component of temperature
+'Unbalanced component of temperature' = {
+	 discipline = 0 ;
+	 parameterCategory = 0 ;
+	 parameterNumber = 28 ;
+	}
+#Unbalanced component of logarithm of surface pressure
+'Unbalanced component of logarithm of surface pressure' = {
+	 discipline = 0 ;
+	 parameterCategory = 3 ;
+	 parameterNumber = 31 ;
+	}
+#Unbalanced component of divergence
+'Unbalanced component of divergence' = {
+	 discipline = 0 ;
+	 parameterCategory = 2 ;
+	 parameterNumber = 45 ;
+	}
 #Sea-ice cover
 'Sea-ice cover' = {
 	 discipline = 10 ;
@@ -470,8 +488,8 @@
 	 parameterCategory = 0 ;
 	 parameterNumber = 9 ;
 	}
-#Surface air relative humidity
-'Surface air relative humidity' = {
+#2 metre relative humidity
+'2 metre relative humidity' = {
 	 discipline = 0 ;
 	 parameterCategory = 1 ;
 	 parameterNumber = 1 ;
diff --git a/definitions/grib2/paramId.def b/definitions/grib2/paramId.def
index b9e3a7f..13dce15 100644
--- a/definitions/grib2/paramId.def
+++ b/definitions/grib2/paramId.def
@@ -1,4 +1,22 @@
 # Automatically generated by ./create_def.pl, do not edit
+#Unbalanced component of temperature
+'21' = {
+	 discipline = 0 ;
+	 parameterCategory = 0 ;
+	 parameterNumber = 28 ;
+	}
+#Unbalanced component of logarithm of surface pressure
+'22' = {
+	 discipline = 0 ;
+	 parameterCategory = 3 ;
+	 parameterNumber = 31 ;
+	}
+#Unbalanced component of divergence
+'23' = {
+	 discipline = 0 ;
+	 parameterCategory = 2 ;
+	 parameterNumber = 45 ;
+	}
 #Sea-ice cover
 '31' = {
 	 discipline = 10 ;
@@ -470,7 +488,7 @@
 	 parameterCategory = 0 ;
 	 parameterNumber = 9 ;
 	}
-#Surface air relative humidity
+#2 metre relative humidity
 '260242' = {
 	 discipline = 0 ;
 	 parameterCategory = 1 ;
diff --git a/definitions/grib2/parameters.def b/definitions/grib2/parameters.def
index b898b63..bda64ba 100644
--- a/definitions/grib2/parameters.def
+++ b/definitions/grib2/parameters.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/products_0.def b/definitions/grib2/products_0.def
index 0d0ac6b..143291e 100644
--- a/definitions/grib2/products_0.def
+++ b/definitions/grib2/products_0.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/products_1.def b/definitions/grib2/products_1.def
index ada4692..619a22f 100644
--- a/definitions/grib2/products_1.def
+++ b/definitions/grib2/products_1.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/products_2.def b/definitions/grib2/products_2.def
index 13131af..db0bfa4 100644
--- a/definitions/grib2/products_2.def
+++ b/definitions/grib2/products_2.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/products_3.def b/definitions/grib2/products_3.def
index 0df98d3..971bfa2 100644
--- a/definitions/grib2/products_3.def
+++ b/definitions/grib2/products_3.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/products_4.def b/definitions/grib2/products_4.def
index 0334ea5..be12e0a 100644
--- a/definitions/grib2/products_4.def
+++ b/definitions/grib2/products_4.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/products_5.def b/definitions/grib2/products_5.def
index 2e474d9..958e67e 100644
--- a/definitions/grib2/products_5.def
+++ b/definitions/grib2/products_5.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/products_6.def b/definitions/grib2/products_6.def
index 37a5fbc..bb12207 100644
--- a/definitions/grib2/products_6.def
+++ b/definitions/grib2/products_6.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/products_7.def b/definitions/grib2/products_7.def
index 7bb2961..7f27436 100644
--- a/definitions/grib2/products_7.def
+++ b/definitions/grib2/products_7.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/products_8.def b/definitions/grib2/products_8.def
index 0263b67..7b9e780 100644
--- a/definitions/grib2/products_8.def
+++ b/definitions/grib2/products_8.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/products_9.def b/definitions/grib2/products_9.def
index 3907d56..841085d 100644
--- a/definitions/grib2/products_9.def
+++ b/definitions/grib2/products_9.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/products_s2s.def b/definitions/grib2/products_s2s.def
index a120a68..709a415 100644
--- a/definitions/grib2/products_s2s.def
+++ b/definitions/grib2/products_s2s.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/products_tigge.def b/definitions/grib2/products_tigge.def
index fbf9523..3144023 100644
--- a/definitions/grib2/products_tigge.def
+++ b/definitions/grib2/products_tigge.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/products_uerra.def b/definitions/grib2/products_uerra.def
index a0c6383..7e2880b 100644
--- a/definitions/grib2/products_uerra.def
+++ b/definitions/grib2/products_uerra.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/rules.def b/definitions/grib2/rules.def
index b8471a4..4365563 100644
--- a/definitions/grib2/rules.def
+++ b/definitions/grib2/rules.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/section.0.def b/definitions/grib2/section.0.def
index e07bb83..6ddc2b5 100644
--- a/definitions/grib2/section.0.def
+++ b/definitions/grib2/section.0.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/section.1.def b/definitions/grib2/section.1.def
index 544d5e6..6992690 100644
--- a/definitions/grib2/section.1.def
+++ b/definitions/grib2/section.1.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/section.2.def b/definitions/grib2/section.2.def
index a5046e8..d5b665f 100644
--- a/definitions/grib2/section.2.def
+++ b/definitions/grib2/section.2.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/section.3.def b/definitions/grib2/section.3.def
index c0aa869..0d97825 100644
--- a/definitions/grib2/section.3.def
+++ b/definitions/grib2/section.3.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/section.4.def b/definitions/grib2/section.4.def
index 0b878f2..a35219a 100644
--- a/definitions/grib2/section.4.def
+++ b/definitions/grib2/section.4.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/section.5.def b/definitions/grib2/section.5.def
index 4ba952c..2402c96 100644
--- a/definitions/grib2/section.5.def
+++ b/definitions/grib2/section.5.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/section.6.def b/definitions/grib2/section.6.def
index 801c79c..3d7ba77 100644
--- a/definitions/grib2/section.6.def
+++ b/definitions/grib2/section.6.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/section.7.def b/definitions/grib2/section.7.def
index 1e774ec..8f9307d 100644
--- a/definitions/grib2/section.7.def
+++ b/definitions/grib2/section.7.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/section.8.def b/definitions/grib2/section.8.def
index 1a2e090..0feb9ef 100644
--- a/definitions/grib2/section.8.def
+++ b/definitions/grib2/section.8.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/sections.def b/definitions/grib2/sections.def
index fd40883..e1364f2 100644
--- a/definitions/grib2/sections.def
+++ b/definitions/grib2/sections.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/shortName.def b/definitions/grib2/shortName.def
index 9a2015a..4047c0e 100644
--- a/definitions/grib2/shortName.def
+++ b/definitions/grib2/shortName.def
@@ -1,4 +1,22 @@
 # Automatically generated by ./create_def.pl, do not edit
+#Unbalanced component of temperature
+'uctp' = {
+	 discipline = 0 ;
+	 parameterCategory = 0 ;
+	 parameterNumber = 28 ;
+	}
+#Unbalanced component of logarithm of surface pressure
+'ucln' = {
+	 discipline = 0 ;
+	 parameterCategory = 3 ;
+	 parameterNumber = 31 ;
+	}
+#Unbalanced component of divergence
+'ucdv' = {
+	 discipline = 0 ;
+	 parameterCategory = 2 ;
+	 parameterNumber = 45 ;
+	}
 #Sea-ice cover
 'ci' = {
 	 discipline = 10 ;
@@ -470,7 +488,7 @@
 	 parameterCategory = 0 ;
 	 parameterNumber = 9 ;
 	}
-#Surface air relative humidity
+#2 metre relative humidity
 '2r' = {
 	 discipline = 0 ;
 	 parameterCategory = 1 ;
diff --git a/definitions/grib2/template.1.0.def b/definitions/grib2/template.1.0.def
index b869cfa..6f38cae 100644
--- a/definitions/grib2/template.1.0.def
+++ b/definitions/grib2/template.1.0.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.1.1.def b/definitions/grib2/template.1.1.def
index 7aa0b13..c44a849 100644
--- a/definitions/grib2/template.1.1.def
+++ b/definitions/grib2/template.1.1.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.1.2.def b/definitions/grib2/template.1.2.def
index df6e826..11f3e4a 100644
--- a/definitions/grib2/template.1.2.def
+++ b/definitions/grib2/template.1.2.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.1.calendar.def b/definitions/grib2/template.1.calendar.def
index d9bf24f..4371f58 100644
--- a/definitions/grib2/template.1.calendar.def
+++ b/definitions/grib2/template.1.calendar.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.1.offset.def b/definitions/grib2/template.1.offset.def
index 20edad2..7231e8d 100644
--- a/definitions/grib2/template.1.offset.def
+++ b/definitions/grib2/template.1.offset.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.3.0.def b/definitions/grib2/template.3.0.def
index 87dc5d9..cdbc262 100644
--- a/definitions/grib2/template.3.0.def
+++ b/definitions/grib2/template.3.0.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.3.1.def b/definitions/grib2/template.3.1.def
index af2afc0..d4d700b 100644
--- a/definitions/grib2/template.3.1.def
+++ b/definitions/grib2/template.3.1.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.3.10.def b/definitions/grib2/template.3.10.def
index 75c077f..07d495d 100644
--- a/definitions/grib2/template.3.10.def
+++ b/definitions/grib2/template.3.10.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.3.100.def b/definitions/grib2/template.3.100.def
index 5569e5f..cf55439 100644
--- a/definitions/grib2/template.3.100.def
+++ b/definitions/grib2/template.3.100.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.3.1000.def b/definitions/grib2/template.3.1000.def
index 79b4590..e0ab70d 100644
--- a/definitions/grib2/template.3.1000.def
+++ b/definitions/grib2/template.3.1000.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.3.101.def b/definitions/grib2/template.3.101.def
index 95e22ce..15cb8de 100644
--- a/definitions/grib2/template.3.101.def
+++ b/definitions/grib2/template.3.101.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.3.110.def b/definitions/grib2/template.3.110.def
index 1b1902f..602c514 100644
--- a/definitions/grib2/template.3.110.def
+++ b/definitions/grib2/template.3.110.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.3.1100.def b/definitions/grib2/template.3.1100.def
index bfd567b..25eb5fa 100644
--- a/definitions/grib2/template.3.1100.def
+++ b/definitions/grib2/template.3.1100.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.3.12.def b/definitions/grib2/template.3.12.def
index 879389a..128b80a 100644
--- a/definitions/grib2/template.3.12.def
+++ b/definitions/grib2/template.3.12.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.3.120.def b/definitions/grib2/template.3.120.def
index d36fc46..a0cbed3 100644
--- a/definitions/grib2/template.3.120.def
+++ b/definitions/grib2/template.3.120.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.3.1200.def b/definitions/grib2/template.3.1200.def
index 3492295..98c4da5 100644
--- a/definitions/grib2/template.3.1200.def
+++ b/definitions/grib2/template.3.1200.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.3.130.def b/definitions/grib2/template.3.130.def
index 59ef703..631356a 100644
--- a/definitions/grib2/template.3.130.def
+++ b/definitions/grib2/template.3.130.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.3.140.def b/definitions/grib2/template.3.140.def
index 4a9cb9c..a73a435 100644
--- a/definitions/grib2/template.3.140.def
+++ b/definitions/grib2/template.3.140.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.3.2.def b/definitions/grib2/template.3.2.def
index 2f4c047..65aa98d 100644
--- a/definitions/grib2/template.3.2.def
+++ b/definitions/grib2/template.3.2.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.3.20.def b/definitions/grib2/template.3.20.def
index 050882d..5b72d75 100644
--- a/definitions/grib2/template.3.20.def
+++ b/definitions/grib2/template.3.20.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.3.3.def b/definitions/grib2/template.3.3.def
index 221f6f6..4b40131 100644
--- a/definitions/grib2/template.3.3.def
+++ b/definitions/grib2/template.3.3.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.3.30.def b/definitions/grib2/template.3.30.def
index 8f32e86..b8036c9 100644
--- a/definitions/grib2/template.3.30.def
+++ b/definitions/grib2/template.3.30.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.3.31.def b/definitions/grib2/template.3.31.def
index 2bd94b8..6d4de87 100644
--- a/definitions/grib2/template.3.31.def
+++ b/definitions/grib2/template.3.31.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.3.4.def b/definitions/grib2/template.3.4.def
index e631885..4828d79 100644
--- a/definitions/grib2/template.3.4.def
+++ b/definitions/grib2/template.3.4.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.3.40.def b/definitions/grib2/template.3.40.def
index 079b004..d926174 100644
--- a/definitions/grib2/template.3.40.def
+++ b/definitions/grib2/template.3.40.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.3.41.def b/definitions/grib2/template.3.41.def
index f908534..e11b3f0 100644
--- a/definitions/grib2/template.3.41.def
+++ b/definitions/grib2/template.3.41.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.3.42.def b/definitions/grib2/template.3.42.def
index 57819ec..3243146 100644
--- a/definitions/grib2/template.3.42.def
+++ b/definitions/grib2/template.3.42.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.3.43.def b/definitions/grib2/template.3.43.def
index cf0308c..008a92b 100644
--- a/definitions/grib2/template.3.43.def
+++ b/definitions/grib2/template.3.43.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.3.5.def b/definitions/grib2/template.3.5.def
index 7079080..8ab2b03 100644
--- a/definitions/grib2/template.3.5.def
+++ b/definitions/grib2/template.3.5.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.3.50.def b/definitions/grib2/template.3.50.def
index 64eef71..9a5e993 100644
--- a/definitions/grib2/template.3.50.def
+++ b/definitions/grib2/template.3.50.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.3.51.def b/definitions/grib2/template.3.51.def
index d7dc612..47d2491 100644
--- a/definitions/grib2/template.3.51.def
+++ b/definitions/grib2/template.3.51.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.3.52.def b/definitions/grib2/template.3.52.def
index 417436c..e0f4c9c 100644
--- a/definitions/grib2/template.3.52.def
+++ b/definitions/grib2/template.3.52.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.3.53.def b/definitions/grib2/template.3.53.def
index 52b5f07..d08a6e9 100644
--- a/definitions/grib2/template.3.53.def
+++ b/definitions/grib2/template.3.53.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.3.90.def b/definitions/grib2/template.3.90.def
index 335ef07..89d56a1 100644
--- a/definitions/grib2/template.3.90.def
+++ b/definitions/grib2/template.3.90.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -42,27 +42,28 @@ unsigned[4] dy  : dump;
 alias geography.dy=dy;
 
 #  Xp - X-coordinate of sub-satellite point
-# (in units of 10-3 grid length expressed as an integer)
+# (in units of 10^-3 grid length expressed as an integer)
 unsigned[4] Xp  : no_copy;
 meta  geography.XpInGridLengths scale(Xp,one,thousand) : dump;
 alias xCoordinateOfSubSatellitePoint=XpInGridLengths;
 
 #  Yp - Y-coordinate of sub-satellite point
-# (in units of 10-3 grid length expressed as an integer)
+# (in units of 10^-3 grid length expressed as an integer)
 unsigned[4] Yp  : no_copy;
 meta  geography.YpInGridLengths scale(Yp,one,thousand) : dump;
 alias yCoordinateOfSubSatellitePoint=YpInGridLengths;
 
 include "grib2/template.3.scanning_mode.def";
 
-#  Orientation of the grid; i.e., the angle between the increasing Y-axis and the meridian of the sub-satellite point in the direction of increasing latitude
+#  Orientation of the grid; i.e. the angle between the increasing Y-axis and the meridian
+# of the sub-satellite point in the direction of increasing latitude
 signed[4] orientationOfTheGrid : edition_specific;
 meta geography.orientationOfTheGridInDegrees
     scale(orientationOfTheGrid,oneConstant,grib2divider,truncateDegrees) : dump; 
 
 #  Nr - altitude of the camera from the Earth's centre, measured in units of the Earth's
-# (equatorial)
-unsigned[4] Nr : edition_specific,no_copy;
+# (equatorial) radius multiplied by a scale factor of 10^6
+unsigned[4] Nr : edition_specific,can_be_missing,no_copy;
 alias altitudeOfTheCameraFromTheEarthSCenterMeasuredInUnitsOfTheEarth = Nr;
 meta geography.NrInRadiusOfEarth scale(Nr,oneConstant,oneMillionConstant,truncateDegrees) : dump;
 
@@ -76,3 +77,16 @@ unsigned[4] Yo  : dump;
 alias yCoordinateOfOriginOfSectorImage=Yo;
 alias geography.Yo=Yo;
 
+iterator space_view(numberOfPoints, missingValue, values, radius,
+          earthIsOblate,
+          earthMajorAxis, earthMinorAxis,
+          Nx, Ny,
+          latitudeOfSubSatellitePointInDegrees,
+          longitudeOfSubSatellitePointInDegrees,
+          dx, dy, XpInGridLengths, YpInGridLengths,
+          orientationOfTheGridInDegrees,
+          NrInRadiusOfEarth, Xo, Yo,
+          iScansNegatively,
+          jScansPositively,
+          jPointsAreConsecutive,
+          alternativeRowScanning);
diff --git a/definitions/grib2/template.3.gaussian.def b/definitions/grib2/template.3.gaussian.def
index bf9040d..24623ca 100755
--- a/definitions/grib2/template.3.gaussian.def
+++ b/definitions/grib2/template.3.gaussian.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.3.grid.def b/definitions/grib2/template.3.grid.def
index 26d899f..cd29ebe 100644
--- a/definitions/grib2/template.3.grid.def
+++ b/definitions/grib2/template.3.grid.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.3.latlon.def b/definitions/grib2/template.3.latlon.def
index 7cae63c..9f9ec89 100755
--- a/definitions/grib2/template.3.latlon.def
+++ b/definitions/grib2/template.3.latlon.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.3.latlon_vares.def b/definitions/grib2/template.3.latlon_vares.def
index a00748b..728ea33 100755
--- a/definitions/grib2/template.3.latlon_vares.def
+++ b/definitions/grib2/template.3.latlon_vares.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.3.resolution_flags.def b/definitions/grib2/template.3.resolution_flags.def
index 469f17a..3a41462 100644
--- a/definitions/grib2/template.3.resolution_flags.def
+++ b/definitions/grib2/template.3.resolution_flags.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.3.rotation.def b/definitions/grib2/template.3.rotation.def
index 0ec2174..c38b8fb 100755
--- a/definitions/grib2/template.3.rotation.def
+++ b/definitions/grib2/template.3.rotation.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.3.scanning_mode.def b/definitions/grib2/template.3.scanning_mode.def
index 63a8d26..4c84f69 100644
--- a/definitions/grib2/template.3.scanning_mode.def
+++ b/definitions/grib2/template.3.scanning_mode.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.3.shape_of_the_earth.def b/definitions/grib2/template.3.shape_of_the_earth.def
index f92d2b8..f2cc468 100755
--- a/definitions/grib2/template.3.shape_of_the_earth.def
+++ b/definitions/grib2/template.3.shape_of_the_earth.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -71,6 +71,24 @@ _if (shapeOfTheEarth == 2){
   alias earthMajorAxisInMetres=earthMajorAxis;
   alias earthMinorAxisInMetres=earthMinorAxis;
 }
+_if (shapeOfTheEarth == 3){
+  # Major and minor axes specified (in km) by data producer
+  meta earthMajorAxis from_scale_factor_scaled_value(
+       scaleFactorOfEarthMajorAxis, scaledValueOfEarthMajorAxis);
+  meta earthMinorAxis from_scale_factor_scaled_value(
+       scaleFactorOfEarthMinorAxis, scaledValueOfEarthMinorAxis);
+  meta earthMajorAxisInMetres scale(earthMajorAxis, thousand, one, zero);
+  meta earthMinorAxisInMetres scale(earthMinorAxis, thousand, one, zero);
+}
+_if (shapeOfTheEarth == 7){
+  # Major and minor axes specified (in m) by data producer
+  meta earthMajorAxis from_scale_factor_scaled_value(
+       scaleFactorOfEarthMajorAxis, scaledValueOfEarthMajorAxis);
+  meta earthMinorAxis from_scale_factor_scaled_value(
+       scaleFactorOfEarthMinorAxis, scaledValueOfEarthMinorAxis);
+  alias earthMajorAxisInMetres=earthMajorAxis;
+  alias earthMinorAxisInMetres=earthMinorAxis;
+}
 _if (shapeOfTheEarth == 4 || shapeOfTheEarth == 5){
   # 4 -> IAG-GRS80 model
   # 5 -> WGS84
diff --git a/definitions/grib2/template.3.spherical_harmonics.def b/definitions/grib2/template.3.spherical_harmonics.def
index 8bab742..74a54cd 100755
--- a/definitions/grib2/template.3.spherical_harmonics.def
+++ b/definitions/grib2/template.3.spherical_harmonics.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.3.stretching.def b/definitions/grib2/template.3.stretching.def
index 8868c4f..9a6d202 100755
--- a/definitions/grib2/template.3.stretching.def
+++ b/definitions/grib2/template.3.stretching.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.0.def b/definitions/grib2/template.4.0.def
index e34f061..de5e396 100644
--- a/definitions/grib2/template.4.0.def
+++ b/definitions/grib2/template.4.0.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.1.def b/definitions/grib2/template.4.1.def
index 9415d10..5bf4101 100644
--- a/definitions/grib2/template.4.1.def
+++ b/definitions/grib2/template.4.1.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.10.def b/definitions/grib2/template.4.10.def
index 5f21ad9..e88c958 100644
--- a/definitions/grib2/template.4.10.def
+++ b/definitions/grib2/template.4.10.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.1000.def b/definitions/grib2/template.4.1000.def
index d1d267c..fdb7740 100644
--- a/definitions/grib2/template.4.1000.def
+++ b/definitions/grib2/template.4.1000.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.1001.def b/definitions/grib2/template.4.1001.def
index 346ed62..f36628a 100644
--- a/definitions/grib2/template.4.1001.def
+++ b/definitions/grib2/template.4.1001.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.1002.def b/definitions/grib2/template.4.1002.def
index ccf92a8..5ca2ca4 100644
--- a/definitions/grib2/template.4.1002.def
+++ b/definitions/grib2/template.4.1002.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.11.def b/definitions/grib2/template.4.11.def
index 9d9e86f..5ba10e1 100644
--- a/definitions/grib2/template.4.11.def
+++ b/definitions/grib2/template.4.11.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.1100.def b/definitions/grib2/template.4.1100.def
index 9dc74ba..589b10a 100644
--- a/definitions/grib2/template.4.1100.def
+++ b/definitions/grib2/template.4.1100.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.1101.def b/definitions/grib2/template.4.1101.def
index 49796f6..0a873a9 100644
--- a/definitions/grib2/template.4.1101.def
+++ b/definitions/grib2/template.4.1101.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.12.def b/definitions/grib2/template.4.12.def
index 7121dd1..4e1f8e4 100644
--- a/definitions/grib2/template.4.12.def
+++ b/definitions/grib2/template.4.12.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.13.def b/definitions/grib2/template.4.13.def
index 7e17469..96ff234 100644
--- a/definitions/grib2/template.4.13.def
+++ b/definitions/grib2/template.4.13.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.14.def b/definitions/grib2/template.4.14.def
index 4f62f49..5e435e6 100644
--- a/definitions/grib2/template.4.14.def
+++ b/definitions/grib2/template.4.14.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.15.def b/definitions/grib2/template.4.15.def
index 3751531..5ccbde5 100644
--- a/definitions/grib2/template.4.15.def
+++ b/definitions/grib2/template.4.15.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.2.def b/definitions/grib2/template.4.2.def
index 68cf73e..219e065 100644
--- a/definitions/grib2/template.4.2.def
+++ b/definitions/grib2/template.4.2.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.20.def b/definitions/grib2/template.4.20.def
index b8060e0..11588f3 100644
--- a/definitions/grib2/template.4.20.def
+++ b/definitions/grib2/template.4.20.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.2000.def b/definitions/grib2/template.4.2000.def
index 438b279..3b7b2fc 100644
--- a/definitions/grib2/template.4.2000.def
+++ b/definitions/grib2/template.4.2000.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.254.def b/definitions/grib2/template.4.254.def
index 661be5d..b82fdbf 100644
--- a/definitions/grib2/template.4.254.def
+++ b/definitions/grib2/template.4.254.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.3.def b/definitions/grib2/template.4.3.def
index b3e500e..6660f0a 100644
--- a/definitions/grib2/template.4.3.def
+++ b/definitions/grib2/template.4.3.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.30.def b/definitions/grib2/template.4.30.def
index e4a3e46..ddc152a 100644
--- a/definitions/grib2/template.4.30.def
+++ b/definitions/grib2/template.4.30.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.31.def b/definitions/grib2/template.4.31.def
index 3165a4e..7ac5948 100644
--- a/definitions/grib2/template.4.31.def
+++ b/definitions/grib2/template.4.31.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.311.def b/definitions/grib2/template.4.311.def
index ba34826..e6a04b2 100644
--- a/definitions/grib2/template.4.311.def
+++ b/definitions/grib2/template.4.311.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.32.def b/definitions/grib2/template.4.32.def
index e66dab8..7232059 100644
--- a/definitions/grib2/template.4.32.def
+++ b/definitions/grib2/template.4.32.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.33.def b/definitions/grib2/template.4.33.def
index 6b039ca..028ee44 100644
--- a/definitions/grib2/template.4.33.def
+++ b/definitions/grib2/template.4.33.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.34.def b/definitions/grib2/template.4.34.def
index 277c1df..a0d17f8 100644
--- a/definitions/grib2/template.4.34.def
+++ b/definitions/grib2/template.4.34.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.4.def b/definitions/grib2/template.4.4.def
index 5ccbe13..9808254 100644
--- a/definitions/grib2/template.4.4.def
+++ b/definitions/grib2/template.4.4.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.40.def b/definitions/grib2/template.4.40.def
index 7e0b0f1..427179f 100644
--- a/definitions/grib2/template.4.40.def
+++ b/definitions/grib2/template.4.40.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.40033.def b/definitions/grib2/template.4.40033.def
index 6b43213..e765f43 100644
--- a/definitions/grib2/template.4.40033.def
+++ b/definitions/grib2/template.4.40033.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.40034.def b/definitions/grib2/template.4.40034.def
index 554e29e..c20a32f 100644
--- a/definitions/grib2/template.4.40034.def
+++ b/definitions/grib2/template.4.40034.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.41.def b/definitions/grib2/template.4.41.def
index cc4ecc5..3e9780d 100644
--- a/definitions/grib2/template.4.41.def
+++ b/definitions/grib2/template.4.41.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.42.def b/definitions/grib2/template.4.42.def
index a64d183..df4caa4 100644
--- a/definitions/grib2/template.4.42.def
+++ b/definitions/grib2/template.4.42.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.43.def b/definitions/grib2/template.4.43.def
index d9b60d9..e753e93 100644
--- a/definitions/grib2/template.4.43.def
+++ b/definitions/grib2/template.4.43.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.44.def b/definitions/grib2/template.4.44.def
index 0567e9f..beeca7c 100644
--- a/definitions/grib2/template.4.44.def
+++ b/definitions/grib2/template.4.44.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.45.def b/definitions/grib2/template.4.45.def
index 5bff7a3..3d04805 100644
--- a/definitions/grib2/template.4.45.def
+++ b/definitions/grib2/template.4.45.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.46.def b/definitions/grib2/template.4.46.def
index 3894349..6cbc16c 100644
--- a/definitions/grib2/template.4.46.def
+++ b/definitions/grib2/template.4.46.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.47.def b/definitions/grib2/template.4.47.def
index e82692c..e3933a9 100644
--- a/definitions/grib2/template.4.47.def
+++ b/definitions/grib2/template.4.47.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.48.def b/definitions/grib2/template.4.48.def
index 616cff7..9ec2b89 100644
--- a/definitions/grib2/template.4.48.def
+++ b/definitions/grib2/template.4.48.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.49.def b/definitions/grib2/template.4.49.def
index f448350..ef618f4 100644
--- a/definitions/grib2/template.4.49.def
+++ b/definitions/grib2/template.4.49.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.5.def b/definitions/grib2/template.4.5.def
index 4c98c69..4ee581c 100644
--- a/definitions/grib2/template.4.5.def
+++ b/definitions/grib2/template.4.5.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.51.def b/definitions/grib2/template.4.51.def
index 6617565..e231a78 100644
--- a/definitions/grib2/template.4.51.def
+++ b/definitions/grib2/template.4.51.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.53.def b/definitions/grib2/template.4.53.def
index 38f451f..0022ec7 100644
--- a/definitions/grib2/template.4.53.def
+++ b/definitions/grib2/template.4.53.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.54.def b/definitions/grib2/template.4.54.def
index aa9db1b..cc8d42f 100644
--- a/definitions/grib2/template.4.54.def
+++ b/definitions/grib2/template.4.54.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.55.def b/definitions/grib2/template.4.55.def
index 26c1efd..11c4164 100644
--- a/definitions/grib2/template.4.55.def
+++ b/definitions/grib2/template.4.55.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.56.def b/definitions/grib2/template.4.56.def
index e9d80d2..f603029 100644
--- a/definitions/grib2/template.4.56.def
+++ b/definitions/grib2/template.4.56.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.57.def b/definitions/grib2/template.4.57.def
index 6e415ac..f0b843c 100644
--- a/definitions/grib2/template.4.57.def
+++ b/definitions/grib2/template.4.57.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.58.def b/definitions/grib2/template.4.58.def
new file mode 100644
index 0000000..0360bee
--- /dev/null
+++ b/definitions/grib2/template.4.58.def
@@ -0,0 +1,14 @@
+# Copyright 2005-2017 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# 
+# In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
+# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
+#
+# TEMPLATE 4.58, Individual ensemble forecast, control and perturbed, at a horizontal level or in a horizontal layer at a point in time for atmospheric chemical constituents based on a distribution function
+
+include "grib2/template.4.parameter_chemical_distribution.def"
+include "grib2/template.4.point_in_time.def"
+include "grib2/template.4.horizontal.def"
+include "grib2/template.4.eps.def"
diff --git a/definitions/grib2/template.4.59.def b/definitions/grib2/template.4.59.def
index 859309d..c9561fb 100644
--- a/definitions/grib2/template.4.59.def
+++ b/definitions/grib2/template.4.59.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.6.def b/definitions/grib2/template.4.6.def
index a038242..8a6a64f 100644
--- a/definitions/grib2/template.4.6.def
+++ b/definitions/grib2/template.4.6.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.60.def b/definitions/grib2/template.4.60.def
index f94c8d9..b8524ae 100644
--- a/definitions/grib2/template.4.60.def
+++ b/definitions/grib2/template.4.60.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.61.def b/definitions/grib2/template.4.61.def
index 9218890..d29d5d3 100644
--- a/definitions/grib2/template.4.61.def
+++ b/definitions/grib2/template.4.61.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.7.def b/definitions/grib2/template.4.7.def
index a952a7c..188a65f 100644
--- a/definitions/grib2/template.4.7.def
+++ b/definitions/grib2/template.4.7.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.70.def b/definitions/grib2/template.4.70.def
index 1d74288..f75833e 100644
--- a/definitions/grib2/template.4.70.def
+++ b/definitions/grib2/template.4.70.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.71.def b/definitions/grib2/template.4.71.def
index 714dfb8..98a322e 100644
--- a/definitions/grib2/template.4.71.def
+++ b/definitions/grib2/template.4.71.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.72.def b/definitions/grib2/template.4.72.def
index 7d6a4e2..48be81b 100644
--- a/definitions/grib2/template.4.72.def
+++ b/definitions/grib2/template.4.72.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.73.def b/definitions/grib2/template.4.73.def
index dbdc3c4..1f22197 100644
--- a/definitions/grib2/template.4.73.def
+++ b/definitions/grib2/template.4.73.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.8.def b/definitions/grib2/template.4.8.def
index e2e8293..4ad2421 100644
--- a/definitions/grib2/template.4.8.def
+++ b/definitions/grib2/template.4.8.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.9.def b/definitions/grib2/template.4.9.def
index 4d617bd..88bb68c 100644
--- a/definitions/grib2/template.4.9.def
+++ b/definitions/grib2/template.4.9.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.91.def b/definitions/grib2/template.4.91.def
index 0b38c62..ab25287 100644
--- a/definitions/grib2/template.4.91.def
+++ b/definitions/grib2/template.4.91.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.categorical.def b/definitions/grib2/template.4.categorical.def
index eafd697..1f8dbcd 100755
--- a/definitions/grib2/template.4.categorical.def
+++ b/definitions/grib2/template.4.categorical.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.circular_cluster.def b/definitions/grib2/template.4.circular_cluster.def
index 4a95b0a..0a32ff4 100755
--- a/definitions/grib2/template.4.circular_cluster.def
+++ b/definitions/grib2/template.4.circular_cluster.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.derived.def b/definitions/grib2/template.4.derived.def
index 985b0d2..617c287 100755
--- a/definitions/grib2/template.4.derived.def
+++ b/definitions/grib2/template.4.derived.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.eps.def b/definitions/grib2/template.4.eps.def
index 7bcb6d4..06bc6d7 100644
--- a/definitions/grib2/template.4.eps.def
+++ b/definitions/grib2/template.4.eps.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.horizontal.def b/definitions/grib2/template.4.horizontal.def
index 18a4847..9b7ba88 100755
--- a/definitions/grib2/template.4.horizontal.def
+++ b/definitions/grib2/template.4.horizontal.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.parameter.def b/definitions/grib2/template.4.parameter.def
index 658c2cf..2347f3e 100644
--- a/definitions/grib2/template.4.parameter.def
+++ b/definitions/grib2/template.4.parameter.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.parameter_aerosol.def b/definitions/grib2/template.4.parameter_aerosol.def
index 8c4e327..e09d5d6 100644
--- a/definitions/grib2/template.4.parameter_aerosol.def
+++ b/definitions/grib2/template.4.parameter_aerosol.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.parameter_aerosol_44.def b/definitions/grib2/template.4.parameter_aerosol_44.def
index 34b9438..bea4af8 100644
--- a/definitions/grib2/template.4.parameter_aerosol_44.def
+++ b/definitions/grib2/template.4.parameter_aerosol_44.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.parameter_aerosol_optical.def b/definitions/grib2/template.4.parameter_aerosol_optical.def
index 8ef09ad..1dfecdf 100644
--- a/definitions/grib2/template.4.parameter_aerosol_optical.def
+++ b/definitions/grib2/template.4.parameter_aerosol_optical.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.parameter_chemical.def b/definitions/grib2/template.4.parameter_chemical.def
index 94096ba..1660834 100644
--- a/definitions/grib2/template.4.parameter_chemical.def
+++ b/definitions/grib2/template.4.parameter_chemical.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.parameter_chemical_distribution.def b/definitions/grib2/template.4.parameter_chemical_distribution.def
index 5bbf95f..0632446 100644
--- a/definitions/grib2/template.4.parameter_chemical_distribution.def
+++ b/definitions/grib2/template.4.parameter_chemical_distribution.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.parameter_partition.def b/definitions/grib2/template.4.parameter_partition.def
index 0a09fed..6a96648 100644
--- a/definitions/grib2/template.4.parameter_partition.def
+++ b/definitions/grib2/template.4.parameter_partition.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.parameter_postproc.def b/definitions/grib2/template.4.parameter_postproc.def
index 6824a00..d5a2473 100644
--- a/definitions/grib2/template.4.parameter_postproc.def
+++ b/definitions/grib2/template.4.parameter_postproc.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.parameter_tile.def b/definitions/grib2/template.4.parameter_tile.def
index 21f9261..209d54b 100644
--- a/definitions/grib2/template.4.parameter_tile.def
+++ b/definitions/grib2/template.4.parameter_tile.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.percentile.def b/definitions/grib2/template.4.percentile.def
index 8bf41bd..3bbd7a9 100755
--- a/definitions/grib2/template.4.percentile.def
+++ b/definitions/grib2/template.4.percentile.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.point_in_time.def b/definitions/grib2/template.4.point_in_time.def
index 3803cb0..253c9c5 100644
--- a/definitions/grib2/template.4.point_in_time.def
+++ b/definitions/grib2/template.4.point_in_time.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.probability.def b/definitions/grib2/template.4.probability.def
index 09df81c..1120c79 100755
--- a/definitions/grib2/template.4.probability.def
+++ b/definitions/grib2/template.4.probability.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.rectangular_cluster.def b/definitions/grib2/template.4.rectangular_cluster.def
index e4abed8..9dbc5c6 100755
--- a/definitions/grib2/template.4.rectangular_cluster.def
+++ b/definitions/grib2/template.4.rectangular_cluster.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.4.statistical.def b/definitions/grib2/template.4.statistical.def
index d982a1a..e543a3c 100644
--- a/definitions/grib2/template.4.statistical.def
+++ b/definitions/grib2/template.4.statistical.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.5.0.def b/definitions/grib2/template.5.0.def
index e8a93c5..b881bd6 100644
--- a/definitions/grib2/template.5.0.def
+++ b/definitions/grib2/template.5.0.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.5.1.def b/definitions/grib2/template.5.1.def
index 71f35e3..550768e 100644
--- a/definitions/grib2/template.5.1.def
+++ b/definitions/grib2/template.5.1.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.5.2.def b/definitions/grib2/template.5.2.def
index 9a4a80b..287ed6f 100644
--- a/definitions/grib2/template.5.2.def
+++ b/definitions/grib2/template.5.2.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.5.3.def b/definitions/grib2/template.5.3.def
index c81a47d..daf1757 100644
--- a/definitions/grib2/template.5.3.def
+++ b/definitions/grib2/template.5.3.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.5.4.def b/definitions/grib2/template.5.4.def
index 2fedd7b..dbd99d4 100644
--- a/definitions/grib2/template.5.4.def
+++ b/definitions/grib2/template.5.4.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.5.40.def b/definitions/grib2/template.5.40.def
index f9a5f1e..79a62a0 100644
--- a/definitions/grib2/template.5.40.def
+++ b/definitions/grib2/template.5.40.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.5.40000.def b/definitions/grib2/template.5.40000.def
index 442b06f..fee0e97 100644
--- a/definitions/grib2/template.5.40000.def
+++ b/definitions/grib2/template.5.40000.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.5.40010.def b/definitions/grib2/template.5.40010.def
index 45c8427..669c103 100644
--- a/definitions/grib2/template.5.40010.def
+++ b/definitions/grib2/template.5.40010.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.5.41.def b/definitions/grib2/template.5.41.def
index ae18ee8..335ddb7 100644
--- a/definitions/grib2/template.5.41.def
+++ b/definitions/grib2/template.5.41.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.5.42.def b/definitions/grib2/template.5.42.def
index 5c0c886..b803376 100644
--- a/definitions/grib2/template.5.42.def
+++ b/definitions/grib2/template.5.42.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.5.50.def b/definitions/grib2/template.5.50.def
index a6b8cb2..94a70ed 100644
--- a/definitions/grib2/template.5.50.def
+++ b/definitions/grib2/template.5.50.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.5.50000.def b/definitions/grib2/template.5.50000.def
index b07c6d7..db89378 100644
--- a/definitions/grib2/template.5.50000.def
+++ b/definitions/grib2/template.5.50000.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.5.50001.def b/definitions/grib2/template.5.50001.def
index 2295e07..9a9d11f 100755
--- a/definitions/grib2/template.5.50001.def
+++ b/definitions/grib2/template.5.50001.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -15,6 +15,9 @@ signed[2]   binaryScaleFactor : no_copy;
 
 signed[2]   decimalScaleFactor :no_copy;
 
+# Try different values of binaryScaleFactor and decimalScaleFactor to reduce packing error
+transient optimizeScaleFactor = 0;
+
 unsigned[1] bitsPerValue ;
 if (bitsPerValue) {
 	unsigned[1] widthOfFirstOrderValues :no_copy ;
diff --git a/definitions/grib2/template.5.50002.def b/definitions/grib2/template.5.50002.def
index 647bf49..3e437b0 100755
--- a/definitions/grib2/template.5.50002.def
+++ b/definitions/grib2/template.5.50002.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -15,6 +15,9 @@ signed[2]   binaryScaleFactor : no_copy;
 
 signed[2]   decimalScaleFactor :no_copy;
 
+# Try different values of binaryScaleFactor and decimalScaleFactor to reduce packing error
+transient optimizeScaleFactor = 0;
+
 unsigned[1] bitsPerValue ;
 unsigned[1] widthOfFirstOrderValues :no_copy ;
 
diff --git a/definitions/grib2/template.5.51.def b/definitions/grib2/template.5.51.def
index d87cc37..2595045 100644
--- a/definitions/grib2/template.5.51.def
+++ b/definitions/grib2/template.5.51.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.5.6.def b/definitions/grib2/template.5.6.def
index f300418..628ed37 100644
--- a/definitions/grib2/template.5.6.def
+++ b/definitions/grib2/template.5.6.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.5.61.def b/definitions/grib2/template.5.61.def
index 91690a5..e5215f2 100644
--- a/definitions/grib2/template.5.61.def
+++ b/definitions/grib2/template.5.61.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.5.original_values.def b/definitions/grib2/template.5.original_values.def
index e7d4038..2a5ea16 100644
--- a/definitions/grib2/template.5.original_values.def
+++ b/definitions/grib2/template.5.original_values.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.5.packing.def b/definitions/grib2/template.5.packing.def
index 84610de..1247f38 100755
--- a/definitions/grib2/template.5.packing.def
+++ b/definitions/grib2/template.5.packing.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -21,6 +21,9 @@ signed[2]   binaryScaleFactor : read_only, copy_ok;
 #  Decimal scale factor (D)
 signed[2]   decimalScaleFactor ;
 
+# Try different values of binaryScaleFactor and decimalScaleFactor to reduce packing error
+transient optimizeScaleFactor = 0;
+
 
 #  Number of bits used for each packed value for simple packing, or for each group reference value for complex packing or spatial differencing
 unsigned[1] bitsPerValue;
diff --git a/definitions/grib2/template.5.second_order.def b/definitions/grib2/template.5.second_order.def
index bd2216a..be579dd 100644
--- a/definitions/grib2/template.5.second_order.def
+++ b/definitions/grib2/template.5.second_order.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.7.0.def b/definitions/grib2/template.7.0.def
index b09f4a4..83d8b4a 100644
--- a/definitions/grib2/template.7.0.def
+++ b/definitions/grib2/template.7.0.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -23,7 +23,8 @@ meta codedValues data_g2simple_packing(
       bitsPerValue,
       referenceValue,
       binaryScaleFactor,
-      decimalScaleFactor
+      decimalScaleFactor,
+      optimizeScaleFactor
 ): read_only;
 
 meta values data_apply_bitmap(codedValues,
diff --git a/definitions/grib2/template.7.1.def b/definitions/grib2/template.7.1.def
index 44cd932..097a3d3 100644
--- a/definitions/grib2/template.7.1.def
+++ b/definitions/grib2/template.7.1.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -24,7 +24,8 @@
         bitsPerValue,
         referenceValue,
         binaryScaleFactor,
-        decimalScaleFactor
+        decimalScaleFactor,
+        optimizeScaleFactor
   ): read_only;
 
   meta values data_apply_bitmap(codedValues,
@@ -40,4 +41,3 @@ meta unpackedError simple_packing_error(zero,binaryScaleFactor,decimalScaleFacto
 alias data.packedValues = codedValues;
 
 template statistics "common/statistics_grid.def";
-
diff --git a/definitions/grib2/template.7.2.def b/definitions/grib2/template.7.2.def
index 53d812b..a1df27b 100644
--- a/definitions/grib2/template.7.2.def
+++ b/definitions/grib2/template.7.2.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.7.3.def b/definitions/grib2/template.7.3.def
index 9cb1b5a..24f3f75 100644
--- a/definitions/grib2/template.7.3.def
+++ b/definitions/grib2/template.7.3.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.7.4.def b/definitions/grib2/template.7.4.def
index 11b8ae5..17fcf44 100644
--- a/definitions/grib2/template.7.4.def
+++ b/definitions/grib2/template.7.4.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.7.40.def b/definitions/grib2/template.7.40.def
index 88001a6..87717b9 100644
--- a/definitions/grib2/template.7.40.def
+++ b/definitions/grib2/template.7.40.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -14,7 +14,7 @@
 # (XI in the decoding formula)
 # ????          ng_group_reference_values
 
-    meta   codedValues data_jpeg2000_packing(
+meta   codedValues data_jpeg2000_packing(
 
               section7Length,
               offsetBeforeData,
@@ -23,11 +23,12 @@
               unitsFactor,
               unitsBias,
               changingPrecision,
-	  	 	  numberOfCodedValues,
-			  bitsPerValue,
-			  referenceValue,
-			  binaryScaleFactor,
-			  decimalScaleFactor,
+              numberOfCodedValues,
+              bitsPerValue,
+              referenceValue,
+              binaryScaleFactor,
+              decimalScaleFactor,
+              optimizeScaleFactor,
 
               #numberOfValues,
               #referenceValue,
@@ -45,15 +46,14 @@
               numberOfDataPoints,
               scanningMode
 
-
               ): read_only;
 
 meta values data_apply_bitmap(codedValues,
-                                bitmap,
-                                missingValue,
-                                binaryScaleFactor,
-                                numberOfDataPoints,
-                                numberOfValues) : dump;
+                              bitmap,
+                              missingValue,
+                              binaryScaleFactor,
+                              numberOfDataPoints,
+                              numberOfValues) : dump;
 
 alias data.packedValues = codedValues;
 
diff --git a/definitions/grib2/template.7.40000.def b/definitions/grib2/template.7.40000.def
index 15901a1..a3a8976 100644
--- a/definitions/grib2/template.7.40000.def
+++ b/definitions/grib2/template.7.40000.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.7.40010.def b/definitions/grib2/template.7.40010.def
index 0674ce1..5a0ba0f 100644
--- a/definitions/grib2/template.7.40010.def
+++ b/definitions/grib2/template.7.40010.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.7.41.def b/definitions/grib2/template.7.41.def
index 5852248..cca5716 100644
--- a/definitions/grib2/template.7.41.def
+++ b/definitions/grib2/template.7.41.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.7.42.def b/definitions/grib2/template.7.42.def
index a400349..1dc482b 100644
--- a/definitions/grib2/template.7.42.def
+++ b/definitions/grib2/template.7.42.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/template.7.50.def b/definitions/grib2/template.7.50.def
index 1b2a175..12ed7a7 100644
--- a/definitions/grib2/template.7.50.def
+++ b/definitions/grib2/template.7.50.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -30,7 +30,8 @@ transient numberOfPackedValues = numberOfValues - 1 : no_copy;
               bitsPerValue,
               referenceValue,
               binaryScaleFactor,
-              decimalScaleFactor
+              decimalScaleFactor,
+              optimizeScaleFactor
     ) : read_only;
 
 
diff --git a/definitions/grib2/template.7.50000.def b/definitions/grib2/template.7.50000.def
index 4d431d2..46bba31 100644
--- a/definitions/grib2/template.7.50000.def
+++ b/definitions/grib2/template.7.50000.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -24,6 +24,7 @@ meta codedValues data_g2complex_packing(
           referenceValue,
           binaryScaleFactor,
           decimalScaleFactor,
+          optimizeScaleFactor,
 
           GRIBEXShBugPresent,
           unpackedSubsetPrecision,
@@ -55,6 +56,7 @@ meta codedValues data_g2complex_packing(
           referenceValue,
           binaryScaleFactor,
           decimalScaleFactor,
+          optimizeScaleFactor,
 
           GRIBEXShBugPresent,
           unpackedSubsetPrecision,
@@ -84,6 +86,7 @@ meta codedValues data_g2complex_packing(
           referenceValue,
           binaryScaleFactor,
           decimalScaleFactor,
+          optimizeScaleFactor,
 
           GRIBEXShBugPresent,
           unpackedSubsetPrecision,
diff --git a/definitions/grib2/template.7.50001.def b/definitions/grib2/template.7.50001.def
index deef3a1..d2ce409 100644
--- a/definitions/grib2/template.7.50001.def
+++ b/definitions/grib2/template.7.50001.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -31,6 +31,7 @@ if(bitmapPresent)   {
      referenceValue,
      binaryScaleFactor,
      decimalScaleFactor,
+     optimizeScaleFactor,
 	#g1second_order_row_by_row args
 	 halfByte,
 	 packingType,
@@ -72,6 +73,7 @@ if(bitmapPresent)   {
 		 referenceValue,
 		 binaryScaleFactor,
 		 decimalScaleFactor,
+         optimizeScaleFactor,
 		#g1second_order_row_by_row args
 		 halfByte,
 		 packingType,
diff --git a/definitions/grib2/template.7.50002.def b/definitions/grib2/template.7.50002.def
index 305094e..b43f64c 100644
--- a/definitions/grib2/template.7.50002.def
+++ b/definitions/grib2/template.7.50002.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -29,6 +29,7 @@ if(bitmapPresent)   {
      referenceValue,
      binaryScaleFactor,
      decimalScaleFactor,
+     optimizeScaleFactor,
 	#g1second_order_row_by_row args
 	 halfByte,
 	 packingType,
@@ -77,6 +78,7 @@ if(bitmapPresent)   {
 		 referenceValue,
 		 binaryScaleFactor,
 		 decimalScaleFactor,
+         optimizeScaleFactor,
 		#g1second_order_row_by_row args
 		 halfByte,
 		 packingType,
@@ -118,6 +120,7 @@ if(bitmapPresent)   {
 		 referenceValue,
 		 binaryScaleFactor,
 		 decimalScaleFactor,
+         optimizeScaleFactor,
 		#g1second_order_row_by_row args
 		 halfByte,
 		 packingType,
diff --git a/definitions/grib2/template.7.51.def b/definitions/grib2/template.7.51.def
index 19483cb..9702107 100644
--- a/definitions/grib2/template.7.51.def
+++ b/definitions/grib2/template.7.51.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -29,6 +29,7 @@ meta codedValues data_g2complex_packing(
           referenceValue,
           binaryScaleFactor,
           decimalScaleFactor,
+          optimizeScaleFactor,
 
           GRIBEXShBugPresent,
           unpackedSubsetPrecision,
@@ -60,6 +61,7 @@ meta codedValues data_g2complex_packing(
           referenceValue,
           binaryScaleFactor,
           decimalScaleFactor,
+          optimizeScaleFactor,
 
           GRIBEXShBugPresent,
           unpackedSubsetPrecision,
@@ -89,6 +91,7 @@ meta codedValues data_g2complex_packing(
           referenceValue,
           binaryScaleFactor,
           decimalScaleFactor,
+          optimizeScaleFactor,
 
           GRIBEXShBugPresent,
           unpackedSubsetPrecision,
diff --git a/definitions/grib2/template.7.6.def b/definitions/grib2/template.7.6.def
index 039a7e0..2fc30b4 100644
--- a/definitions/grib2/template.7.6.def
+++ b/definitions/grib2/template.7.6.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -25,6 +25,7 @@
         referenceValue,
         binaryScaleFactor,
         decimalScaleFactor,
+        optimizeScaleFactor,
         typeOfPreProcessing,
         preProcessingParameter
   ): read_only;
diff --git a/definitions/grib2/template.7.61.def b/definitions/grib2/template.7.61.def
index 039a7e0..2fc30b4 100644
--- a/definitions/grib2/template.7.61.def
+++ b/definitions/grib2/template.7.61.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -25,6 +25,7 @@
         referenceValue,
         binaryScaleFactor,
         decimalScaleFactor,
+        optimizeScaleFactor,
         typeOfPreProcessing,
         preProcessingParameter
   ): read_only;
diff --git a/definitions/grib2/template.7.second_order.def b/definitions/grib2/template.7.second_order.def
index 259b0b7..92df351 100644
--- a/definitions/grib2/template.7.second_order.def
+++ b/definitions/grib2/template.7.second_order.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/grib2/units.def b/definitions/grib2/units.def
index 56d8cf4..22a77c0 100644
--- a/definitions/grib2/units.def
+++ b/definitions/grib2/units.def
@@ -1,4 +1,22 @@
 # Automatically generated by ./create_def.pl, do not edit
+#Unbalanced component of temperature
+'K' = {
+	 discipline = 0 ;
+	 parameterCategory = 0 ;
+	 parameterNumber = 28 ;
+	}
+#Unbalanced component of logarithm of surface pressure
+'~' = {
+	 discipline = 0 ;
+	 parameterCategory = 3 ;
+	 parameterNumber = 31 ;
+	}
+#Unbalanced component of divergence
+'s**-1' = {
+	 discipline = 0 ;
+	 parameterCategory = 2 ;
+	 parameterNumber = 45 ;
+	}
 #Sea-ice cover
 '(0 - 1)' = {
 	 discipline = 10 ;
@@ -470,7 +488,7 @@
 	 parameterCategory = 0 ;
 	 parameterNumber = 9 ;
 	}
-#Surface air relative humidity
+#2 metre relative humidity
 '%' = {
 	 discipline = 0 ;
 	 parameterCategory = 1 ;
diff --git a/definitions/gts/boot.def b/definitions/gts/boot.def
index dafdce2..cc4dd9a 100644
--- a/definitions/gts/boot.def
+++ b/definitions/gts/boot.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/installDefinitions.sh b/definitions/installDefinitions.sh
index 5b0d55f..5864b66 100755
--- a/definitions/installDefinitions.sh
+++ b/definitions/installDefinitions.sh
@@ -1,6 +1,6 @@
 #!/bin/sh
 #
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/mars/class.table b/definitions/mars/class.table
index 4a11dbb..ce9460c 100644
--- a/definitions/mars/class.table
+++ b/definitions/mars/class.table
@@ -30,6 +30,7 @@
 29 ur UERRA
 30 et CERA-SAT: ERA-CLIM2 coupled reanalysis of the satellite era
 31 c3 C3S: Copernicus Climate Change Service
+32 yp YOPP
 99 te Test
 100 at Austria
 101 be Belgium
diff --git a/definitions/mars/grib.edmm.fc.def b/definitions/mars/grib.edmm.fc.def
index 2f346c5..d158c9c 100644
--- a/definitions/mars/grib.edmm.fc.def
+++ b/definitions/mars/grib.edmm.fc.def
@@ -10,7 +10,8 @@ alias mars.date             = monthlyVerificationDate;
 # An exception is required for backward compatibility for the wrongly encoded data
 # See GRIB-422, GRIB-497, GRIB-833
 #
-if (class is "em" || class is "e2" || class is "ea" || class is "ep")
+if (class is "em" || class is "e2" || class is "ea" || class is "ep" ||
+    class is "rd" || class is "mc" || class is "et")
 {
    alias mars.step = endStep;
 }
diff --git a/definitions/mars/grib.ewmm.fc.def b/definitions/mars/grib.ewmm.fc.def
index 726b323..041665d 100644
--- a/definitions/mars/grib.ewmm.fc.def
+++ b/definitions/mars/grib.ewmm.fc.def
@@ -6,7 +6,8 @@ alias mars.date             = monthlyVerificationDate;
 #
 # See GRIB-422, GRIB-497, GRIB-766, GRIB-833
 #
-if (class is "em" || class is "e2" || class is "ea" || class is "ep")
+if (class is "em" || class is "e2" || class is "ea" || class is "ep" ||
+    class is "rd" || class is "mc" || class is "et")
 {
    alias mars.step = endStep;
 }
diff --git a/definitions/mars/grib.mnth.fc.def b/definitions/mars/grib.mnth.fc.def
index 9e276f2..8898af6 100644
--- a/definitions/mars/grib.mnth.fc.def
+++ b/definitions/mars/grib.mnth.fc.def
@@ -6,7 +6,8 @@ alias mars.date             = monthlyVerificationDate;
 #
 # See GRIB-497, GRIB-766, GRIB-833
 #
-if (class is "em" || class is "e2" || class is "ea" || class is "ep")
+if (class is "em" || class is "e2" || class is "ea" || class is "ep" ||
+    class is "rd" || class is "mc" || class is "et")
 {
    alias mars.step = endStep;
 }
diff --git a/definitions/mars/grib.wamo.fc.def b/definitions/mars/grib.wamo.fc.def
index 9e276f2..8898af6 100644
--- a/definitions/mars/grib.wamo.fc.def
+++ b/definitions/mars/grib.wamo.fc.def
@@ -6,7 +6,8 @@ alias mars.date             = monthlyVerificationDate;
 #
 # See GRIB-497, GRIB-766, GRIB-833
 #
-if (class is "em" || class is "e2" || class is "ea" || class is "ep")
+if (class is "em" || class is "e2" || class is "ea" || class is "ep" ||
+    class is "rd" || class is "mc" || class is "et")
 {
    alias mars.step = endStep;
 }
diff --git a/definitions/mars/make_type_switch_case.sh b/definitions/mars/make_type_switch_case.sh
index ce80c46..2347e28 100755
--- a/definitions/mars/make_type_switch_case.sh
+++ b/definitions/mars/make_type_switch_case.sh
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/metar/boot.def b/definitions/metar/boot.def
index 8701e26..6764577 100644
--- a/definitions/metar/boot.def
+++ b/definitions/metar/boot.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/metar/boot.flexible.def b/definitions/metar/boot.flexible.def
index 9fe6764..10dce41 100644
--- a/definitions/metar/boot.flexible.def
+++ b/definitions/metar/boot.flexible.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/publish_new_parameters.sh b/definitions/publish_new_parameters.sh
index 843a13c..bcafcf0 100755
--- a/definitions/publish_new_parameters.sh
+++ b/definitions/publish_new_parameters.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/taf/boot.def b/definitions/taf/boot.def
index 4b409c5..417162f 100644
--- a/definitions/taf/boot.def
+++ b/definitions/taf/boot.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/tide/boot.def b/definitions/tide/boot.def
index dde71f2..315601d 100644
--- a/definitions/tide/boot.def
+++ b/definitions/tide/boot.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/tide/mars_labeling.def b/definitions/tide/mars_labeling.def
index 99d972b..4d16052 100644
--- a/definitions/tide/mars_labeling.def
+++ b/definitions/tide/mars_labeling.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/tide/section.1.def b/definitions/tide/section.1.def
index 45c1e0f..870d19d 100644
--- a/definitions/tide/section.1.def
+++ b/definitions/tide/section.1.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/tide/section.4.def b/definitions/tide/section.4.def
index 3c85fae..1dd7a3f 100644
--- a/definitions/tide/section.4.def
+++ b/definitions/tide/section.4.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/definitions/wrap/boot.def b/definitions/wrap/boot.def
index d6364ba..ed77899 100644
--- a/definitions/wrap/boot.def
+++ b/definitions/wrap/boot.def
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/eccodes_config.h.in b/eccodes_config.h.in
index 21cd2b2..ca4c2f4 100644
--- a/eccodes_config.h.in
+++ b/eccodes_config.h.in
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -107,4 +107,8 @@
 #define ECCODES_IFS_SAMPLES_PATH "/MEMFS/ifs_samples"
 #endif
 
+#ifdef HAVE_LIBJASPER
+#define JASPER_VERSION_MAJOR @JASPER_VERSION_MAJOR@
+#endif
+
 #endif /* eccodes_config_h */
diff --git a/examples/C/CMakeLists.txt b/examples/C/CMakeLists.txt
index e9b48ad..902ece0 100644
--- a/examples/C/CMakeLists.txt
+++ b/examples/C/CMakeLists.txt
@@ -35,6 +35,7 @@ list( APPEND test_bins
       grib_copy_message
       grib_ensemble_index
       get_product_kind
+      bufr_copy_data
       bufr_attributes
       bufr_clone
       bufr_expanded
@@ -69,7 +70,9 @@ list( APPEND tests
    grib_precision
    grib_clone
    grib_copy_message
+   grib_ensemble_index
    grib_set_pv
+   grib_set_data
    grib_set_bitmap
    grib_list
    grib_get_data
@@ -77,6 +80,7 @@ list( APPEND tests
    set_missing
    sections_copy
    bufr_attributes
+   bufr_copy_data
    bufr_clone
    bufr_expanded
    bufr_get_keys
@@ -101,16 +105,20 @@ endforeach()
 ########################################################################
 # Tests which are conditional
 if( ENABLE_EXTRA_TESTS AND HAVE_ECCODES_THREADS )
-    # This one only for POSIX threads
-    ecbuild_add_executable( TARGET    c_grib_pthreads
-                            NOINSTALL
-                            SOURCES   grib_pthreads.c
-                            LIBS      eccodes
-    )
-    ecbuild_add_test( TARGET eccodes_c_grib_pthreads
-                      TYPE       SCRIPT
-                      COMMAND    ${CMAKE_CURRENT_SOURCE_DIR}/grib_pthreads.sh
-    )
+    # For POSIX threads
+    LIST(APPEND pthread_tests grib_pthreads bufr_pthreads)
+    foreach( test ${pthread_tests} )
+        ecbuild_add_executable( TARGET    c_${test}
+                                NOINSTALL
+                                SOURCES   ${test}.c
+                                LIBS      eccodes
+        )
+        ecbuild_add_test( TARGET       eccodes_c_${test}
+                          TYPE         SCRIPT
+                          COMMAND      ${CMAKE_CURRENT_SOURCE_DIR}/${test}.sh
+                          TEST_DEPENDS eccodes_download_gribs eccodes_download_bufrs
+        )
+    endforeach()
 endif()
 
 
diff --git a/examples/C/box.c b/examples/C/box.c
index 42d9527..2a6e193 100644
--- a/examples/C/box.c
+++ b/examples/C/box.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/bufr_attributes.c b/examples/C/bufr_attributes.c
index a6aab16..21b4011 100644
--- a/examples/C/bufr_attributes.c
+++ b/examples/C/bufr_attributes.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/bufr_attributes.sh b/examples/C/bufr_attributes.sh
index 952ef54..5e83863 100755
--- a/examples/C/bufr_attributes.sh
+++ b/examples/C/bufr_attributes.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/bufr_clone.c b/examples/C/bufr_clone.c
index 42e0e50..621bc11 100644
--- a/examples/C/bufr_clone.c
+++ b/examples/C/bufr_clone.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/bufr_clone.sh b/examples/C/bufr_clone.sh
index 932a7f3..7e01649 100755
--- a/examples/C/bufr_clone.sh
+++ b/examples/C/bufr_clone.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -22,11 +22,11 @@ f=${data_dir}/bufr/syno_1.bufr
 REDIRECT=/dev/null
 
 #Clone the bufr messages
-${examples_dir}c_bufr_clone $f $fBufrTmp >$REDIRECT 2> $REDIRECT 
+${examples_dir}c_bufr_clone $f $fBufrTmp >$REDIRECT 2> $REDIRECT
 
 #Compare clone to the original
 set +e
-${tools_dir}/bufr_compare $f $fBufrTmp >$REDIRECT 2> $REDIRECT 
+${tools_dir}bufr_compare $f $fBufrTmp >$REDIRECT 2> $REDIRECT
 
 #Check if clone is different
 if [ $? -eq 0 ]; then
diff --git a/examples/C/bufr_copy_data.c b/examples/C/bufr_copy_data.c
new file mode 100644
index 0000000..dd21393
--- /dev/null
+++ b/examples/C/bufr_copy_data.c
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2005-2017 ECMWF.
+ *
+ * This software is licensed under the terms of the Apache Licence Version 2.0
+ * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+ *
+ * In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
+ * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
+ */
+
+/*
+ * C Implementation: bufr_copy_data
+ *
+ * Description: How to copy all the values in the data section that are present in the same
+ *              position in the data tree and with the same number of values to the output handle
+ *
+ */
+#include "eccodes.h"
+
+static void usage(const char* progname);
+
+int main(int argc, char *argv[])
+{
+    FILE* f = NULL;
+    codes_handle* h = NULL;
+    codes_handle* ho = NULL;
+    long size;
+    char** keys = NULL;
+    size_t nkeys=0,i;
+    int err=0;
+    char* outfile = NULL;
+    const char* sampleName = "BUFR3";
+    const long ibitmap[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+            0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,
+            1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,
+            1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+            1,1,1,1,0};
+
+    const long ud[]={307011,7006,10004,222000,101023,31031,1031,1032,101023,33007,
+            225000,236000,101023,31031,1031,1032,8024,101001,225255,225000,
+            236000,101023,31031,1031,1032,8024,101001,225255,
+            1063,2001,4001,4002,4003,4004,4005,5002,
+            6002,7001,7006,11001,11016,11017,11002};
+
+    if (argc != 3) usage(argv[0]);
+
+    outfile=argv[2];
+
+    f = fopen(argv[1],"r");
+    if(!f) {
+        perror(argv[1]);
+        exit(1);
+    }
+    ho = codes_bufr_handle_new_from_samples(NULL, sampleName);
+    if (ho == NULL) {
+        fprintf(stderr, "ERROR creating BUFR from %s\n", sampleName);
+        fclose(f);
+        return 1;
+    }
+
+    size = sizeof(ibitmap)/sizeof(ibitmap[0]);
+    CODES_CHECK(codes_set_long_array(ho, "inputDataPresentIndicator", ibitmap, size), 0);
+    CODES_CHECK(codes_set_long(ho, "bufrHeaderCentre", 98), 0);
+    CODES_CHECK(codes_set_long(ho, "updateSequenceNumber", 1), 0);
+    CODES_CHECK(codes_set_long(ho, "dataCategory", 0), 0);
+    CODES_CHECK(codes_set_long(ho, "dataSubCategory", 140), 0);
+    CODES_CHECK(codes_set_long(ho, "masterTablesVersionNumber", 13), 0);
+    CODES_CHECK(codes_set_long(ho, "localTablesVersionNumber", 1), 0);
+    CODES_CHECK(codes_set_long(ho, "typicalYearOfCentury", 15), 0);
+    CODES_CHECK(codes_set_long(ho, "typicalMonth", 5), 0);
+    CODES_CHECK(codes_set_long(ho, "typicalDay", 4), 0);
+    CODES_CHECK(codes_set_long(ho, "typicalHour", 9), 0);
+    CODES_CHECK(codes_set_long(ho, "typicalMinute", 30), 0);
+    CODES_CHECK(codes_set_long(ho, "numberOfSubsets", 1), 0);
+    CODES_CHECK(codes_set_long(ho, "observedData", 1), 0);
+    CODES_CHECK(codes_set_long(ho, "compressedData", 0), 0);
+
+    size = sizeof(ud)/sizeof(ud[0]);
+    codes_set_long_array(ho,"unexpandedDescriptors",ud,size);
+
+    while((h = codes_handle_new_from_file(0,f,PRODUCT_BUFR,&err)) != NULL)
+    {
+        if(!h) {
+            printf("ERROR: Unable to create BUFR handle\n");
+            return 1;
+        }
+        /* codes_copy_key(h,ho,"unexpandedDescriptors",0); */
+        err = codes_set_long(h,"unpack",1);
+        if (err) {
+            printf("ERROR: Unable to unpack BUFR message. Quitting\n");
+            printf("       %s\n", codes_get_error_message(err));
+            return 1;
+        }
+
+        /* err=codes_bufr_copy_data(h,ho); */
+        keys=codes_bufr_copy_data_return_copied_keys(h,ho,&nkeys,&err);
+        for (i=0;i<nkeys;i++) {
+            printf("Copied %s\n",keys[i]);
+            free(keys[i]);
+        }
+        printf("Copied a total of %ld keys\n", nkeys);
+        free(keys);
+
+        codes_handle_delete(h);
+    }
+    fclose(f);
+    codes_write_message(ho,outfile,"w");
+    codes_handle_delete(ho);
+
+    return err;
+}
+
+static void usage(const char* progname)
+{
+    printf("\nUsage: %s bufr_in bufr_out\n",progname);
+    exit(1);
+}
diff --git a/examples/C/bufr_copy_data.sh b/examples/C/bufr_copy_data.sh
new file mode 100755
index 0000000..d137946
--- /dev/null
+++ b/examples/C/bufr_copy_data.sh
@@ -0,0 +1,67 @@
+#!/bin/sh
+# Copyright 2005-2017 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+#
+# In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
+# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
+
+. ./include.sh
+
+#Define a common label for all the tmp files
+label="bufr_copy_data_c"
+
+TEMP=$label.out.bufr
+REF=$label.compare.log.ref
+MYLOG=$label.compare.log
+
+rm -f ${TEMP} ${REF} ${MYLOG}
+
+cat > ${REF} <<EOF
+== 1 == DIFFERENCE == Different size for "unexpandedDescriptors"  [43]  [28]
+== 1 == DIFFERENCE == [#2#icaoLocationIndicator] not found in 2nd field
+== 1 == DIFFERENCE == [#2#icaoLocationIndicator->units] not found in 2nd field
+== 1 == DIFFERENCE == [#2#stationType] not found in 2nd field
+== 1 == DIFFERENCE == [#2#stationType->units] not found in 2nd field
+== 1 == DIFFERENCE == [#2#year] not found in 2nd field
+== 1 == DIFFERENCE == [#2#year->units] not found in 2nd field
+== 1 == DIFFERENCE == [#2#month] not found in 2nd field
+== 1 == DIFFERENCE == [#2#month->units] not found in 2nd field
+== 1 == DIFFERENCE == [#2#day] not found in 2nd field
+== 1 == DIFFERENCE == [#2#day->units] not found in 2nd field
+== 1 == DIFFERENCE == [#2#hour] not found in 2nd field
+== 1 == DIFFERENCE == [#2#hour->units] not found in 2nd field
+== 1 == DIFFERENCE == [#2#minute] not found in 2nd field
+== 1 == DIFFERENCE == [#2#minute->units] not found in 2nd field
+== 1 == DIFFERENCE == [#2#latitude] not found in 2nd field
+== 1 == DIFFERENCE == [#2#latitude->units] not found in 2nd field
+== 1 == DIFFERENCE == [#2#longitude] not found in 2nd field
+== 1 == DIFFERENCE == [#2#longitude->units] not found in 2nd field
+== 1 == DIFFERENCE == [#2#heightOfStation] not found in 2nd field
+== 1 == DIFFERENCE == [#2#heightOfStation->units] not found in 2nd field
+== 1 == DIFFERENCE == [#4#heightAboveStation] not found in 2nd field
+== 1 == DIFFERENCE == [#4#heightAboveStation->units] not found in 2nd field
+== 1 == DIFFERENCE == [#2#windDirection] not found in 2nd field
+== 1 == DIFFERENCE == [#2#windDirection->units] not found in 2nd field
+== 1 == DIFFERENCE == [#2#extremeCounterclockwiseWindDirectionOfAVariableWind] not found in 2nd field
+== 1 == DIFFERENCE == [#2#extremeCounterclockwiseWindDirectionOfAVariableWind->units] not found in 2nd field
+== 1 == DIFFERENCE == [#2#extremeClockwiseWindDirectionOfAVariableWind] not found in 2nd field
+== 1 == DIFFERENCE == [#2#extremeClockwiseWindDirectionOfAVariableWind->units] not found in 2nd field
+== 1 == DIFFERENCE == [#2#windSpeed] not found in 2nd field
+== 1 == DIFFERENCE == [#2#windSpeed->units] not found in 2nd field
+EOF
+
+INPUT=${data_dir}/bufr/metar_with_2_bias.bufr
+${examples_dir}c_bufr_copy_data ${INPUT} ${TEMP}
+
+# The input and output BUFR messages should be different
+set +e
+${tools_dir}bufr_compare ${TEMP} ${INPUT} > ${MYLOG}
+status=$?
+set -e
+[ $status -eq 1 ]
+
+diff ${MYLOG} ${REF}
+
+rm -f ${TEMP} ${REF} ${MYLOG}
diff --git a/examples/C/bufr_expanded.c b/examples/C/bufr_expanded.c
index 5e5711e..be1f204 100644
--- a/examples/C/bufr_expanded.c
+++ b/examples/C/bufr_expanded.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/bufr_expanded.sh b/examples/C/bufr_expanded.sh
index d0207b0..e54a9e6 100755
--- a/examples/C/bufr_expanded.sh
+++ b/examples/C/bufr_expanded.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/bufr_get_keys.c b/examples/C/bufr_get_keys.c
index a0240b0..791c113 100644
--- a/examples/C/bufr_get_keys.c
+++ b/examples/C/bufr_get_keys.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/bufr_get_keys.sh b/examples/C/bufr_get_keys.sh
index 4600655..7185871 100755
--- a/examples/C/bufr_get_keys.sh
+++ b/examples/C/bufr_get_keys.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/bufr_keys_iterator.c b/examples/C/bufr_keys_iterator.c
index 9dc9022..01489c5 100644
--- a/examples/C/bufr_keys_iterator.c
+++ b/examples/C/bufr_keys_iterator.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/bufr_keys_iterator.sh b/examples/C/bufr_keys_iterator.sh
index 2532525..75b0179 100755
--- a/examples/C/bufr_keys_iterator.sh
+++ b/examples/C/bufr_keys_iterator.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/bufr_missing.c b/examples/C/bufr_missing.c
index 8e0b747..fcbfed5 100644
--- a/examples/C/bufr_missing.c
+++ b/examples/C/bufr_missing.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/bufr_missing.sh b/examples/C/bufr_missing.sh
index 13d90d9..be50f2f 100755
--- a/examples/C/bufr_missing.sh
+++ b/examples/C/bufr_missing.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/bufr_pthreads.c b/examples/C/bufr_pthreads.c
new file mode 100644
index 0000000..f1a7dda
--- /dev/null
+++ b/examples/C/bufr_pthreads.c
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2005-2017 ECMWF.
+ *
+ * This software is licensed under the terms of the Apache Licence Version 2.0
+ * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+ *
+ * In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
+ * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <pthread.h>
+
+#include "eccodes.h"
+#define NUM_THREADS 3
+
+static int DBL_EQUAL(double d1, double d2, double tolerance)
+{
+    return fabs(d1-d2) <= tolerance;
+}
+
+static void* process_bufr(void* arg)
+{
+    codes_handle* h = (codes_handle*)arg;
+    long numSubsets = 0;
+    size_t size = 0;
+    double* dValues = NULL;
+
+    CODES_CHECK(codes_set_long(h, "unpack", 1),0);
+    CODES_CHECK(codes_get_long(h,"numberOfSubsets", &numSubsets),0);
+    /*printf("numberOfSubsets=%ld\n", numSubsets);*/
+    assert( numSubsets == 2016 || numSubsets == 128 );
+
+    dValues = (double*)malloc(numSubsets*sizeof(double));
+    assert(dValues);
+    size = numSubsets;
+    CODES_CHECK(codes_get_double_array(h, "latitude", dValues, &size), 0);
+    assert( DBL_EQUAL(dValues[0], 43.119, 0.01) || DBL_EQUAL(dValues[0], -58.174, 0.01) );
+
+    free(dValues);
+    pthread_exit(NULL);
+}
+
+int main(int argc, char** argv)
+{
+    pthread_t thread1, thread2;
+    int err = 0;
+    FILE* fin = 0;
+    codes_handle* h1 = 0;
+    codes_handle* h2 = 0;
+    fin = fopen("../../data/bufr/asca_139.bufr", "r");
+    h1 = codes_handle_new_from_file(NULL, fin, PRODUCT_BUFR, &err); assert(h1);
+    fclose(fin);
+    fin = fopen("../../data/bufr/aaen_55.bufr", "r");
+    h2 = codes_handle_new_from_file(NULL, fin, PRODUCT_BUFR, &err); assert(h2);
+    fclose(fin);
+
+    err = pthread_create(&thread1, NULL, process_bufr, (void *)h1);
+    assert(!err);
+
+    err = pthread_create(&thread2, NULL, process_bufr, (void *)h2);
+    assert(!err);
+
+    pthread_join(thread1, NULL);
+    pthread_join(thread2, NULL);
+    codes_handle_delete(h1);
+    codes_handle_delete(h2);
+    return 0;
+}
diff --git a/examples/C/bufr_pthreads.sh b/examples/C/bufr_pthreads.sh
new file mode 100755
index 0000000..b6a49a6
--- /dev/null
+++ b/examples/C/bufr_pthreads.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+# Copyright 2005-2017 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+#
+# In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
+# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
+
+. ./include.sh
+
+for i in `seq 0 100`; do
+   #echo iteration $i
+   ${examples_dir}c_bufr_pthreads
+done
diff --git a/examples/C/bufr_read_header.c b/examples/C/bufr_read_header.c
index 95ed002..8b27f65 100644
--- a/examples/C/bufr_read_header.c
+++ b/examples/C/bufr_read_header.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/bufr_read_header.sh b/examples/C/bufr_read_header.sh
index 984ff6f..f3efa16 100755
--- a/examples/C/bufr_read_header.sh
+++ b/examples/C/bufr_read_header.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/bufr_read_scatterometer.c b/examples/C/bufr_read_scatterometer.c
index d21bcc9..e4810ab 100644
--- a/examples/C/bufr_read_scatterometer.c
+++ b/examples/C/bufr_read_scatterometer.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/bufr_read_scatterometer.sh b/examples/C/bufr_read_scatterometer.sh
index dc66e13..d407a37 100755
--- a/examples/C/bufr_read_scatterometer.sh
+++ b/examples/C/bufr_read_scatterometer.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/bufr_read_synop.c b/examples/C/bufr_read_synop.c
index 851443a..640fb9a 100644
--- a/examples/C/bufr_read_synop.c
+++ b/examples/C/bufr_read_synop.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/bufr_read_synop.sh b/examples/C/bufr_read_synop.sh
index 7aca52f..efc0f07 100755
--- a/examples/C/bufr_read_synop.sh
+++ b/examples/C/bufr_read_synop.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/bufr_read_temp.c b/examples/C/bufr_read_temp.c
index e2ce7dc..b3bb066 100644
--- a/examples/C/bufr_read_temp.c
+++ b/examples/C/bufr_read_temp.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/bufr_read_temp.sh b/examples/C/bufr_read_temp.sh
index 5dc0859..81cc899 100755
--- a/examples/C/bufr_read_temp.sh
+++ b/examples/C/bufr_read_temp.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/bufr_set_keys.c b/examples/C/bufr_set_keys.c
index fdcf1c6..a9da5cc 100644
--- a/examples/C/bufr_set_keys.c
+++ b/examples/C/bufr_set_keys.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/bufr_set_keys.sh b/examples/C/bufr_set_keys.sh
index 5a3a1f0..df1194f 100755
--- a/examples/C/bufr_set_keys.sh
+++ b/examples/C/bufr_set_keys.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -29,7 +29,7 @@ ${examples_dir}c_bufr_set_keys $fBufrTmp  2> $REDIRECT > $REDIRECT
 
 #Compare modified to the original
 set +e
-${tools_dir}/bufr_compare $f $fBufrTmp >$REDIRECT 2> $REDIRECT 
+${tools_dir}bufr_compare $f $fBufrTmp >$REDIRECT 2> $REDIRECT
 
 #Check if modified is different
 if [ $? -eq 0 ]; then
@@ -40,7 +40,7 @@ fi
 set -e
 
 #Check if modified has the same number of messages
-[ `${tools_dir}bufr_count $f` -eq `${tools_dir}/bufr_count ${fBufrTmp}` ]
+[ `${tools_dir}bufr_count $f` -eq `${tools_dir}bufr_count ${fBufrTmp}` ]
 
 #Clean up
 rm -f $fBufrTmp | true
diff --git a/examples/C/bufr_subset.c b/examples/C/bufr_subset.c
index d71041e..542aa71 100644
--- a/examples/C/bufr_subset.c
+++ b/examples/C/bufr_subset.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/bufr_subset.sh b/examples/C/bufr_subset.sh
index be20c2f..66619e4 100755
--- a/examples/C/bufr_subset.sh
+++ b/examples/C/bufr_subset.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/ecmwf_link.sh b/examples/C/ecmwf_link.sh
index 127e4bc..461c74a 100755
--- a/examples/C/ecmwf_link.sh
+++ b/examples/C/ecmwf_link.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/fieldset.c b/examples/C/fieldset.c
index af12931..562b81f 100644
--- a/examples/C/fieldset.c
+++ b/examples/C/fieldset.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/get_product_kind.c b/examples/C/get_product_kind.c
index fc6a477..d7ffbe1 100644
--- a/examples/C/get_product_kind.c
+++ b/examples/C/get_product_kind.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/get_product_kind.sh b/examples/C/get_product_kind.sh
index b2645c5..a1b77b7 100755
--- a/examples/C/get_product_kind.sh
+++ b/examples/C/get_product_kind.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/grib_clone.c b/examples/C/grib_clone.c
index 60708de..72bb2fa 100644
--- a/examples/C/grib_clone.c
+++ b/examples/C/grib_clone.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/grib_clone.sh b/examples/C/grib_clone.sh
index 6dcc4e8..e5925c4 100755
--- a/examples/C/grib_clone.sh
+++ b/examples/C/grib_clone.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/grib_copy_message.c b/examples/C/grib_copy_message.c
index d87a424..64a106e 100644
--- a/examples/C/grib_copy_message.c
+++ b/examples/C/grib_copy_message.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -48,13 +48,13 @@ int main(int argc, char *argv[])
         const void* buffer = NULL;
         codes_handle* new_handle = NULL;
 
-        CODES_CHECK(grib_get_message_size(source_handle,&totalLength),0);
+        CODES_CHECK(codes_get_message_size(source_handle,&totalLength),0);
         buffer=(unsigned char*)malloc(totalLength*sizeof(char));
 
         CODES_CHECK(codes_get_message(source_handle, &buffer, &size),0);
         assert(size == totalLength);
 
-        new_handle = grib_handle_new_from_message(0, buffer, totalLength);
+        new_handle = codes_handle_new_from_message(0, buffer, totalLength);
 
         if (new_handle == NULL) {
             perror("ERROR: could not create GRIB handle from message");
diff --git a/examples/C/grib_copy_message.sh b/examples/C/grib_copy_message.sh
index 2a7d94d..c9de0d7 100755
--- a/examples/C/grib_copy_message.sh
+++ b/examples/C/grib_copy_message.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/grib_ensemble_index.c b/examples/C/grib_ensemble_index.c
index b17ad63..7af0a43 100644
--- a/examples/C/grib_ensemble_index.c
+++ b/examples/C/grib_ensemble_index.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -30,9 +30,11 @@ int main(int argc, char * argv[])
     double min=1e13,max=-1e13,avg=0;
     codes_index* index;
     codes_handle* h=NULL;
+    
+    if (argc<2) return 1;
 
     /* create index of file contents for paramId and number */
-    index = codes_index_new_from_file(0, "eps", "paramId,number",&ret);
+    index = codes_index_new_from_file(0, argv[1], "paramId,number",&ret);
     CODES_CHECK(ret,0);
 
     /* get size of "paramId" list */
diff --git a/examples/C/grib_ensemble_index.sh b/examples/C/grib_ensemble_index.sh
new file mode 100755
index 0000000..59cb5ea
--- /dev/null
+++ b/examples/C/grib_ensemble_index.sh
@@ -0,0 +1,23 @@
+#!/bin/sh
+# Copyright 2005-2017 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+#
+# In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
+# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
+
+. ./include.sh
+
+input="../../data/index.grib"
+${examples_dir}c_grib_ensemble_index $input
+
+# ECC-378: Empty input file
+temp=temp_index.empty.grib
+touch $temp
+set +e
+${examples_dir}c_grib_ensemble_index $temp 2>/dev/null
+status=$?
+set -e
+[ $status -ne 0 ]
+rm -f $temp
diff --git a/examples/C/grib_get_data.c b/examples/C/grib_get_data.c
index 36f0dcb..7cb60af 100644
--- a/examples/C/grib_get_data.c
+++ b/examples/C/grib_get_data.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/grib_get_data.sh b/examples/C/grib_get_data.sh
index c309c86..7adb6d6 100755
--- a/examples/C/grib_get_data.sh
+++ b/examples/C/grib_get_data.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/grib_get_keys.c b/examples/C/grib_get_keys.c
index b6811ab..346d2d4 100644
--- a/examples/C/grib_get_keys.c
+++ b/examples/C/grib_get_keys.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -135,9 +135,9 @@ int main(int argc, char** argv)
         char* name = "reservedNeedNotBePresent";
         unsigned char* byte_val = NULL ;
         size_t keySize = 0;
-        CODES_CHECK(grib_get_size(h, name, &keySize), 0);
+        CODES_CHECK(codes_get_size(h, name, &keySize), 0);
         byte_val = malloc(keySize*sizeof(char));
-        GRIB_CHECK(grib_get_bytes(h, name, byte_val, &keySize), name);
+        GRIB_CHECK(codes_get_bytes(h, name, byte_val, &keySize), name);
     }
     
     codes_handle_delete(h);
diff --git a/examples/C/grib_get_keys.sh b/examples/C/grib_get_keys.sh
index d844e48..814a1ac 100755
--- a/examples/C/grib_get_keys.sh
+++ b/examples/C/grib_get_keys.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/grib_index.c b/examples/C/grib_index.c
index 1f3fc0d..69b4808 100644
--- a/examples/C/grib_index.c
+++ b/examples/C/grib_index.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -15,7 +15,7 @@
  *
  */
 
-#include "grib_api.h"
+#include "eccodes.h"
 
 void usage(char* prog) {
     printf("usage: %s infile\n",prog);
@@ -24,8 +24,8 @@ void usage(char* prog) {
 
 int main(int argc,char* argv[])
 {
-    grib_index* index=NULL;
-    grib_handle* h=NULL;
+    codes_index* index=NULL;
+    codes_handle* h=NULL;
     char* infile=NULL;
     long *steps,*levels,*numbers; /* arrays */
     char** shortName=NULL;
@@ -42,51 +42,51 @@ int main(int argc,char* argv[])
     printf("indexing...\n");
 
     /* Create an index given set of keys*/
-    index=grib_index_new(0,"shortName,level,number,step",&ret);
-    if (ret) {printf("error: %s\n",grib_get_error_message(ret)); exit(ret);}
+    index=codes_index_new(0,"shortName,level,number,step",&ret);
+    if (ret) {printf("error: %s\n",codes_get_error_message(ret)); exit(ret);}
 
     /* Indexes a file */
-    ret=grib_index_add_file(index,infile);
-    if (ret) {printf("error: %s\n",grib_get_error_message(ret)); exit(ret);}
+    ret=codes_index_add_file(index,infile);
+    if (ret) {printf("error: %s\n",codes_get_error_message(ret)); exit(ret);}
     printf("end indexing...\n");
 
     /* get the number of distinct values of "step" in the index */
-    GRIB_CHECK(grib_index_get_size(index,"step",&stepSize),0);
+    CODES_CHECK(codes_index_get_size(index,"step",&stepSize),0);
     steps=(long*)malloc(sizeof(long)*stepSize);
     if (!steps) exit(1);
     /* get the list of distinct steps from the index */
     /* the list is in ascending order */
-    GRIB_CHECK(grib_index_get_long(index,"step",steps,&stepSize),0);
+    CODES_CHECK(codes_index_get_long(index,"step",steps,&stepSize),0);
     printf("stepSize=%ld\n",(long)stepSize);
     for (i=0;i<stepSize;i++) printf("%ld ",steps[i]);
     printf("\n");
 
     /*same as for "step"*/
-    GRIB_CHECK(grib_index_get_size(index,"level",&levelSize),0);
+    CODES_CHECK(codes_index_get_size(index,"level",&levelSize),0);
     levels=(long*)malloc(sizeof(long)*levelSize);
     if (!levels) exit(1);
     /*same as for "step"*/
-    GRIB_CHECK(grib_index_get_long(index,"level",levels,&levelSize),0);
+    CODES_CHECK(codes_index_get_long(index,"level",levels,&levelSize),0);
     printf("levelSize=%ld\n",(long)levelSize);
     for (i=0;i<levelSize;i++) printf("%ld ",levels[i]);
     printf("\n");
 
     /*same as for "step"*/
-    GRIB_CHECK(grib_index_get_size(index,"number",&numberSize),0);
+    CODES_CHECK(codes_index_get_size(index,"number",&numberSize),0);
     numbers=(long*)malloc(sizeof(long)*numberSize);
     if (!numbers) exit(1);
     /*same as for "step"*/
-    GRIB_CHECK(grib_index_get_long(index,"number",numbers,&numberSize),0);
+    CODES_CHECK(codes_index_get_long(index,"number",numbers,&numberSize),0);
     printf("numberSize=%ld\n",(long)numberSize);
     for (i=0;i<numberSize;i++) printf("%ld ",numbers[i]);
     printf("\n");
 
     /*same as for "step"*/
-    GRIB_CHECK(grib_index_get_size(index,"shortName",&shortNameSize),0);
+    CODES_CHECK(codes_index_get_size(index,"shortName",&shortNameSize),0);
     shortName=(char**)malloc(sizeof(char*)*shortNameSize);
     if (!shortName) exit(1);
     /*same as for "step"*/
-    GRIB_CHECK(grib_index_get_string(index,"shortName",shortName,&shortNameSize),0);
+    CODES_CHECK(codes_index_get_string(index,"shortName",shortName,&shortNameSize),0);
     printf("shortNameSize=%ld\n",(long)shortNameSize);
     for (i=0;i<shortNameSize;i++) printf("%s ",shortName[i]);
     printf("\n");
@@ -96,47 +96,47 @@ int main(int argc,char* argv[])
     /* different order of the nested loops doesn't affect performance*/
     for (i=0;i<shortNameSize;i++) {
         /* select the GRIB with shortName=shortName[i] */
-        grib_index_select_string(index,"shortName",shortName[i]);
+        codes_index_select_string(index,"shortName",shortName[i]);
 
         for (l=0;l<levelSize;l++) {
             /* select the GRIB with level=levels[i] */
-            grib_index_select_long(index,"level",levels[l]);
+            codes_index_select_long(index,"level",levels[l]);
 
             for (j=0;j<numberSize;j++) {
                 /* select the GRIB with number=numbers[i] */
-                grib_index_select_long(index,"number",numbers[j]);
+                codes_index_select_long(index,"number",numbers[j]);
 
                 for (k=0;k<stepSize;k++) {
                     /* select the GRIB with step=steps[i] */
-                    grib_index_select_long(index,"step",steps[k]);
+                    codes_index_select_long(index,"step",steps[k]);
 
-                    /* create a new grib_handle from the index with the constraints
+                    /* create a new codes_handle from the index with the constraints
                            imposed by the select statements. It is a loop because
                            in the index there could be more than one GRIB with those
                            constraints */
-                    while ((h=grib_handle_new_from_index(index,&ret))!=NULL){
+                    while ((h=codes_handle_new_from_index(index,&ret))!=NULL){
                         count++;
                         if (ret) {printf("error: %d\n",ret); exit(ret);}
                         lenshortName=200;
-                        grib_get_string(h,"shortName",oshortName,&lenshortName);
-                        grib_get_long(h,"level",&olevel);
-                        grib_get_long(h,"number",&onumber);
-                        grib_get_long(h,"step",&ostep);
+                        codes_get_string(h,"shortName",oshortName,&lenshortName);
+                        codes_get_long(h,"level",&olevel);
+                        codes_get_long(h,"number",&onumber);
+                        codes_get_long(h,"step",&ostep);
                         printf("shortName=%s ",oshortName);
                         printf("level=%ld ",olevel);
                         printf("number=%ld ",onumber);
                         printf("step=%ld \n",ostep);
-                        grib_handle_delete(h);
+                        codes_handle_delete(h);
                     }
-                    if (ret && ret!=GRIB_END_OF_INDEX ) {printf("error: %s\n",grib_get_error_message(ret)); exit(ret);}
+                    if (ret && ret!=GRIB_END_OF_INDEX ) {printf("error: %s\n",codes_get_error_message(ret)); exit(ret);}
                 }
             }
         }
     }
     printf("  %d messages selected\n",count);
 
-    grib_index_write(index,"out.gribidx");
-    grib_index_delete(index);
+    codes_index_write(index,"out.gribidx");
+    codes_index_delete(index);
 
     return 0;
 }
diff --git a/examples/C/grib_iterator.c b/examples/C/grib_iterator.c
index 0f3a14b..e1a5ae9 100644
--- a/examples/C/grib_iterator.c
+++ b/examples/C/grib_iterator.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -34,7 +34,7 @@ int main(int argc, char** argv)
     int n=0;
     char* filename = NULL;
 
-    /* Message handle. Required in all the grib_api calls acting on a message.*/
+    /* Message handle. Required in all the ecCodes calls acting on a message.*/
     codes_handle *h = NULL;
     /* Iterator on lat/lon/values.*/
     codes_iterator* iter=NULL;
diff --git a/examples/C/grib_iterator.sh b/examples/C/grib_iterator.sh
index f46e078..9d93a5d 100755
--- a/examples/C/grib_iterator.sh
+++ b/examples/C/grib_iterator.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/grib_iterator_bitmap.c b/examples/C/grib_iterator_bitmap.c
index 7141944..6091a37 100644
--- a/examples/C/grib_iterator_bitmap.c
+++ b/examples/C/grib_iterator_bitmap.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/grib_keys_iterator.c b/examples/C/grib_keys_iterator.c
index afe4f9f..9140773 100644
--- a/examples/C/grib_keys_iterator.c
+++ b/examples/C/grib_keys_iterator.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/grib_keys_iterator.sh b/examples/C/grib_keys_iterator.sh
index 38e16d0..8ab00fe 100755
--- a/examples/C/grib_keys_iterator.sh
+++ b/examples/C/grib_keys_iterator.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/grib_list.c b/examples/C/grib_list.c
index 9ce6a21..a4bc238 100644
--- a/examples/C/grib_list.c
+++ b/examples/C/grib_list.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/grib_list.sh b/examples/C/grib_list.sh
index b0a2277..94a644b 100755
--- a/examples/C/grib_list.sh
+++ b/examples/C/grib_list.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/grib_multi.c b/examples/C/grib_multi.c
index 97d27ea..754d3d5 100644
--- a/examples/C/grib_multi.c
+++ b/examples/C/grib_multi.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/grib_multi.sh b/examples/C/grib_multi.sh
index 8303abc..5addb9a 100755
--- a/examples/C/grib_multi.sh
+++ b/examples/C/grib_multi.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/grib_multi_write.c b/examples/C/grib_multi_write.c
index db7eff4..474a1a7 100644
--- a/examples/C/grib_multi_write.c
+++ b/examples/C/grib_multi_write.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/grib_multi_write.sh b/examples/C/grib_multi_write.sh
index 3d4d0a1..c498756 100755
--- a/examples/C/grib_multi_write.sh
+++ b/examples/C/grib_multi_write.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/grib_nearest.c b/examples/C/grib_nearest.c
index a8a5c19..cedc1ed 100644
--- a/examples/C/grib_nearest.c
+++ b/examples/C/grib_nearest.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/grib_precipitation.c b/examples/C/grib_precipitation.c
index f287fef..09dbc8e 100644
--- a/examples/C/grib_precipitation.c
+++ b/examples/C/grib_precipitation.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/grib_precision.c b/examples/C/grib_precision.c
index 4e8e9c0..dc0e52f 100644
--- a/examples/C/grib_precision.c
+++ b/examples/C/grib_precision.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/grib_precision.sh b/examples/C/grib_precision.sh
index 0318167..996fe4f 100755
--- a/examples/C/grib_precision.sh
+++ b/examples/C/grib_precision.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/grib_print_data.c b/examples/C/grib_print_data.c
index ef3d0b6..75b4eaa 100644
--- a/examples/C/grib_print_data.c
+++ b/examples/C/grib_print_data.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -50,7 +50,6 @@ int main(int argc, char** argv)
         printf("Error: unable to create handle from file %s\n",filename);
     }
 
-
     /* get the size of the values array*/
     CODES_CHECK(codes_get_size(h,"values",&values_len),0);
 
@@ -60,11 +59,10 @@ int main(int argc, char** argv)
     CODES_CHECK(codes_get_double_array(h,"values",values,&values_len),0);
 
     for(i = 0; i < values_len; i++)
-        printf("%d  %.10e\n",i+1,values[i]);
+        printf("%d  %.10e\n",i,values[i]);
 
     free(values);
 
-
     CODES_CHECK(codes_get_double(h,"max",&max),0);
     CODES_CHECK(codes_get_double(h,"min",&min),0);
     CODES_CHECK(codes_get_double(h,"average",&average),0);
@@ -72,6 +70,18 @@ int main(int argc, char** argv)
     printf("%d values found in %s\n",(int)values_len,filename);
     printf("max=%.10e min=%.10e average=%.10e\n",max,min,average);
 
+    {
+        /* Example of accessing specific elements from data values */
+        int i=0;
+        const int NUM = 3;
+        int index_arr[]    = {0, values_len/2, values_len-1};
+        double vals_arr[3] = {0, 0, 0};
+        CODES_CHECK(codes_get_double_elements(h, "values", index_arr, NUM, vals_arr), 0);
+        for (i=0; i<NUM; ++i){
+            printf("value at index %d = %.10e\n", index_arr[i], vals_arr[i]);
+        }
+    }
+
     codes_handle_delete(h);
 
     fclose(in);
diff --git a/examples/C/grib_print_data.sh b/examples/C/grib_print_data.sh
index cf4c97c..4bb4a2e 100755
--- a/examples/C/grib_print_data.sh
+++ b/examples/C/grib_print_data.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/grib_pthreads.c b/examples/C/grib_pthreads.c
index ca27ecd..17b3a57 100644
--- a/examples/C/grib_pthreads.c
+++ b/examples/C/grib_pthreads.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -60,13 +60,16 @@ int main(int argc, char** argv)
     pthread_t threads[NUM_THREADS];
     int error = 0;
     long i = 0;
-    for( i=0; i<NUM_THREADS; ++i) {
+    for (i=0; i<NUM_THREADS; ++i) {
         printf("Creating thread %ld\n", i);
         error = pthread_create(&threads[i], NULL, process_grib, (void *)i);
         if (error) {
             return 1;
         }
     }
-    pthread_exit(NULL);
+    for (i=0; i<NUM_THREADS; ++i) {
+        pthread_join(threads[i], NULL);
+    }
+
     return 0;
 }
diff --git a/examples/C/grib_pthreads.sh b/examples/C/grib_pthreads.sh
index 99d93ad..ef725a9 100755
--- a/examples/C/grib_pthreads.sh
+++ b/examples/C/grib_pthreads.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/grib_set_bitmap.c b/examples/C/grib_set_bitmap.c
index 5055de4..d39f3cf 100644
--- a/examples/C/grib_set_bitmap.c
+++ b/examples/C/grib_set_bitmap.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/grib_set_bitmap.sh b/examples/C/grib_set_bitmap.sh
index 1fb27a9..0aed0db 100755
--- a/examples/C/grib_set_bitmap.sh
+++ b/examples/C/grib_set_bitmap.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -14,7 +14,7 @@ OUT_TMP=out.set_bitmap_c.grib
 # The input and output files are hardcoded in the example
 ${examples_dir}c_grib_set_bitmap
 
-x=`${tools_dir}/grib_get -p numberOfDataPoints,numberOfCodedValues,numberOfMissing $OUT_TMP`
+x=`${tools_dir}grib_get -p numberOfDataPoints,numberOfCodedValues,numberOfMissing $OUT_TMP`
 [ "$x" = "496 486 10" ]
 
 rm -f $OUT_TMP
diff --git a/examples/C/grib_set_data.c b/examples/C/grib_set_data.c
index 4bd3829..0b6f18d 100644
--- a/examples/C/grib_set_data.c
+++ b/examples/C/grib_set_data.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -11,7 +11,9 @@
 /*
  * C Implementation: grib_set_data
  *
- * Description: set the data contained in a GRIB file
+ * Description: set the data contained in a GRIB file.
+ *              In this example no missing values are present
+ *              If there are missing values, refer to: grib_set_bitmap
  *
  */
 #include <stdio.h>
@@ -64,7 +66,7 @@ int main(int argc, char** argv)
     for (i=0;i<values_len;i++) {
         if (count>100) {e*=10; count=1;}
         values[i]=d;
-        printf("%g \n",values[i]);
+        /*printf("%g \n",values[i]);*/
         d+=e;
         count++;
     }
diff --git a/examples/C/grib_set_data.sh b/examples/C/grib_set_data.sh
new file mode 100755
index 0000000..e27cfbf
--- /dev/null
+++ b/examples/C/grib_set_data.sh
@@ -0,0 +1,16 @@
+#!/bin/sh
+# Copyright 2005-2017 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+#
+# In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
+# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
+
+. ./include.sh
+
+OUT=temp.c_grib_set_data.out.grib
+
+${examples_dir}c_grib_set_data $OUT
+
+rm -f $OUT
diff --git a/examples/C/grib_set_keys.c b/examples/C/grib_set_keys.c
index 28d8fb9..b28affe 100644
--- a/examples/C/grib_set_keys.c
+++ b/examples/C/grib_set_keys.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/grib_set_keys.sh b/examples/C/grib_set_keys.sh
index c1d141e..3d514d3 100755
--- a/examples/C/grib_set_keys.sh
+++ b/examples/C/grib_set_keys.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/grib_set_pv.c b/examples/C/grib_set_pv.c
index 7b3f86e..c29cc38 100644
--- a/examples/C/grib_set_pv.c
+++ b/examples/C/grib_set_pv.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/grib_set_pv.sh b/examples/C/grib_set_pv.sh
index dd5d671..518fd8e 100755
--- a/examples/C/grib_set_pv.sh
+++ b/examples/C/grib_set_pv.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/include.ctest.sh.in b/examples/C/include.ctest.sh.in
index 28b2923..f232139 100644
--- a/examples/C/include.ctest.sh.in
+++ b/examples/C/include.ctest.sh.in
@@ -18,6 +18,13 @@ export ECCODES_DEFINITION_PATH
 tools_dir=@CMAKE_BINARY_DIR@/bin/
 examples_dir=@CMAKE_CURRENT_BINARY_DIR@/
 
+# If this environment variable is set, then run the
+# executables with valgrind
+if test "x$ECCODES_TEST_WITH_VALGRIND" != "x"; then
+   tools_dir="valgrind --error-exitcode=1 -q $tools_dir"
+   examples_dir="valgrind --error-exitcode=1 -q $examples_dir"
+fi
+
 # use samples from binary dir to test if installation will be correct
 samp_dir="@CMAKE_BINARY_DIR@/share/@PROJECT_NAME@/samples"
 ECCODES_SAMPLES_PATH=${samp_dir}
diff --git a/examples/C/include.sh b/examples/C/include.sh
index 48899af..546e7f9 100644
--- a/examples/C/include.sh
+++ b/examples/C/include.sh
@@ -1,5 +1,5 @@
 set -ea
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -35,8 +35,10 @@ else
     tools_dir=$cpath/tools/
     examples_dir=$cpath/examples/C/
 
-#tools_dir="valgrind --error-exitcode=1 -q $cpath/tools/"
-#examples_dir="valgrind --error-exitcode=1 -q $cpath/examples/C/"
+    if test "x$ECCODES_TEST_WITH_VALGRIND" != "x"; then
+      tools_dir="valgrind --error-exitcode=1 -q $cpath/tools/"
+      examples_dir="valgrind --error-exitcode=1 -q $cpath/examples/C/"
+    fi
 
     data_dir=$cpath/data
   else
diff --git a/examples/C/large_grib1.c b/examples/C/large_grib1.c
index 9426980..562ace7 100644
--- a/examples/C/large_grib1.c
+++ b/examples/C/large_grib1.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -20,7 +20,7 @@ int main()
     double *values;
     int i = 0;
     codes_handle *h = NULL;
-    char* filename = "bigfile.grib";
+    const char* filename = "bigfile.grib";
 
     values = (double*) malloc(ni*nj*sizeof(double));
     if (!values) {
diff --git a/examples/C/large_grib1.sh b/examples/C/large_grib1.sh
index 98b01fe..6b95b51 100755
--- a/examples/C/large_grib1.sh
+++ b/examples/C/large_grib1.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/mars_param.c b/examples/C/mars_param.c
index 891b583..d9f4749 100644
--- a/examples/C/mars_param.c
+++ b/examples/C/mars_param.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/multi2.c b/examples/C/multi2.c
index 5f3052a..adc2bea 100644
--- a/examples/C/multi2.c
+++ b/examples/C/multi2.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/nc.c b/examples/C/nc.c
index ff8f2e7..6ed2f50 100644
--- a/examples/C/nc.c
+++ b/examples/C/nc.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/new_sample.c b/examples/C/new_sample.c
index c822051..7f5cd38 100644
--- a/examples/C/new_sample.c
+++ b/examples/C/new_sample.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/points.c b/examples/C/points.c
index 90d1815..408ff48 100644
--- a/examples/C/points.c
+++ b/examples/C/points.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/rename.sh b/examples/C/rename.sh
index 136f60e..1da0585 100755
--- a/examples/C/rename.sh
+++ b/examples/C/rename.sh
@@ -1,5 +1,5 @@
 #!/bin/ksh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/run_examples.sh b/examples/C/run_examples.sh
index b5e8849..8670f66 100644
--- a/examples/C/run_examples.sh
+++ b/examples/C/run_examples.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/sections_copy.c b/examples/C/sections_copy.c
index 14c901e..974ace7 100644
--- a/examples/C/sections_copy.c
+++ b/examples/C/sections_copy.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/sections_copy.sh b/examples/C/sections_copy.sh
index f5c9b77..cb7579f 100755
--- a/examples/C/sections_copy.sh
+++ b/examples/C/sections_copy.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/set_missing.c b/examples/C/set_missing.c
index 0b6a8f8..56e8c1b 100644
--- a/examples/C/set_missing.c
+++ b/examples/C/set_missing.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/set_missing.sh b/examples/C/set_missing.sh
index 6ed8036..5e8aadd 100755
--- a/examples/C/set_missing.sh
+++ b/examples/C/set_missing.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/C/values_check.c b/examples/C/values_check.c
index 5ac77f5..7a61ce3 100644
--- a/examples/C/values_check.c
+++ b/examples/C/values_check.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/CMakeLists.txt b/examples/F90/CMakeLists.txt
index ea68fe6..15c43fd 100644
--- a/examples/F90/CMakeLists.txt
+++ b/examples/F90/CMakeLists.txt
@@ -25,14 +25,17 @@ list( APPEND tests
       grib_set_bitmap
       grib_set_missing
       grib_set_pv
+      grib_set_data
       grib_samples
       grib_count_messages
       grib_count_messages_multi
+      grib_copy_namespace
       read_message
       read_from_file
       get_set_uuid
       grib_clone
       bufr_attributes
+      bufr_copy_data
       bufr_clone
       bufr_expanded
       bufr_get_keys
@@ -44,6 +47,7 @@ list( APPEND tests
       bufr_read_temp
       bufr_read_tropical_cyclone
       bufr_set_keys
+      bufr_copy_keys
       bufr_subset
       get_product_kind
 )
@@ -63,20 +67,13 @@ endforeach()
 
 # Executables without a shell script
 # TODO
-ecbuild_add_executable( TARGET    f_new_from_file
+ecbuild_add_executable( TARGET    eccodes_f_new_from_file
                         NOINSTALL
                         SOURCES   new_from_file.f90
                         CONDITION HAVE_FORTRAN
                         LINKER_LANGUAGE Fortran
                         LIBS      eccodes_f90 eccodes
 )
-ecbuild_add_executable( TARGET    f_copy_namespace
-                        NOINSTALL
-                        SOURCES   copy_namespace.f90
-                        CONDITION HAVE_FORTRAN
-                        LINKER_LANGUAGE Fortran
-                        LIBS      eccodes_f90 eccodes
-)
 ecbuild_add_executable( TARGET    eccodes_f_grib_set_gvc
                         NOINSTALL
                         SOURCES   grib_set_gvc.f90
diff --git a/examples/F90/Makefile.am b/examples/F90/Makefile.am
index 2219244..cdf73fc 100644
--- a/examples/F90/Makefile.am
+++ b/examples/F90/Makefile.am
@@ -37,7 +37,7 @@ noinst_PROGRAMS  = eccodes_f_grib_index \
                    eccodes_f_read_message \
                    eccodes_f_read_from_file \
                    eccodes_f_new_from_file \
-                   eccodes_f_copy_namespace \
+                   eccodes_f_grib_copy_namespace \
                    eccodes_f_get_set_uuid \
                    eccodes_f_grib_set_gvc \
                    eccodes_f_grib_clone \
@@ -79,7 +79,7 @@ eccodes_f_grib_count_messages_multi_SOURCES=grib_count_messages_multi.f90
 eccodes_f_read_message_SOURCES=read_message.f90
 eccodes_f_read_from_file_SOURCES=read_from_file.f90
 eccodes_f_new_from_file_SOURCES=new_from_file.f90
-eccodes_f_copy_namespace_SOURCES=copy_namespace.f90
+eccodes_f_grib_copy_namespace_SOURCES=grib_copy_namespace.f90
 eccodes_f_get_set_uuid_SOURCES=get_set_uuid.f90
 eccodes_f_grib_set_gvc_SOURCES=grib_set_gvc.f90
 eccodes_f_grib_clone_SOURCES=grib_clone.f90
diff --git a/examples/F90/bufr_attributes.f90 b/examples/F90/bufr_attributes.f90
index 7cac425..e57393e 100644
--- a/examples/F90/bufr_attributes.f90
+++ b/examples/F90/bufr_attributes.f90
@@ -1,8 +1,8 @@
 !
-!Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
-!which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
 !
 ! In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
 ! virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
@@ -32,10 +32,10 @@ character(len=32)   :: units, confUnits
 
   do while (iret/=CODES_END_OF_FILE)
     
-    ! get and print some keys form the BUFR header 
+    ! Get and print some keys form the BUFR header 
     write(*,*) 'message: ',count
 
-    ! we need to instruct ecCodes to expand all the descriptors 
+    ! We need to instruct ecCodes to expand all the descriptors 
     ! i.e. unpack the data values
     call codes_set(ibufr,"unpack",1);
 
@@ -43,75 +43,72 @@ character(len=32)   :: units, confUnits
     !  We will read the value and all the attributes available for
     !  the 2m temperature.
     ! ---------------------------------------------------------------- 
-    
-    ! get the element's value as as real
+
+    ! Get the element's value as as real
     call codes_get(ibufr,'airTemperatureAt2M',t2m);
     write(*,*) '  airTemperatureAt2M:',t2m
    
-    ! get the element's code (see BUFR code table B)
+    ! Get the element's code (see BUFR code table B)
     call codes_get(ibufr,'airTemperatureAt2M->code',iVal);
     write(*,*) '  airTemperatureAt2M->code:',iVal
    
-    ! get the element's units (see BUFR code table B)
+    ! Get the element's units (see BUFR code table B)
     call codes_get(ibufr,'airTemperatureAt2M->units',units)
     write(*,*) '  airTemperatureAt2M->units:',units
    
-    ! get the element's scale (see BUFR code table B)
+    ! Get the element's scale (see BUFR code table B)
     call codes_get(ibufr,'airTemperatureAt2M->scale',iVal);
     write(*,*) '  airTemperatureAt2M->code:',iVal
    
-    ! get the element's reference (see BUFR code table B)
+    ! Get the element's reference (see BUFR code table B)
     call codes_get(ibufr,'airTemperatureAt2M->reference',iVal);
     write(*,*) '  airTemperatureAt2M->reference:',iVal
    
-    ! get the element's width (see BUFR code table B)
+    ! Get the element's width (see BUFR code table B)
     call codes_get(ibufr,'airTemperatureAt2M->width',iVal);
     write(*,*) '  airTemperatureAt2M->width:',iVal
-       
+
     ! -------------------------------------------------------------------
     !  The 2m temperature data element in this message has an associated 
     !  field: percentConfidence. Its value and attributes can be accessed 
     !  in a similar manner as was shown above for 2m temperature. 
     ! ------------------------------------------------------------------- 
- 
-    ! get the element's value as as real
+
+    ! Get the element's value as as real
     call codes_get(ibufr,'airTemperatureAt2M->percentConfidence',conf);
     write(*,*) '  airTemperatureAt2M->percentConfidence:', conf
-   
-    ! get the element's code (see BUFR code table B)
+
+    ! Get the element's code (see BUFR code table B)
     call codes_get(ibufr,'airTemperatureAt2M->percentConfidence->code',iVal);
     write(*,*) '  airTemperatureAt2M->percentConfidence->code:',iVal
-   
-    ! get the element's units (see BUFR code table B)
+
+    ! Get the element's units (see BUFR code table B)
     call codes_get(ibufr,'airTemperatureAt2M->percentConfidence->units',confUnits)
     write(*,*) '  airTemperatureAt2M->percentConfidence->units:',confUnits
-   
-    ! get the element's scale (see BUFR code table B)
+
+    ! Get the element's scale (see BUFR code table B)
     call codes_get(ibufr,'airTemperatureAt2M->percentConfidence->scale',iVal);
     write(*,*) '  airTemperatureAt2M->percentConfidence->code:',iVal
-   
-    ! get the element's reference (see BUFR code table B)
+
+    ! Get the element's reference (see BUFR code table B)
     call codes_get(ibufr,'airTemperatureAt2M->percentConfidence->reference',iVal);
     write(*,*) '  airTemperatureAt2M->percentConfidence->reference:',iVal
-   
-    ! get the element's width (see BUFR code table B)
+
+    ! Get the element's width (see BUFR code table B)
     call codes_get(ibufr,'airTemperatureAt2M->percentConfidence->width',iVal);
     write(*,*) '  airTemperatureAt2M->percentConfidence->width:',iVal
- 
- 
-    ! release the bufr message
+
+    ! Release the bufr message
     call codes_release(ibufr)
 
-    ! load the next bufr message
+    ! Load the next bufr message
     call codes_bufr_new_from_file(ifile,ibufr,iret)
-    
+
     count=count+1
-    
+
   end do  
 
-! close file  
+  ! Close file  
   call codes_close_file(ifile)
- 
 
 end program bufr_attributes
-
diff --git a/examples/F90/bufr_attributes.sh b/examples/F90/bufr_attributes.sh
index 599990e..cdbf86f 100755
--- a/examples/F90/bufr_attributes.sh
+++ b/examples/F90/bufr_attributes.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/bufr_clone.f90 b/examples/F90/bufr_clone.f90
index c372d70..dfac304 100644
--- a/examples/F90/bufr_clone.f90
+++ b/examples/F90/bufr_clone.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -12,7 +12,6 @@
 !               an existing message.
 !
 !
-!
 program bufr_clone
   use eccodes
   implicit none
@@ -20,36 +19,36 @@ program bufr_clone
   integer       :: infile,outfile
   integer       :: ibufr_in
   integer       :: ibufr_out
-  
-  !open source file 
+
+  ! Open source file 
   call codes_open_file(infile,'../../data/bufr/syno_multi.bufr','r')
 
-  ! open target file
+  ! Open target file
   call codes_open_file(outfile,'bufr_clone_test_f.clone.bufr','w')
 
-  ! the first bufr message is loaded from file
+  ! The first bufr message is loaded from file,
   ! ibufr is the bufr id to be used in subsequent calls
   call codes_bufr_new_from_file(infile,ibufr_in,iret)
 
-  ! create several clones of this message and alter them
+  ! Create several clones of this message and alter them
   ! in different ways
   do i=1,3
 
-    ! clone the current handle
+    ! Clone the current handle
     call codes_clone(ibufr_in, ibufr_out)
 
     ! This is the place where you may wish to modify the clone 
     ! E.g. we change the bufrHeaderCentre 
     call codes_set(ibufr_out,'bufrHeaderCentre',222)
 
-    ! write cloned messages to a file
+    ! Write cloned messages to a file
     call codes_write(ibufr_out,outfile)
 
-    ! release the clone's handle
+    ! Release the clone's handle
     call codes_release(ibufr_out)
   end do  
 
-  ! release the original handle
+  ! Release the original handle
   call codes_release(ibufr_in)
 
   call codes_close_file(infile)
diff --git a/examples/F90/bufr_clone.sh b/examples/F90/bufr_clone.sh
index d93e766..a792b4b 100755
--- a/examples/F90/bufr_clone.sh
+++ b/examples/F90/bufr_clone.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -26,7 +26,7 @@ ${examples_dir}/eccodes_f_bufr_clone >$REDIRECT 2> $REDIRECT
 
 #Compare clone to the original
 set +e
-${tools_dir}/bufr_compare $f $fBufrTmp >$REDIRECT 2> $REDIRECT
+${tools_dir}bufr_compare $f $fBufrTmp >$REDIRECT 2> $REDIRECT
 
 #Check if clone is different
 if [ $? -eq 0 ]; then
diff --git a/examples/F90/bufr_copy_data.f90 b/examples/F90/bufr_copy_data.f90
new file mode 100644
index 0000000..2e5ed4d
--- /dev/null
+++ b/examples/F90/bufr_copy_data.f90
@@ -0,0 +1,87 @@
+!
+!Copyright 2005-2017 ECMWF.
+!
+! This software is licensed under the terms of the Apache Licence Version 2.0
+!which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+!
+! In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
+! virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
+!
+!
+! FORTRAN 90 implementation: bufr_copy_data
+!
+! Description: How to copy all the values in the data section that are present in the same
+!              position in the data tree and with the same number of values to the output handle
+!
+!
+
+program bufr_encode
+  use eccodes
+  implicit none
+  integer                                       :: iret
+  integer                                       :: outfile
+  integer                                       :: ifile
+  integer                                       :: ibufr
+  integer                                       :: ibufrin
+  integer(kind=4), dimension(:), allocatable    :: ivalues
+  integer, parameter                            :: max_strsize = 200
+  character(len=max_strsize)                    :: infile_name
+  character(len=max_strsize)                    :: outfile_name
+
+  call codes_bufr_new_from_samples(ibufr,'BUFR3',iret)
+  call getarg(1, infile_name)
+  call getarg(2, outfile_name)
+  call codes_open_file(ifile, infile_name, 'r')
+  call codes_bufr_new_from_file(ifile, ibufrin)
+
+  if (iret/=CODES_SUCCESS) then
+    print *,'ERROR creating BUFR from BUFR3'
+    stop 1
+  endif
+  if(allocated(ivalues)) deallocate(ivalues)
+  allocate(ivalues(69))
+  ivalues=(/   &
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   &
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   &
+      0, 0, 0, 1, 1, 1, 1, 1, 1, 1,   &
+      1, 1, 1, 1, 1, 1, 1, 1, 1, 1,   &
+      1, 1, 1, 1, 1, 0, 1, 1, 1, 1,   &
+      1, 1, 1, 1, 1, 1, 1, 1, 1, 1,   &
+      1, 1, 1, 1, 1, 1, 1, 1, 0 /)
+  call codes_set(ibufr,'inputDataPresentIndicator',ivalues)
+  call codes_set(ibufr,'edition',3)
+  call codes_set(ibufr,'masterTableNumber',0)
+  call codes_set(ibufr,'bufrHeaderSubCentre',0)
+  call codes_set(ibufr,'bufrHeaderCentre',98)
+  call codes_set(ibufr,'updateSequenceNumber',1)
+  call codes_set(ibufr,'dataCategory',0)
+  call codes_set(ibufr,'dataSubCategory',140)
+  call codes_set(ibufr,'masterTablesVersionNumber',13)
+  call codes_set(ibufr,'localTablesVersionNumber',1)
+  call codes_set(ibufr,'typicalYearOfCentury',15)
+  call codes_set(ibufr,'typicalMonth',5)
+  call codes_set(ibufr,'typicalDay',4)
+  call codes_set(ibufr,'typicalHour',9)
+  call codes_set(ibufr,'typicalMinute',30)
+  call codes_set(ibufr,'numberOfSubsets',1)
+  call codes_set(ibufr,'observedData',1)
+  call codes_set(ibufr,'compressedData',0)
+  if(allocated(ivalues)) deallocate(ivalues)
+  allocate(ivalues(43))
+  ivalues=(/  &
+    307011,7006,10004,222000,101023,31031,1031,1032,101023,33007, &
+    225000,236000,101023,31031,1031,1032,8024,101001,225255,225000, &
+    236000,101023,31031,1031,1032,8024,101001,225255, &
+    1063,2001,4001,4002,4003,4004,4005,5002, &
+    6002,7001,7006,11001,11016,11017,11002 /)
+  call codes_set(ibufr,'unexpandedDescriptors',ivalues)
+
+  call codes_set(ibufrin,'unpack',1)
+
+  call codes_bufr_copy_data(ibufrin, ibufr)
+
+  call codes_open_file(outfile,outfile_name,'w')
+  call codes_write(ibufr,outfile)
+  call codes_close_file(outfile)
+  call codes_release(ibufr)
+end program bufr_encode
diff --git a/examples/F90/bufr_copy_data.sh b/examples/F90/bufr_copy_data.sh
new file mode 100755
index 0000000..a7ddc11
--- /dev/null
+++ b/examples/F90/bufr_copy_data.sh
@@ -0,0 +1,67 @@
+#!/bin/sh
+# Copyright 2005-2017 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+#
+# In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
+# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
+
+. ./include.sh
+
+#Define a common label for all the tmp files
+label="bufr_copy_data_f"
+
+TEMP=$label.out.bufr
+REF=$label.compare.log.ref
+MYLOG=$label.compare.log
+
+cd ${data_dir}/bufr
+rm -f ${TEMP} ${REF} ${MYLOG}
+
+cat > ${REF} <<EOF
+== 1 == DIFFERENCE == Different size for "unexpandedDescriptors"  [43]  [28]
+== 1 == DIFFERENCE == [#2#icaoLocationIndicator] not found in 2nd field
+== 1 == DIFFERENCE == [#2#icaoLocationIndicator->units] not found in 2nd field
+== 1 == DIFFERENCE == [#2#stationType] not found in 2nd field
+== 1 == DIFFERENCE == [#2#stationType->units] not found in 2nd field
+== 1 == DIFFERENCE == [#2#year] not found in 2nd field
+== 1 == DIFFERENCE == [#2#year->units] not found in 2nd field
+== 1 == DIFFERENCE == [#2#month] not found in 2nd field
+== 1 == DIFFERENCE == [#2#month->units] not found in 2nd field
+== 1 == DIFFERENCE == [#2#day] not found in 2nd field
+== 1 == DIFFERENCE == [#2#day->units] not found in 2nd field
+== 1 == DIFFERENCE == [#2#hour] not found in 2nd field
+== 1 == DIFFERENCE == [#2#hour->units] not found in 2nd field
+== 1 == DIFFERENCE == [#2#minute] not found in 2nd field
+== 1 == DIFFERENCE == [#2#minute->units] not found in 2nd field
+== 1 == DIFFERENCE == [#2#latitude] not found in 2nd field
+== 1 == DIFFERENCE == [#2#latitude->units] not found in 2nd field
+== 1 == DIFFERENCE == [#2#longitude] not found in 2nd field
+== 1 == DIFFERENCE == [#2#longitude->units] not found in 2nd field
+== 1 == DIFFERENCE == [#2#heightOfStation] not found in 2nd field
+== 1 == DIFFERENCE == [#2#heightOfStation->units] not found in 2nd field
+== 1 == DIFFERENCE == [#4#heightAboveStation] not found in 2nd field
+== 1 == DIFFERENCE == [#4#heightAboveStation->units] not found in 2nd field
+== 1 == DIFFERENCE == [#2#windDirection] not found in 2nd field
+== 1 == DIFFERENCE == [#2#windDirection->units] not found in 2nd field
+== 1 == DIFFERENCE == [#2#extremeCounterclockwiseWindDirectionOfAVariableWind] not found in 2nd field
+== 1 == DIFFERENCE == [#2#extremeCounterclockwiseWindDirectionOfAVariableWind->units] not found in 2nd field
+== 1 == DIFFERENCE == [#2#extremeClockwiseWindDirectionOfAVariableWind] not found in 2nd field
+== 1 == DIFFERENCE == [#2#extremeClockwiseWindDirectionOfAVariableWind->units] not found in 2nd field
+== 1 == DIFFERENCE == [#2#windSpeed] not found in 2nd field
+== 1 == DIFFERENCE == [#2#windSpeed->units] not found in 2nd field
+EOF
+
+INPUT=metar_with_2_bias.bufr
+${examples_dir}eccodes_f_bufr_copy_data ${INPUT} ${TEMP}
+# The input and output BUFR messages should be different
+set +e
+${tools_dir}bufr_compare ${TEMP} ${INPUT} > ${MYLOG}
+status=$?
+set -e
+[ $status -eq 1 ]
+
+diff ${MYLOG} ${REF}
+
+rm -f ${TEMP} ${REF} ${MYLOG}
diff --git a/examples/F90/bufr_copy_keys.f90 b/examples/F90/bufr_copy_keys.f90
new file mode 100644
index 0000000..cc8f009
--- /dev/null
+++ b/examples/F90/bufr_copy_keys.f90
@@ -0,0 +1,34 @@
+! Copyright 2005-2017 ECMWF.
+!
+! This software is licensed under the terms of the Apache Licence Version 2.0
+! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+! 
+! In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
+! virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
+!
+!  Description: how to copy a BUFR key from a message to another.
+!               
+program bufr_copy_keys
+  use eccodes
+  implicit none  
+  integer  :: file1, file2, file3
+  integer  :: ibufr1,ibufr2,ibufr3
+
+  call codes_open_file(file1, '../../data/bufr/PraticaTemp.bufr', 'r')
+  call codes_open_file(file2, '../../data/bufr/aaen_55.bufr', 'r')
+  call codes_open_file(file3, 'out.bufr_copy_keys_test_f.bufr', 'w')
+
+  call codes_bufr_new_from_file(file1, ibufr1)
+  call codes_bufr_new_from_file(file2, ibufr2)
+
+  call codes_clone(ibufr2, ibufr3)
+
+  call codes_copy_key(ibufr1, 'bufrHeaderCentre', ibufr3)
+
+  call codes_write(ibufr3, file3)
+
+  call codes_close_file(file1)
+  call codes_close_file(file2)
+  call codes_close_file(file3)
+
+end program bufr_copy_keys
diff --git a/examples/F90/bufr_copy_keys.sh b/examples/F90/bufr_copy_keys.sh
new file mode 100755
index 0000000..dfe0230
--- /dev/null
+++ b/examples/F90/bufr_copy_keys.sh
@@ -0,0 +1,25 @@
+#!/bin/sh
+# Copyright 2005-2017 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+#
+# In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
+# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
+
+. ./include.sh
+
+#Define a common label for all the tmp files
+label="bufr_copy_keys_test_f"
+
+TEMP=$label.out.bufr
+
+cd ${data_dir}/bufr
+
+#The input and output BUFR files are hardcoded in the f90 example!!!
+OUTPUT=out.$label.bufr
+${examples_dir}eccodes_f_bufr_copy_keys
+res=`${tools_dir}bufr_get -p bufrHeaderCentre $OUTPUT`
+[ "$res" = "80" ]
+
+rm -f $OUTPUT
diff --git a/examples/F90/bufr_copy_message.f90 b/examples/F90/bufr_copy_message.f90
index 1421997..c9a4c03 100644
--- a/examples/F90/bufr_copy_message.f90
+++ b/examples/F90/bufr_copy_message.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -11,7 +11,6 @@
 !  Description: how to copy a BUFR message in memory
 !
 !
-!
 program copy
   use eccodes
   implicit none
@@ -23,11 +22,10 @@ program copy
   character(len=1), dimension(:), allocatable :: message
   character(len=32)                  :: product_kind
 
-
   call codes_open_file(infile,'../../data/bufr/syno_1.bufr', 'r')
   call codes_open_file(outfile,'out.copy.bufr', 'w')
 
-  ! A new BUFR message is loaded from file
+  ! A new BUFR message is loaded from file,
   ! ibufr_in is the BUFR id to be used in subsequent calls
   call codes_bufr_new_from_file(infile, ibufr_in)
 
diff --git a/examples/F90/bufr_copy_message.sh b/examples/F90/bufr_copy_message.sh
index 9d7c319..fd676d9 100755
--- a/examples/F90/bufr_copy_message.sh
+++ b/examples/F90/bufr_copy_message.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -13,6 +13,6 @@ INPUT="../../data/bufr/syno_1.bufr"
 OUTPUT=out.copy.bufr
 
 ${examples_dir}eccodes_f_bufr_copy_message > /dev/null
-${tools_dir}/bufr_compare -b bufrHeaderSubCentre $INPUT $OUTPUT
+${tools_dir}bufr_compare -b bufrHeaderSubCentre $INPUT $OUTPUT
 
 rm -f $OUTPUT
diff --git a/examples/F90/bufr_expanded.f90 b/examples/F90/bufr_expanded.f90
index ba05560..6f75c8c 100644
--- a/examples/F90/bufr_expanded.f90
+++ b/examples/F90/bufr_expanded.f90
@@ -1,5 +1,5 @@
 !
-!Copyright 2005-2016 ECMWF.
+!Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 !which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -26,20 +26,20 @@ real(kind=8), dimension(:), allocatable       :: values
 
   call codes_open_file(ifile,'../../data/bufr/syno_1.bufr','r')
 
-! the first bufr message is loaded from file
-! ibufr is the bufr id to be used in subsequent calls
+  ! The first bufr message is loaded from file,
+  ! ibufr is the bufr id to be used in subsequent calls
   call codes_bufr_new_from_file(ifile,ibufr,iret)
 
   do while (iret/=CODES_END_OF_FILE)
 
-    ! get and print some keys form the BUFR header 
+    ! Get and print some keys form the BUFR header 
     write(*,*) 'message: ',count
 
-    ! we need to instruct ecCodes to expand all the descriptors 
+    ! We need to instruct ecCodes to expand all the descriptors 
     ! i.e. unpack the data values
     call codes_set(ibufr,"unpack",1);
 
-    ! get the expanded data values
+    ! Get the expanded data values
     call codes_get(ibufr,'numericValues',values)
 
     numberOfValues=size(values)
@@ -48,21 +48,20 @@ real(kind=8), dimension(:), allocatable       :: values
         write(*,*) '  ',i,values(i)
     enddo
 
-    ! release the bufr message
+    ! Release the bufr message
     call codes_release(ibufr)
 
-    ! load the next bufr message
+    ! Load the next bufr message
     call codes_bufr_new_from_file(ifile,ibufr,iret)
 
-    ! free array
+    ! Free array
     deallocate(values)
 
     count=count+1
 
   end do
 
-! close file
+  ! Close file
   call codes_close_file(ifile)
 
-
 end program bufr_expanded
diff --git a/examples/F90/bufr_expanded.sh b/examples/F90/bufr_expanded.sh
index 6e472b7..7bb77a8 100755
--- a/examples/F90/bufr_expanded.sh
+++ b/examples/F90/bufr_expanded.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/bufr_get_keys.f90 b/examples/F90/bufr_get_keys.f90
index 5a0aa0c..40f6bc8 100644
--- a/examples/F90/bufr_get_keys.f90
+++ b/examples/F90/bufr_get_keys.f90
@@ -1,5 +1,5 @@
 !
-!Copyright 2005-2016 ECMWF.
+!Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 !which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -28,8 +28,8 @@ character(len=9)   :: typicalDate
 
   call codes_open_file(ifile,'../../data/bufr/syno_multi.bufr','r')
 
-! the first bufr message is loaded from file
-! ibufr is the bufr id to be used in subsequent calls
+  ! The first bufr message is loaded from file,
+  ! ibufr is the bufr id to be used in subsequent calls
   call codes_bufr_new_from_file(ifile,ibufr,iret)
 
   do while (iret/=CODES_END_OF_FILE)
@@ -37,22 +37,22 @@ character(len=9)   :: typicalDate
     ! For debugging
     call codes_dump(ibufr)
 
-    ! get and print some keys form the BUFR header 
+    ! Get and print some keys form the BUFR header 
     write(*,*) 'message: ',count
 
-    ! we need to instruct ecCodes to expand all the descriptors 
+    ! We need to instruct ecCodes to expand all the descriptors 
     ! i.e. unpack the data values
     call codes_set(ibufr,"unpack",1);
 
-    ! get as character
+    ! Get as character
     call codes_get(ibufr,'typicalDate',typicalDate)
     write(*,*) '  typicalDate:',typicalDate
 
-    ! get as integer
+    ! Get as integer
     call codes_get(ibufr,'blockNumber',blockNumber);
     write(*,*) '  blockNumber:',blockNumber
 
-    ! get as integer
+    ! Get as integer
     call codes_get(ibufr,'stationNumber',stationNumber);
     write(*,*) '  stationNumber:',stationNumber
 
@@ -71,33 +71,32 @@ character(len=9)   :: typicalDate
 
     ! ---- array of real ----------------
 
-    ! get the expanded data values
+    ! Get the expanded data values
     call codes_get(ibufr,'numericValues',values)
 
     do i=1,size(values)
         write(*,*) '  ',i,values(i)
     enddo
 
-    ! get as character
+    ! Get as character
     call codes_get(ibufr,'typicalDate',typicalDate)
     write(*,*) '  typicalDate:',typicalDate
 
-    ! free arrays
+    ! Free arrays
     deallocate(values)
     deallocate(descriptors)
 
-    ! release the bufr message
+    ! Release the bufr message
     call codes_release(ibufr)
 
-    ! load the next bufr message
+    ! Load the next bufr message
     call codes_bufr_new_from_file(ifile,ibufr,iret)
 
     count=count+1
 
   end do
 
-  ! close file
+  ! Close file
   call codes_close_file(ifile)
 
-
 end program bufr_get_keys
diff --git a/examples/F90/bufr_get_keys.sh b/examples/F90/bufr_get_keys.sh
index 7f9d284..43cbb74 100755
--- a/examples/F90/bufr_get_keys.sh
+++ b/examples/F90/bufr_get_keys.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/bufr_get_string_array.f90 b/examples/F90/bufr_get_string_array.f90
index c754883..ee1597a 100644
--- a/examples/F90/bufr_get_string_array.f90
+++ b/examples/F90/bufr_get_string_array.f90
@@ -1,5 +1,5 @@
 !
-!Copyright 2005-2016 ECMWF.
+!Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 !which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -26,13 +26,13 @@ program bufr_get_string_array
 
   call codes_bufr_new_from_file(ifile,ibufr,iret)
 
-  ! unpack the data values
+  ! Unpack the data values
   call codes_set(ibufr,'unpack',1)
 
-  ! get the width of the strings which is the same for all of them
+  ! Get the width of the strings which is the same for all of them
   call codes_get(ibufr,'stationOrSiteName->width',strsize)
 
-  ! the width is given in bits
+  ! The width is given in bits
   strsize=strsize/8
 
   ! max_strsize has to be set to a value >= to the size of the strings that we are getting 
@@ -42,24 +42,24 @@ program bufr_get_string_array
     call exit(1)
   end if
 
-  ! allocating the array of strings to be passed to codes_get_string_array is mandatory
+  ! Allocating the array of strings to be passed to codes_get_string_array is mandatory
   call codes_get_size(ibufr,'stationOrSiteName',n)
   allocate(stationOrSiteName(n))
 
-  ! passing an array of strings stationOrSiteName which must be allocated beforehand 
+  ! Passing an array of strings stationOrSiteName which must be allocated beforehand 
   call codes_get_string_array(ibufr,'stationOrSiteName',stationOrSiteName)
   do i=1,n
     write(*,'(A)')trim(stationOrSiteName(i))
   end do
 
-  !remember to deallocate 
+  ! Remember to deallocate 
   deallocate(stationOrSiteName)
 
-  ! release memory associated with bufr handle
+  ! Release memory associated with bufr handle
   ! ibufr won't be accessible after this
   call codes_release(ibufr)
 
-  ! close file  
+  ! Close file  
   call codes_close_file(ifile)
 
 end program bufr_get_string_array
diff --git a/examples/F90/bufr_get_string_array.sh b/examples/F90/bufr_get_string_array.sh
index cd06cf1..dcf9fc4 100755
--- a/examples/F90/bufr_get_string_array.sh
+++ b/examples/F90/bufr_get_string_array.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/bufr_keys_iterator.f90 b/examples/F90/bufr_keys_iterator.f90
index 1333180..97116fb 100644
--- a/examples/F90/bufr_keys_iterator.f90
+++ b/examples/F90/bufr_keys_iterator.f90
@@ -1,5 +1,5 @@
 !
-!Copyright 2005-2016 ECMWF.
+!Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 !which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -29,19 +29,19 @@ integer            :: kiter
 
   call codes_open_file(ifile,'../../data/bufr/syno_1.bufr','r')
 
-! name_space='' to get all the keys 
+  ! name_space='' to get all the keys 
   name_space='ls'
 
-! the first bufr message is loaded from file
-! ibufr is the bufr id to be used in subsequent calls
+  ! The first bufr message is loaded from file,
+  ! ibufr is the bufr id to be used in subsequent calls
   call codes_bufr_new_from_file(ifile,ibufr,iret)
 
   do while (iret /= CODES_END_OF_FILE)
-    
-    ! get and print some keys form the BUFR header 
+
+    ! Get and print some keys form the BUFR header 
     write(*,*) 'message: ',count
- 
-    ! create key iterator
+
+    ! Create key iterator
     call codes_keys_iterator_new(ibufr,kiter,name_space,iret)
 
     if (iret .ne. 0) then
@@ -49,36 +49,35 @@ integer            :: kiter
         call exit(1)
     end if   
 
-    ! get first key 
+    ! Get first key
     call codes_keys_iterator_next(kiter, iret)
 
-    ! loop over keys
+    ! Loop over keys
     do while (iret == CODES_SUCCESS) 
     
-        ! print key name
+        ! Print key name
         call codes_keys_iterator_get_name(kiter,key)
         write(*,*) '  ',trim(key)
         
-        ! get next key
+        ! Get next key
         call codes_keys_iterator_next(kiter, iret)
          
     end do
       
-    ! delete key iterator 
+    ! Delete key iterator 
     call codes_keys_iterator_delete(kiter)
-   
-    ! release the bufr message
+
+    ! Release the bufr message
     call codes_release(ibufr)
 
-    ! load the next bufr message
+    ! Load the next bufr message
     call codes_bufr_new_from_file(ifile,ibufr,iret)
-    
+
     count=count+1
-    
-  end do  
 
-! close file  
+  end do
+
+  ! Close file  
   call codes_close_file(ifile)
- 
 
 end program bufr_keys_iterator
diff --git a/examples/F90/bufr_keys_iterator.sh b/examples/F90/bufr_keys_iterator.sh
index 5eae2ec..d9127e2 100755
--- a/examples/F90/bufr_keys_iterator.sh
+++ b/examples/F90/bufr_keys_iterator.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/bufr_read_header.f90 b/examples/F90/bufr_read_header.f90
index 3f1c6c6..436d91b 100644
--- a/examples/F90/bufr_read_header.f90
+++ b/examples/F90/bufr_read_header.f90
@@ -1,5 +1,5 @@
 !
-!Copyright 2005-2016 ECMWF.
+!Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 !which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -27,51 +27,50 @@ integer(kind=4)    :: numberofsubsets
 
   call codes_open_file(ifile,'../../data/bufr/syno_multi.bufr','r')
 
-! the first bufr message is loaded from file
-! ibufr is the bufr id to be used in subsequent calls
+  ! The first bufr message is loaded from file,
+  ! ibufr is the bufr id to be used in subsequent calls
   call codes_bufr_new_from_file(ifile,ibufr,iret)
 
   do while (iret/=CODES_END_OF_FILE)
-    
-    ! get and print some keys form the BUFR header 
+
+    ! Get and print some keys form the BUFR header 
     write(*,*) 'message: ',count
-    
+
     call codes_get(ibufr,'dataCategory',dataCategory);
     write(*,*) '  dataCategory:',dataCategory
-    
+
     call codes_get(ibufr,'dataSubCategory',dataSubCategory);
     write(*,*) '  dataSubCategory:',dataSubCategory
-    
+
     call codes_get(ibufr,'typicalDate',typicalDate);
     write(*,*) '  typicalDate:',typicalDate
-    
+
     call codes_get(ibufr,'bufrHeaderCentre',centre);
     write(*,*) '  bufrHeaderCentre:',centre
-  
+
     call codes_get(ibufr,'bufrHeaderSubCentre',subcentre)
     write(*,*) '  bufrHeaderSubCentre:',subcentre
-  
+
     call codes_get(ibufr,'masterTablesVersionNumber',masterversion)
     write(*,*) '  masterTablesVersionNumber:',masterversion
 
     call codes_get(ibufr,'localTablesVersionNumber',localversion)
     write(*,*) '  localTablesVersionNumber:',localversion
-    
+
     call codes_get(ibufr,'numberOfSubsets',numberofsubsets)
     write(*,*) '  numberOfSubsets:',numberofsubsets   
-  
-    ! release the bufr message
+
+    ! Release the bufr message
     call codes_release(ibufr)
 
-    ! load the next bufr message
+    ! Load the next bufr message
     call codes_bufr_new_from_file(ifile,ibufr,iret)
-    
+
     count=count+1
-    
-  end do  
 
-! close file  
+  end do
+
+  ! Close file
   call codes_close_file(ifile)
- 
 
 end program bufr_read_header
diff --git a/examples/F90/bufr_read_header.sh b/examples/F90/bufr_read_header.sh
index 52a3f5c..76a306e 100755
--- a/examples/F90/bufr_read_header.sh
+++ b/examples/F90/bufr_read_header.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/bufr_read_scatterometer.f90 b/examples/F90/bufr_read_scatterometer.f90
index acabc97..f9d50ce 100644
--- a/examples/F90/bufr_read_scatterometer.f90
+++ b/examples/F90/bufr_read_scatterometer.f90
@@ -1,5 +1,5 @@
 !
-!Copyright 2005-2016 ECMWF.
+!Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 !which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -30,76 +30,76 @@ real(kind=8), dimension(:), allocatable :: year
 
   call codes_open_file(ifile,'../../data/bufr/asca_139.bufr','r')
 
-! the first bufr message is loaded from file
-! ibufr is the bufr id to be used in subsequent calls
+  ! The first BUFR message is loaded from file,
+  ! ibufr is the bufr id to be used in subsequent calls
   call codes_bufr_new_from_file(ifile,ibufr,iret)
 
   do while (iret/=CODES_END_OF_FILE)
 
     write(*,'(A,I3)') 'message: ',count
 
-    ! we need to instruct ecCodes to expand all the descriptors 
+    ! We need to instruct ecCodes to expand all the descriptors 
     ! i.e. unpack the data values
     call codes_set(ibufr,"unpack",1);
- 
+
     ! The BUFR file contains a single message with 2016 subsets in a compressed form.
     ! It means each subset has exactly the same structure: they store one location with
     ! several beams and one backscatter value in each beam. 
     !
     ! To print the backScatter values for beamIdentifier=2 from all the subsets 
     ! we will simply access the key by condition (see below).
-        
+
     ! Read the total number of subsets.
     call codes_get(ibufr,'numberOfSubsets',numObs)
 
     write(*,'(A,I5)') "Number of values:",numObs
- 
-    !Get latitude (for all the subsets)
+
+    ! Get latitude (for all the subsets)
     call codes_get(ibufr,'latitude',latVal);
-     
-    !Get longitude (for all the subsets)
+
+    ! Get longitude (for all the subsets)
     call codes_get(ibufr,'latitude',lonVal);
-     
+
     allocate(year(numObs))
     call codes_get(ibufr,'year',year);
     do ii= 1, size(year)
       write(*,'(A,I4,A,F8.1)') 'year(',ii,')=',year(ii)
     enddo
 
-    !Get backScatter for beam two. We use an access by condition for this key.
-    !(for all the subsets)
+    ! Get backScatter for beam two. We use an access by condition for this key.
+    ! (for all the subsets)
     call codes_get(ibufr,'/beamIdentifier=2/backscatter',bscatterVal);
-    
-     ! ---- Check that all arrays are same size
+
+    ! Check that all arrays are same size
     if (size(latVal)/= numObs .or. size(lonVal)/= numObs .or. size(bscatterVal)/= numObs) then
       print *,'inconsistent array dimension'
       exit
     endif
-    
-    ! ---- Print the values --------------------------------
+
+    ! Print the values
     write(*,*) 'pixel   lat    lon     backscatter'
     write(*,*) "--------------------------------------" 
-     
+
     do i=1,numObs
         write(*,'(I4,3F10.5)') i,latVal(i),lonVal(i),bscatterVal(i)
     end do 
      
-    ! free arrays 
+    ! Free arrays 
     deallocate(latVal)
     deallocate(lonVal)
     deallocate(bscatterVal)
 
-    ! release the bufr message
+    ! Release the bufr message
     call codes_release(ibufr)
 
-    ! load the next bufr message
+    ! Load the next bufr message
     call codes_bufr_new_from_file(ifile,ibufr,iret)
-     
+
     count=count+1
-    
+
   end do  
 
-  ! close file  
+  ! Close file  
   call codes_close_file(ifile)
- 
+
 end program bufr_read_scatterometer
diff --git a/examples/F90/bufr_read_scatterometer.sh b/examples/F90/bufr_read_scatterometer.sh
index ead99ee..f866d4a 100755
--- a/examples/F90/bufr_read_scatterometer.sh
+++ b/examples/F90/bufr_read_scatterometer.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/bufr_read_synop.f90 b/examples/F90/bufr_read_synop.f90
index a18d8d9..e07bff7 100644
--- a/examples/F90/bufr_read_synop.f90
+++ b/examples/F90/bufr_read_synop.f90
@@ -1,5 +1,5 @@
 !
-!Copyright 2005-2016 ECMWF.
+!Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 !which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -31,15 +31,15 @@ integer(kind=4)    :: cloudAmount,cloudBaseHeight,lowCloud,midCloud,highCloud
 
   call codes_open_file(ifile,'../../data/bufr/syno_multi.bufr','r')
 
-! the first bufr message is loaded from file
-! ibufr is the bufr id to be used in subsequent calls
+  ! The first bufr message is loaded from file,
+  ! ibufr is the bufr id to be used in subsequent calls
   call codes_bufr_new_from_file(ifile,ibufr,iret)
 
   do while (iret/=CODES_END_OF_FILE)
 
     write(*,*) 'message: ',count
 
-    ! we need to instruct ecCodes to expand all the descriptors 
+    ! We need to instruct ecCodes to expand all the descriptors 
     ! i.e. unpack the data values
     call codes_set(ibufr,"unpack",1)
     
@@ -104,19 +104,17 @@ integer(kind=4)    :: cloudAmount,cloudBaseHeight,lowCloud,midCloud,highCloud
     call codes_get(ibufr,'#3#cloudType',highCloud)
     write(*,*) '  cloudType (high):',highCloud 
    
-    ! release the bufr message
+    ! Release the bufr message
     call codes_release(ibufr)
 
-    ! load the next bufr message
+    ! Load the next bufr message
     call codes_bufr_new_from_file(ifile,ibufr,iret)
     
     count=count+1
     
   end do  
 
-! close file  
+  ! Close file  
   call codes_close_file(ifile)
- 
 
 end program bufr_read_synop
-
diff --git a/examples/F90/bufr_read_synop.sh b/examples/F90/bufr_read_synop.sh
index a8b3c47..50bba71 100755
--- a/examples/F90/bufr_read_synop.sh
+++ b/examples/F90/bufr_read_synop.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/bufr_read_temp.f90 b/examples/F90/bufr_read_temp.f90
index 94b118f..5400302 100644
--- a/examples/F90/bufr_read_temp.f90
+++ b/examples/F90/bufr_read_temp.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -30,7 +30,7 @@ program bufr_read_temp
 
   call codes_open_file(ifile,'../../data/bufr/PraticaTemp.bufr','r')
 
-  ! the first bufr message is loaded from file
+  ! The first bufr message is loaded from file,
   ! ibufr is the bufr id to be used in subsequent calls
   call codes_bufr_new_from_file(ifile,ibufr,iret)
   do while (iret/=CODES_END_OF_FILE)
@@ -56,7 +56,7 @@ program bufr_read_temp
           &geopotentialHeight(i),latitudeDisplacement(i),&
           &longitudeDisplacement(i),airTemperature(i),windDirection(i),windSpeed(i),extendedVerticalSoundingSignificance(i)
     enddo
-    ! free arrays
+    ! Free arrays
     deallocate(timePeriod)
     deallocate(pressure)
     deallocate(geopotentialHeight)
@@ -67,13 +67,13 @@ program bufr_read_temp
     deallocate(windDirection)
     deallocate(windSpeed)
     deallocate(extendedVerticalSoundingSignificance)
-    ! release the bufr message
+    ! Release the bufr message
     call codes_release(ibufr)
-    ! load the next bufr message
+    ! Load the next bufr message
     call codes_bufr_new_from_file(ifile,ibufr,iret)
     count=count+1
   end do
-  ! close file
+  ! Close file
   call codes_close_file(ifile)
 
 end program bufr_read_temp
diff --git a/examples/F90/bufr_read_temp.sh b/examples/F90/bufr_read_temp.sh
index ed1794e..bf7e051 100755
--- a/examples/F90/bufr_read_temp.sh
+++ b/examples/F90/bufr_read_temp.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/bufr_read_tropical_cyclone.f90 b/examples/F90/bufr_read_tropical_cyclone.f90
index 4929967..c939bb3 100644
--- a/examples/F90/bufr_read_tropical_cyclone.f90
+++ b/examples/F90/bufr_read_tropical_cyclone.f90
@@ -1,5 +1,5 @@
 
-!Copyright 2005-2016 ECMWF.
+!Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 !which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -39,7 +39,7 @@ program bufr_read_tropical_cyclone
 
   call codes_open_file(ifile,'../../data/bufr/tropical_cyclone.bufr','r')
 
-  ! the first BUFR message is loaded from file.
+  ! The first BUFR message is loaded from file.
   ! ibufr is the BUFR id to be used in subsequent calls
   call codes_bufr_new_from_file(ifile,ibufr,iret)
 
@@ -47,7 +47,7 @@ program bufr_read_tropical_cyclone
 
     write(*,'(A,I3,A)') '**************** MESSAGE: ',count,'  *****************'
 
-    ! we need to instruct ecCodes to unpack the data values
+    ! We need to instruct ecCodes to unpack the data values
     call codes_set(ibufr,"unpack",1);
 
     call codes_get(ibufr,'year',year);
@@ -60,7 +60,7 @@ program bufr_read_tropical_cyclone
     call codes_get(ibufr,'stormIdentifier',stormIdentifier)
     write(*,'(A,A)')'Storm identifier: ',stormIdentifier
 
-    !How many different timePeriod in the data structure?
+    ! How many different timePeriod in the data structure?
     rankPeriod=0
     ierr=0
     do while(ierr==0) 
@@ -69,7 +69,7 @@ program bufr_read_tropical_cyclone
       call codes_get(ibufr,'#'//trim(rankPeriodStr)//'#timePeriod',period,ierr)
       if(allocated(period)) deallocate(period)
     enddo
-    !the numberOfPeriods includes the analysis (period=0)
+    ! The numberOfPeriods includes the analysis (period=0)
     numberOfPeriods=rankPeriod
 
     call codes_get(ibufr,'ensembleMemberNumber',memberNumber)
@@ -142,7 +142,7 @@ program bufr_read_tropical_cyclone
     rankWind=1
     rankPeriod=0
 
-    !loop on all periods excluding analysis period(1)=0
+    ! Loop on all periods excluding analysis period(1)=0
     do i=2,numberOfPeriods
 
       rankPeriod=rankPeriod+1
@@ -156,7 +156,7 @@ program bufr_read_tropical_cyclone
       enddo
       deallocate(ivalues)
       
-      !Location of the storm
+      ! Location of the storm
       rankSignificance=rankSignificance+1
       write (rankSignificanceStr,'(I0)')rankSignificance 
       call codes_get(ibufr,'#'//trim(rankSignificanceStr)//'#meteorologicalAttributeSignificance',ivalues);
@@ -185,7 +185,7 @@ program bufr_read_tropical_cyclone
         stop 1
       endif
 
-      !Location of maximum wind
+      ! Location of maximum wind
       rankSignificance=rankSignificance+1
       write (rankSignificanceStr,'(I0)')rankSignificance 
       call codes_get(ibufr,'#'//trim(rankSignificanceStr)//'#meteorologicalAttributeSignificance',ivalues);
@@ -216,7 +216,7 @@ program bufr_read_tropical_cyclone
 
     enddo
 
-    ! ---- Print the values --------------------------------
+    ! Print the values
     do i=1,size(memberNumber)
       skipMember=1
       do j=1,size(period)
@@ -259,17 +259,17 @@ program bufr_read_tropical_cyclone
     deallocate(longitudeMaxWind0)
     deallocate(windMaxWind0)
 
-    ! release the BUFR message
+    ! Release the BUFR message
     call codes_release(ibufr)
 
-    ! load the next BUFR message
+    ! Load the next BUFR message
     call codes_bufr_new_from_file(ifile,ibufr,iret)
 
     count=count+1
 
   end do  
 
-  ! close file  
+  ! Close file  
   call codes_close_file(ifile)
- 
+
 end program bufr_read_tropical_cyclone
diff --git a/examples/F90/bufr_read_tropical_cyclone.sh b/examples/F90/bufr_read_tropical_cyclone.sh
index 332b674..d779ea6 100755
--- a/examples/F90/bufr_read_tropical_cyclone.sh
+++ b/examples/F90/bufr_read_tropical_cyclone.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/bufr_set_keys.f90 b/examples/F90/bufr_set_keys.f90
index 51b1607..999a4ea 100644
--- a/examples/F90/bufr_set_keys.f90
+++ b/examples/F90/bufr_set_keys.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -20,13 +20,13 @@ program bufr_set_keys
   integer                                       :: count=0
   integer(kind=4)                               :: centre, centreNew
 
-  ! open input file
+  ! Open input file
   call codes_open_file(infile,'../../data/bufr/syno_multi.bufr','r')
 
-  ! open output file
+  ! Open output file
   call codes_open_file(outfile,'bufr_set_keys_test_f.tmp.bufr','w')
 
-  ! the first bufr message is loaded from file
+  ! The first bufr message is loaded from file,
   ! ibufr is the bufr id to be used in subsequent calls
   call codes_bufr_new_from_file(infile,ibufr,iret)
 
@@ -37,23 +37,23 @@ program bufr_set_keys
     ! This is the place where you may wish to modify the message 
     ! E.g. we change the centre
 
-    ! set centre
+    ! Set centre
     centre=222
     call codes_set(ibufr,'bufrHeaderCentre',222)
     write(*,*) '  set bufrHeaderCentre to:',centre
 
-    ! check centre's new value
+    ! Check centre's new value
     centreNew=0
     call codes_get(ibufr,'bufrHeaderCentre',centreNew)
     write(*,*) '  bufrHeaderCentre''s new value:',centreNew
 
-    ! write modified message to a file
+    ! Write modified message to a file
     call codes_write(ibufr,outfile)
 
-    ! release the handle
+    ! Release the handle
     call codes_release(ibufr)
 
-    ! next message from source
+    ! Next message from source
     call codes_bufr_new_from_file(infile,ibufr,iret)
 
     count=count+1
diff --git a/examples/F90/bufr_set_keys.sh b/examples/F90/bufr_set_keys.sh
index a5645bf..2da0399 100755
--- a/examples/F90/bufr_set_keys.sh
+++ b/examples/F90/bufr_set_keys.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -26,7 +26,7 @@ ${examples_dir}/eccodes_f_bufr_set_keys >$REDIRECT
 
 #Compare modified file to the original
 set +e
-${tools_dir}/bufr_compare $f $fBufrTmp >$REDIRECT
+${tools_dir}bufr_compare $f $fBufrTmp >$REDIRECT
 
 #Check if they are different
 if [ $? -eq 0 ]; then
@@ -37,7 +37,7 @@ fi
 set -e
 
 #Check if modified file has the same number of messages
-[ `${tools_dir}/bufr_count $f` = `${tools_dir}/bufr_count ${fBufrTmp}` ]
+[ `${tools_dir}bufr_count $f` = `${tools_dir}bufr_count ${fBufrTmp}` ]
 
 #Clean up
 rm -f ${fBufrTmp}
diff --git a/examples/F90/bufr_subset.f90 b/examples/F90/bufr_subset.f90
index f25e448..b82f51d 100644
--- a/examples/F90/bufr_subset.f90
+++ b/examples/F90/bufr_subset.f90
@@ -1,5 +1,5 @@
 !
-!Copyright 2005-2016 ECMWF.
+!Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 !which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -27,26 +27,26 @@ character(100)     :: key
 
   call codes_open_file(ifile,'../../data/bufr/synop_multi_subset.bufr','r')
 
-! the first bufr message is loaded from file
-! ibufr is the bufr id to be used in subsequent calls
+  ! The first bufr message is loaded from file,
+  ! ibufr is the bufr id to be used in subsequent calls
   call codes_bufr_new_from_file(ifile,ibufr,iret)
 
   do while (iret/=CODES_END_OF_FILE)
-    
-    ! get and print some keys form the BUFR header 
+
+    ! Get and print some keys form the BUFR header 
     write(*,*) 'message: ',count
 
-    ! we need to instruct ecCodes to expand all the descriptors 
+    ! We need to instruct ecCodes to expand all the descriptors 
     ! i.e. unpack the data values
     call codes_set(ibufr,'unpack',1);   
-    
-    ! find out the number of subsets
+
+    ! Find out the number of subsets
     call codes_get(ibufr,'numberOfSubsets',numberOfSubsets)
     write(*,*) '  numberOfSubsets:',numberOfSubsets
-    
-    ! loop over the subsets
+
+    ! Loop over the subsets
     do i=1,numberOfSubsets
-            
+
  100    format('/subsetNumber=',I5.5,'/blockNumber')       
         write(key,100) I       
         write(*,*) key
@@ -60,21 +60,20 @@ character(100)     :: key
         write(key,*) '/subsetNumber=',I,'/stationNumber'       
         call codes_get(ibufr,'stationNumber',stationNumber);
         write(*,*) '  stationNumber:',stationNumber
-    
+
     end do
-    
-    ! release the bufr message
+
+    ! Release the bufr message
     call codes_release(ibufr)
 
-    ! load the next bufr message
+    ! Load the next bufr message
     call codes_bufr_new_from_file(ifile,ibufr,iret)
-    
+
     count=count+1
-    
-  end do  
 
-! close file  
+  end do
+
+  ! Close file  
   call codes_close_file(ifile)
- 
 
 end program bufr_subset
diff --git a/examples/F90/bufr_subset.sh b/examples/F90/bufr_subset.sh
index 4012f4c..98a3fa0 100755
--- a/examples/F90/bufr_subset.sh
+++ b/examples/F90/bufr_subset.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/copy_namespace.f90 b/examples/F90/copy_namespace.f90
deleted file mode 100644
index 0cdf087..0000000
--- a/examples/F90/copy_namespace.f90
+++ /dev/null
@@ -1,37 +0,0 @@
-! Copyright 2005-2016 ECMWF.
-!
-! This software is licensed under the terms of the Apache Licence Version 2.0
-! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
-! 
-! In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
-! virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
-!
-!
-!
-!  Description: how to copy a namespace from a message to another.
-!               
-!
-program copy_namespace
-  use eccodes
-  implicit none  
-  integer  :: file1, file2, file3
-  integer  :: igrib1,igrib2,igrib3
-
-  call codes_open_file(file1,'../../data/reduced_latlon_surface.grib2','r')
-  call codes_open_file(file2,'../../data/regular_latlon_surface.grib1','r')
-  call codes_open_file(file3,'out.grib','w')
-
-  call codes_grib_new_from_file(file1,igrib1)
-  call codes_grib_new_from_file(file2,igrib2)
-
-  call codes_clone(igrib2,igrib3)
-
-  call codes_copy_namespace(igrib1,'geography',igrib3)
-
-   call codes_write(igrib3,file3)
-
-  call codes_close_file(file1)
-  call codes_close_file(file2)
-  call codes_close_file(file3)
-
-end program copy_namespace
diff --git a/examples/F90/get_fortran.f90 b/examples/F90/get_fortran.f90
index 9d54477..a6f057b 100644
--- a/examples/F90/get_fortran.f90
+++ b/examples/F90/get_fortran.f90
@@ -1,8 +1,12 @@
+! Copyright 2005-2017 ECMWF.
 !
-!  Description: how to get values using keys.
-!
+! This software is licensed under the terms of the Apache Licence Version 2.0
+! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+! 
+! In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
+! virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
 !
-!  Copyright: See COPYING file that comes with this distribution
+!  Description: how to get values using keys.
 !
 !
 program get
@@ -28,74 +32,73 @@ implicit none
   call codes_open_file(ifile, &
        '../../data/reduced_latlon_surface.grib1','r')
  
-!     a new grib message is loaded from file
-!     igrib is the grib id to be used in subsequent calls
+  ! A new grib message is loaded from file
+  ! igrib is the grib id to be used in subsequent calls
   call  codes_grib_new_from_file(ifile,igrib) 
 
-!     get as a integer
+  ! get as a integer
   call codes_get(igrib,'numberOfPointsAlongAParallel', &
                                numberOfPointsAlongAParallel) 
   write(*,*) 'numberOfPointsAlongAParallel=', &
               numberOfPointsAlongAParallel
 
-!     get as a integer
+  ! get as a integer
   call codes_get(igrib,'numberOfPointsAlongAMeridian', &
                                        numberOfPointsAlongAMeridian) 
   write(*,*) 'numberOfPointsAlongAMeridian=', &
               numberOfPointsAlongAMeridian
 
-!     get as a real8
-call codes_get(igrib, &
+  ! get as a real8
+  call codes_get(igrib, &
                       'latitudeOfFirstGridPointInDegrees', &
                        latitudeOfFirstPointInDegrees) 
-write(*,*) 'latitudeOfFirstGridPointInDegrees=', &
+  write(*,*) 'latitudeOfFirstGridPointInDegrees=', &
             latitudeOfFirstPointInDegrees
 
-!     get as a real8
+  !     get as a real8
   call codes_get(igrib, &
                'longitudeOfFirstGridPointInDegrees', &
                 longitudeOfFirstPointInDegrees) 
   write(*,*) 'longitudeOfFirstGridPointInDegrees=', &
-     longitudeOfFirstPointInDegrees
+      longitudeOfFirstPointInDegrees
 
-!     get as a real8
+  ! get as a real8
   call codes_get(igrib, &
-     'latitudeOfLastGridPointInDegrees', &
-     latitudeOfLastPointInDegrees) 
+      'latitudeOfLastGridPointInDegrees', &
+      latitudeOfLastPointInDegrees) 
   write(*,*) 'latitudeOfLastGridPointInDegrees=', &
-     latitudeOfLastPointInDegrees
+      latitudeOfLastPointInDegrees
 
-!     get as a real8
+  ! get as a real8
   call codes_get(igrib, &
-     'longitudeOfLastGridPointInDegrees', &
+      'longitudeOfLastGridPointInDegrees', &
       longitudeOfLastPointInDegrees) 
   write(*,*) 'longitudeOfLastGridPointInDegrees=', &
               longitudeOfLastPointInDegrees
 
-!     get as a real8
+  ! get as a real8
   call codes_get(igrib, &
                    'jDirectionIncrementInDegrees', &
                     jDirectionIncrementInDegrees) 
   write(*,*) 'jDirectionIncrementInDegrees=', &
               jDirectionIncrementInDegrees
 
-!     get as a real8
+  ! get as a real8
   call codes_get(igrib, &
        'iDirectionIncrementInDegrees', &
         iDirectionIncrementInDegrees) 
   write(*,*) 'iDirectionIncrementInDegrees=', &
               iDirectionIncrementInDegrees
 
-!     get the size of the values array
+  ! get the size of the values array
   call codes_get_size(igrib,'values',numberOfValues)
   write(*,*) 'numberOfValues=',numberOfValues
 
   allocate(values(2*numberOfValues), stat=iret)
-!     get data values
+  ! get data values
   print*, size(values)
   call codes_get(igrib,'values',values)
 
-
   average = 0
   do i=1,numberOfValues
         average = average + values(i);
diff --git a/examples/F90/get_pl.f90 b/examples/F90/get_pl.f90
index 9be5fb4..8dac7d9 100644
--- a/examples/F90/get_pl.f90
+++ b/examples/F90/get_pl.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/get_pl.sh b/examples/F90/get_pl.sh
index d09397d..38a17df 100755
--- a/examples/F90/get_pl.sh
+++ b/examples/F90/get_pl.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/get_product_kind.f90 b/examples/F90/get_product_kind.f90
index 198dd36..90a28b7 100644
--- a/examples/F90/get_product_kind.f90
+++ b/examples/F90/get_product_kind.f90
@@ -1,5 +1,5 @@
 !
-!Copyright 2005-2016 ECMWF.
+!Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 !which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/get_product_kind.sh b/examples/F90/get_product_kind.sh
index 6ffc8f9..74089e5 100755
--- a/examples/F90/get_product_kind.sh
+++ b/examples/F90/get_product_kind.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/get_pv.f90 b/examples/F90/get_pv.f90
index 52f9343..4caedbb 100644
--- a/examples/F90/get_pv.f90
+++ b/examples/F90/get_pv.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/get_pv.sh b/examples/F90/get_pv.sh
index 332d7df..31468fa 100755
--- a/examples/F90/get_pv.sh
+++ b/examples/F90/get_pv.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/get_set_uuid.f90 b/examples/F90/get_set_uuid.f90
index 4e169b6..8cb0432 100644
--- a/examples/F90/get_set_uuid.f90
+++ b/examples/F90/get_set_uuid.f90
@@ -1,4 +1,4 @@
-! Copyright 2013 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/get_set_uuid.sh b/examples/F90/get_set_uuid.sh
index abdb62a..e0a4a8d 100755
--- a/examples/F90/get_set_uuid.sh
+++ b/examples/F90/get_set_uuid.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -10,7 +10,7 @@
 . ./include.sh
 
 
-uuid=`${tools_dir}/grib_get -w count=1 -p uuidOfVGrid:s ${data_dir}/test_uuid.grib2`
+uuid=`${tools_dir}grib_get -w count=1 -p uuidOfVGrid:s ${data_dir}/test_uuid.grib2`
 [ "$uuid" = "08b1e836bc6911e1951fb51b5624ad8d" ]
 
 # This reads the file in data/test_uuid.grib2 and creates test_uuid.grib2
@@ -21,7 +21,7 @@ output=out_uuid.grib2
 
 [ -f "$output" ]
 
-uuid=`${tools_dir}/grib_get -w count=1 -p uuidOfVGrid:s $output`
+uuid=`${tools_dir}grib_get -w count=1 -p uuidOfVGrid:s $output`
 [ "$uuid" = "8dad24561bb51f95e11169bc36e8b108" ]
 
 rm -f $output
diff --git a/examples/F90/grib_clone.f90 b/examples/F90/grib_clone.f90
index 775d53a..3514f36 100644
--- a/examples/F90/grib_clone.f90
+++ b/examples/F90/grib_clone.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/grib_clone.sh b/examples/F90/grib_clone.sh
index ee0eea9..fe703a5 100755
--- a/examples/F90/grib_clone.sh
+++ b/examples/F90/grib_clone.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/grib_copy_message.f90 b/examples/F90/grib_copy_message.f90
index 19f5e38..dd3eafc 100644
--- a/examples/F90/grib_copy_message.f90
+++ b/examples/F90/grib_copy_message.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/grib_copy_message.sh b/examples/F90/grib_copy_message.sh
index b98c505..7d2abbb 100755
--- a/examples/F90/grib_copy_message.sh
+++ b/examples/F90/grib_copy_message.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -13,6 +13,6 @@ INPUT="../../data/constant_field.grib1"
 OUTPUT=out.copy.grib1
 
 ${examples_dir}eccodes_f_grib_copy_message > /dev/null
-${tools_dir}/grib_compare -b centre $INPUT $OUTPUT
+${tools_dir}grib_compare -b centre $INPUT $OUTPUT
 
 rm -f $OUTPUT
diff --git a/examples/F90/grib_copy_namespace.f90 b/examples/F90/grib_copy_namespace.f90
new file mode 100644
index 0000000..2f51fa4
--- /dev/null
+++ b/examples/F90/grib_copy_namespace.f90
@@ -0,0 +1,36 @@
+! Copyright 2005-2017 ECMWF.
+!
+! This software is licensed under the terms of the Apache Licence Version 2.0
+! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+! 
+! In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
+! virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
+!
+!
+!  Description: how to copy a namespace from a message to another.
+!               
+!
+program copy_namespace
+  use eccodes
+  implicit none  
+  integer  :: file1, file2, file3
+  integer  :: igrib1,igrib2,igrib3
+
+  call codes_open_file(file1, '../../data/reduced_latlon_surface.grib2', 'r')
+  call codes_open_file(file2, '../../data/regular_latlon_surface.grib1', 'r')
+  call codes_open_file(file3, 'out.grib_copy_namespace.grib','w')
+
+  call codes_grib_new_from_file(file1, igrib1)
+  call codes_grib_new_from_file(file2, igrib2)
+
+  call codes_clone(igrib2, igrib3)
+
+  call codes_copy_namespace(igrib1, 'geography', igrib3)
+
+   call codes_write(igrib3, file3)
+
+  call codes_close_file(file1)
+  call codes_close_file(file2)
+  call codes_close_file(file3)
+
+end program copy_namespace
diff --git a/examples/F90/grib_copy_namespace.sh b/examples/F90/grib_copy_namespace.sh
new file mode 100755
index 0000000..5a7d944
--- /dev/null
+++ b/examples/F90/grib_copy_namespace.sh
@@ -0,0 +1,26 @@
+#!/bin/sh
+# Copyright 2005-2017 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+#
+# In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
+# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
+
+. ./include.sh
+
+#Define a common label for all the tmp files
+label="grib_copy_namespace_test_f"
+
+INPUT=../../data/regular_latlon_surface.grib1
+res=`${tools_dir}grib_get -p Ni,Nj $INPUT`
+[ "$res" = "16 31" ]
+
+#The input and output BUFR files are hardcoded in the f90 example!!!
+OUTPUT=out.grib_copy_namespace.grib
+${examples_dir}./eccodes_f_grib_copy_namespace
+
+res=`${tools_dir}grib_get -p Ni,Nj $OUTPUT`
+[ "$res" = "MISSING 501" ]
+
+rm -f $OUTPUT
diff --git a/examples/F90/grib_count_messages.f90 b/examples/F90/grib_count_messages.f90
index 63d6c15..7c503e8 100644
--- a/examples/F90/grib_count_messages.f90
+++ b/examples/F90/grib_count_messages.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/grib_count_messages.sh b/examples/F90/grib_count_messages.sh
index 9c10975..0097707 100755
--- a/examples/F90/grib_count_messages.sh
+++ b/examples/F90/grib_count_messages.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/grib_count_messages_multi.f90 b/examples/F90/grib_count_messages_multi.f90
index f085681..ef74ae5 100644
--- a/examples/F90/grib_count_messages_multi.f90
+++ b/examples/F90/grib_count_messages_multi.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/grib_count_messages_multi.sh b/examples/F90/grib_count_messages_multi.sh
index 351c8c1..697bef7 100755
--- a/examples/F90/grib_count_messages_multi.sh
+++ b/examples/F90/grib_count_messages_multi.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/grib_get_data.f90 b/examples/F90/grib_get_data.f90
index 1bdbb28..7179174 100644
--- a/examples/F90/grib_get_data.f90
+++ b/examples/F90/grib_get_data.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/grib_get_data.sh b/examples/F90/grib_get_data.sh
index 4708d11..2ab0752 100755
--- a/examples/F90/grib_get_data.sh
+++ b/examples/F90/grib_get_data.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/grib_get_keys.f90 b/examples/F90/grib_get_keys.f90
index de9b9e3..328b031 100644
--- a/examples/F90/grib_get_keys.f90
+++ b/examples/F90/grib_get_keys.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/grib_get_keys.sh b/examples/F90/grib_get_keys.sh
index eb46783..5cf3d24 100755
--- a/examples/F90/grib_get_keys.sh
+++ b/examples/F90/grib_get_keys.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/grib_index.f90 b/examples/F90/grib_index.f90
index 67d0628..f7b70fa 100644
--- a/examples/F90/grib_index.f90
+++ b/examples/F90/grib_index.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/grib_index.sh b/examples/F90/grib_index.sh
index a386cec..54a904a 100755
--- a/examples/F90/grib_index.sh
+++ b/examples/F90/grib_index.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/grib_keys_iterator.f90 b/examples/F90/grib_keys_iterator.f90
index f2df081..16daaac 100644
--- a/examples/F90/grib_keys_iterator.f90
+++ b/examples/F90/grib_keys_iterator.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/grib_keys_iterator.sh b/examples/F90/grib_keys_iterator.sh
index 7b89d85..6f1e187 100755
--- a/examples/F90/grib_keys_iterator.sh
+++ b/examples/F90/grib_keys_iterator.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/grib_multi.f90 b/examples/F90/grib_multi.f90
index 5e9b535..efdd9cf 100644
--- a/examples/F90/grib_multi.f90
+++ b/examples/F90/grib_multi.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/grib_multi.sh b/examples/F90/grib_multi.sh
index 1f4a907..03e8ecd 100755
--- a/examples/F90/grib_multi.sh
+++ b/examples/F90/grib_multi.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/grib_multi_write.f90 b/examples/F90/grib_multi_write.f90
index 38cc7b5..b8df896 100644
--- a/examples/F90/grib_multi_write.f90
+++ b/examples/F90/grib_multi_write.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/grib_multi_write.sh b/examples/F90/grib_multi_write.sh
index 8714a62..0767050 100755
--- a/examples/F90/grib_multi_write.sh
+++ b/examples/F90/grib_multi_write.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -11,7 +11,7 @@
 
 ${examples_dir}eccodes_f_grib_multi_write > /dev/null
 
-${tools_dir}/grib_compare ${data_dir}/multi_created.grib2 multi_created.grib2
+${tools_dir}grib_compare ${data_dir}/multi_created.grib2 multi_created.grib2
 
 rm -f multi_created.grib2
 
diff --git a/examples/F90/grib_nearest.f90 b/examples/F90/grib_nearest.f90
index 71e5f55..66ee0a7 100644
--- a/examples/F90/grib_nearest.f90
+++ b/examples/F90/grib_nearest.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/grib_nearest.sh b/examples/F90/grib_nearest.sh
index a62ac85..567d79c 100755
--- a/examples/F90/grib_nearest.sh
+++ b/examples/F90/grib_nearest.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/grib_precision.f90 b/examples/F90/grib_precision.f90
index b2d965c..e79a3b9 100644
--- a/examples/F90/grib_precision.f90
+++ b/examples/F90/grib_precision.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/grib_precision.sh b/examples/F90/grib_precision.sh
index 8913055..d302ce1 100755
--- a/examples/F90/grib_precision.sh
+++ b/examples/F90/grib_precision.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/grib_print_data.f90 b/examples/F90/grib_print_data.f90
index 2a2ed61..8589480 100644
--- a/examples/F90/grib_print_data.f90
+++ b/examples/F90/grib_print_data.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/grib_print_data.sh b/examples/F90/grib_print_data.sh
index d9bf013..6354dc0 100755
--- a/examples/F90/grib_print_data.sh
+++ b/examples/F90/grib_print_data.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/grib_print_data_static.f90 b/examples/F90/grib_print_data_static.f90
index 4ba1c39..80b5847 100644
--- a/examples/F90/grib_print_data_static.f90
+++ b/examples/F90/grib_print_data_static.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/grib_samples.f90 b/examples/F90/grib_samples.f90
index 859c780..8e623dc 100644
--- a/examples/F90/grib_samples.f90
+++ b/examples/F90/grib_samples.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -29,10 +29,10 @@ program sample
   indicatorOfParameter = 61
   decimalPrecision = 2
 
-  !     A new grib message is loaded from an existing sample.
-  !     Samples are searched in a default sample path (use codes_info
-  !     to see where that is). The default sample path can be changed by
-  !     setting the environment variable ECCODES_SAMPLES_PATH
+  ! A new grib message is loaded from an existing sample.
+  ! Samples are searched in a default sample path (use codes_info
+  ! to see where that is). The default sample path can be changed by
+  ! setting the environment variable ECCODES_SAMPLES_PATH
   call codes_grib_new_from_samples(igribsample, "regular_latlon_surface.grib1")
 
   call codes_open_file(outfile, 'f_out.samples.grib1','w')
diff --git a/examples/F90/grib_samples.sh b/examples/F90/grib_samples.sh
index 82a0e3f..bfdb4ab 100755
--- a/examples/F90/grib_samples.sh
+++ b/examples/F90/grib_samples.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/grib_set_bitmap.f90 b/examples/F90/grib_set_bitmap.f90
index 31fa306..2de3c42 100644
--- a/examples/F90/grib_set_bitmap.f90
+++ b/examples/F90/grib_set_bitmap.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -9,6 +9,7 @@
 !
 !
 !  Description: how to set a bitmap in a GRIB message
+!               to encode missing values in the data
 !
 !
 program set_bitmap
diff --git a/examples/F90/grib_set_bitmap.sh b/examples/F90/grib_set_bitmap.sh
index de5784f..0c3f6bf 100755
--- a/examples/F90/grib_set_bitmap.sh
+++ b/examples/F90/grib_set_bitmap.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -14,7 +14,7 @@ OUT_TMP=out.set_bitmap_f.grib
 # The input and output files are hardcoded in the example
 ${examples_dir}eccodes_f_grib_set_bitmap
 
-x=`${tools_dir}/grib_get -p numberOfDataPoints,numberOfCodedValues,numberOfMissing $OUT_TMP`
+x=`${tools_dir}grib_get -p numberOfDataPoints,numberOfCodedValues,numberOfMissing $OUT_TMP`
 [ "$x" = "496 486 10" ]
 
 rm -f $OUT_TMP
diff --git a/examples/F90/grib_set_data.f90 b/examples/F90/grib_set_data.f90
new file mode 100644
index 0000000..4286972
--- /dev/null
+++ b/examples/F90/grib_set_data.f90
@@ -0,0 +1,63 @@
+! Copyright 2005-2017 ECMWF.
+!
+! This software is licensed under the terms of the Apache Licence Version 2.0
+! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+! 
+! In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
+! virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
+!
+!
+!
+!  Description: set the data contained in a GRIB file.
+!               In this example no missing values are present.
+!               If there are missing values, refer to: grib_set_bitmap
+!
+program set_data
+  use eccodes
+  implicit none
+  integer                         :: outfile
+  integer                         :: i, igrib, iret, numberOfValues, cnt
+  real                            :: d, e
+  real, dimension(:), allocatable :: values
+  integer, parameter              :: max_strsize = 200
+  character(len=max_strsize)      :: outfile_name
+
+  call getarg(1, outfile_name)
+  call codes_open_file(outfile,outfile_name,'w')
+
+  ! Note: the full name of the sample file is "regular_ll_pl_grib1.tmpl"
+  ! Sample files are stored in the samples directory (use codes_info to
+  ! see where that is).  The default sample path can be changed by
+  ! setting the environment variable ECCODES_SAMPLES_PATH
+  call codes_grib_new_from_samples(igrib, 'regular_ll_pl_grib1')
+
+  ! Here we're changing the data values only, so the number of values
+  ! will be the same as the sample GRIB.
+  ! But if your data array has a different size, then specify the grid geometry
+  ! (e.g. keys Ni, Nj etc) and set the correct number of data values
+  call codes_get_size(igrib,'values',numberOfValues)
+  
+  allocate(values(numberOfValues), stat=iret)
+  d = 10e-8
+  e = d
+  cnt = 1
+  do i=1,numberOfValues
+    if (cnt>100) then
+      e = e*10
+      cnt=1
+    endif
+    values(i) = d
+    !print *, values(i)
+    d = d + e
+    cnt = cnt + 1
+  end do
+  
+  call codes_set(igrib, 'bitsPerValue', 16)
+
+  ! set data values
+  call codes_set(igrib,'values', values)
+  call codes_write(igrib,outfile)
+  call codes_release(igrib)
+  deallocate(values)
+
+end program set_data
diff --git a/examples/F90/grib_set_data.sh b/examples/F90/grib_set_data.sh
new file mode 100755
index 0000000..be19803
--- /dev/null
+++ b/examples/F90/grib_set_data.sh
@@ -0,0 +1,16 @@
+#!/bin/sh
+# Copyright 2005-2017 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+#
+# In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
+# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
+
+. ./include.sh
+
+OUT=temp.f_grib_set_data.out.grib
+
+${examples_dir}eccodes_f_grib_set_data $OUT
+
+rm -f $OUT
diff --git a/examples/F90/grib_set_gvc.f90 b/examples/F90/grib_set_gvc.f90
index 3d943c7..aa4c92b 100644
--- a/examples/F90/grib_set_gvc.f90
+++ b/examples/F90/grib_set_gvc.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/grib_set_keys.f90 b/examples/F90/grib_set_keys.f90
index f8a3600..f4665a4 100644
--- a/examples/F90/grib_set_keys.f90
+++ b/examples/F90/grib_set_keys.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/grib_set_keys.sh b/examples/F90/grib_set_keys.sh
index 113770e..cd5f171 100755
--- a/examples/F90/grib_set_keys.sh
+++ b/examples/F90/grib_set_keys.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -10,11 +10,11 @@
 . ./include.sh
 
 ${examples_dir}eccodes_f_grib_set_keys > /dev/null
-res=`${tools_dir}/grib_get -p centre out.set.grib1`
+res=`${tools_dir}grib_get -p centre out.set.grib1`
 [ "$res" = "cnmc" ]
 
 ${examples_dir}eccodes_f_grib_set_gvc > /dev/null
-res=`${tools_dir}/grib_get -p typeOfLevel,NV out_gvc.grib2`
+res=`${tools_dir}grib_get -p typeOfLevel,NV out_gvc.grib2`
 [ "$res" = "generalVertical 6" ]
 
 rm -f out.set.grib1 out_gvc.grib2
diff --git a/examples/F90/grib_set_missing.f90 b/examples/F90/grib_set_missing.f90
index 397d15b..a6eb990 100644
--- a/examples/F90/grib_set_missing.f90
+++ b/examples/F90/grib_set_missing.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/grib_set_missing.sh b/examples/F90/grib_set_missing.sh
index 14cbc47..e00fa41 100755
--- a/examples/F90/grib_set_missing.sh
+++ b/examples/F90/grib_set_missing.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/grib_set_pv.f90 b/examples/F90/grib_set_pv.f90
index 0d67bc4..7b244d2 100644
--- a/examples/F90/grib_set_pv.f90
+++ b/examples/F90/grib_set_pv.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -30,11 +30,11 @@ program grib_set_pv
                 form="formatted",action="read")
 
   do i=1,numberOfCoefficients,2
-     read(unit=1,fmt=*, iostat=ios) pv(i), pv(i+1)
-     if (ios /= 0) then
-        print *, "I/O error: ",ios
-        exit
-     end if
+    read(unit=1,fmt=*, iostat=ios) pv(i), pv(i+1)
+    if (ios /= 0) then
+      print *, "I/O error: ",ios
+      exit
+    end if
   end do
   
   ! print coefficients
@@ -46,25 +46,25 @@ program grib_set_pv
 
   call codes_open_file(outfile, 'out.pv.grib1','w')
   
-  !     a new grib message is loaded from file
-  !     igrib is the grib id to be used in subsequent calls
+  ! A new grib message is loaded from file
+  ! igrib is the grib id to be used in subsequent calls
   call codes_grib_new_from_samples(igrib, "reduced_gg_sfc_grib1")
 
-  !     set levtype to ml (model level)
+  ! set levtype to ml (model level)
   call codes_set(igrib,'typeOfLevel','hybrid')
 
-  !     set level 
+  ! set level 
   call codes_set(igrib,'level',2)
 
-  !     set PVPresent as an integer 
+  ! set PVPresent as an integer 
   call codes_set(igrib,'PVPresent',1)
   
   call codes_set(igrib,'pv',pv)
   
-  !     write modified message to a file
+  ! write modified message to a file
   call codes_write(igrib,outfile)
   
-  !  FREE MEMORY
+  ! Free memory
   call codes_release(igrib)
   deallocate(pv)
 
diff --git a/examples/F90/grib_set_pv.sh b/examples/F90/grib_set_pv.sh
index 585f030..0c89b8a 100755
--- a/examples/F90/grib_set_pv.sh
+++ b/examples/F90/grib_set_pv.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/include.ctest.sh.in b/examples/F90/include.ctest.sh.in
index 4e86c51..e634d68 100644
--- a/examples/F90/include.ctest.sh.in
+++ b/examples/F90/include.ctest.sh.in
@@ -18,6 +18,13 @@ export ECCODES_DEFINITION_PATH
 tools_dir=@CMAKE_BINARY_DIR@/bin/
 examples_dir=@CMAKE_CURRENT_BINARY_DIR@/
 
+# If this environment variable is set, then run the
+# executables with valgrind
+if test "x$ECCODES_TEST_WITH_VALGRIND" != "x"; then
+   tools_dir="valgrind --error-exitcode=1 -q $tools_dir"
+   examples_dir="valgrind --error-exitcode=1 -q $examples_dir"
+fi
+
 # use samples from binary dir to test if installation will be correct
 samp_dir="@CMAKE_BINARY_DIR@/share/@PROJECT_NAME@/samples"
 ECCODES_SAMPLES_PATH=${samp_dir}
diff --git a/examples/F90/include.sh b/examples/F90/include.sh
index c12953f..cf77e19 100755
--- a/examples/F90/include.sh
+++ b/examples/F90/include.sh
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -36,8 +36,10 @@ else
     data_dir=$cpath/data
     samples_dir=$cpath/samples
 
-#tools_dir="valgrind --error-exitcode=1 -q $cpath/tools/"
-#examples_dir="valgrind --error-exitcode=1 -q $cpath/examples/F90/"
+    if test "x$ECCODES_TEST_WITH_VALGRIND" != "x"; then
+      tools_dir="valgrind --error-exitcode=1 -q $cpath/tools/"
+      examples_dir="valgrind --error-exitcode=1 -q $cpath/examples/F90/"
+    fi
 
   else
     echo "Skipping test $0"
diff --git a/examples/F90/iterator_fortran.f90 b/examples/F90/iterator_fortran.f90
index bb821cf..3c75757 100644
--- a/examples/F90/iterator_fortran.f90
+++ b/examples/F90/iterator_fortran.f90
@@ -1,10 +1,13 @@
+! Copyright 2005-2017 ECMWF.
 !
-!
-!  Description: how to use an iterator on lat/lon/values.
+! This software is licensed under the terms of the Apache Licence Version 2.0
+! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+! 
+! In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
+! virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
 !
 !
-!
-!  Copyright: See COPYING file that comes with this distribution
+!  Description: how to use an iterator on lat/lon/values.
 !
 !
 program iterator
diff --git a/examples/F90/keys_iterator_fortran.f90 b/examples/F90/keys_iterator_fortran.f90
index bf22a2e..cca52d2 100644
--- a/examples/F90/keys_iterator_fortran.f90
+++ b/examples/F90/keys_iterator_fortran.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/multi_fortran.f90 b/examples/F90/multi_fortran.f90
index 39e387c..eda23cf 100644
--- a/examples/F90/multi_fortran.f90
+++ b/examples/F90/multi_fortran.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/new_from_file.f90 b/examples/F90/new_from_file.f90
index 3fe1c6a..6a42b6a 100644
--- a/examples/F90/new_from_file.f90
+++ b/examples/F90/new_from_file.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/precision_fortran.f90 b/examples/F90/precision_fortran.f90
index 93b338a..c1d3a89 100644
--- a/examples/F90/precision_fortran.f90
+++ b/examples/F90/precision_fortran.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/print_data_fortran.f90 b/examples/F90/print_data_fortran.f90
index 1eedb2e..aaacfcd 100644
--- a/examples/F90/print_data_fortran.f90
+++ b/examples/F90/print_data_fortran.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/read_from_file.f90 b/examples/F90/read_from_file.f90
index 4dd3066..94e180b 100644
--- a/examples/F90/read_from_file.f90
+++ b/examples/F90/read_from_file.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/read_from_file.sh b/examples/F90/read_from_file.sh
index 1c4acbf..3cab056 100755
--- a/examples/F90/read_from_file.sh
+++ b/examples/F90/read_from_file.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/read_message.f90 b/examples/F90/read_message.f90
index c8c709c..2727965 100644
--- a/examples/F90/read_message.f90
+++ b/examples/F90/read_message.f90
@@ -1,5 +1,5 @@
 !
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/read_message.sh b/examples/F90/read_message.sh
index 6165f53..199d2a5 100755
--- a/examples/F90/read_message.sh
+++ b/examples/F90/read_message.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/set_fortran.f90 b/examples/F90/set_fortran.f90
index 99ca099..72d1452 100644
--- a/examples/F90/set_fortran.f90
+++ b/examples/F90/set_fortran.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/F90/set_missing_fortran.f90 b/examples/F90/set_missing_fortran.f90
index dee2951..d0dbe7e 100644
--- a/examples/F90/set_missing_fortran.f90
+++ b/examples/F90/set_missing_fortran.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/CMakeLists.txt b/examples/python/CMakeLists.txt
index 2371f2c..42693c2 100644
--- a/examples/python/CMakeLists.txt
+++ b/examples/python/CMakeLists.txt
@@ -40,11 +40,13 @@ list( APPEND tests
    grib_print_data
    grib_samples
    grib_set_keys
+   grib_set_pv
    grib_set_missing
    binary_message
    grib_set_bitmap
    bufr_attributes
    bufr_clone
+   bufr_copy_data
    bufr_expanded
    bufr_get_keys
    bufr_keys_iterator
@@ -59,6 +61,14 @@ list( APPEND tests
    gts_get_keys
    metar_get_keys
 )
+
+# The high level python test requires new features in the unittest
+# which are only there for python 2.7 onwards
+if( PYTHON_VERSION_STRING VERSION_GREATER "2.7" )
+    ecbuild_info("Python examples: Adding test for PythonicGrib")
+    list( APPEND tests high_level_api )
+endif()
+
 foreach( test ${tests} )
     ecbuild_add_test( TARGET eccodes_p_${test}_test
                       TYPE       SCRIPT
diff --git a/examples/python/binary_message.py b/examples/python/binary_message.py
index fbace39..26d39dd 100644
--- a/examples/python/binary_message.py
+++ b/examples/python/binary_message.py
@@ -1,5 +1,5 @@
 #
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -19,7 +19,7 @@ VERBOSE = 1  # verbose error reporting
 
 def example():
     f = open(sys.argv[1])
-    out = open(sys.argv[2], 'w')
+    fout = open(sys.argv[2], 'w')
 
     while 1:
         gid = codes_grib_new_from_file(f)
@@ -29,12 +29,12 @@ def example():
         message = codes_get_message(gid)
 
         newgid = codes_new_from_message(message)
-        codes_write(newgid, out)
+        codes_write(newgid, fout)
         codes_release(newgid)
 
         codes_release(gid)
 
-    out.close()
+    fout.close()
     f.close()
 
 
diff --git a/examples/python/binary_message.sh b/examples/python/binary_message.sh
index ba9c956..dae3645 100755
--- a/examples/python/binary_message.sh
+++ b/examples/python/binary_message.sh
@@ -3,11 +3,11 @@
 . ./include.sh
 
 INPUT=${data_dir}/tigge_pf_ecmwf.grib2
-OUTPUT=out.grib
+OUTPUT=temp.binary_message.grib
 
 $PYTHON $examples_src/binary_message.py $INPUT $OUTPUT
 ${tools_dir}/grib_compare $INPUT $OUTPUT
-rm $OUTPUT || true
+rm -f $OUTPUT
 
 # GRIB-568 corrupt grib
 # We are expecting the command to fail so must turn off "set -e"
@@ -18,5 +18,4 @@ status=$?
 set -e
 # Check command did indeed fail
 [ $status != 0 ]
-rm $OUTPUT || true
-
+rm -f $OUTPUT
diff --git a/examples/python/bufr_attributes.py b/examples/python/bufr_attributes.py
index aebf7e8..ba34aad 100644
--- a/examples/python/bufr_attributes.py
+++ b/examples/python/bufr_attributes.py
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/bufr_attributes.sh b/examples/python/bufr_attributes.sh
index 0a723c3..ed4a0c6 100755
--- a/examples/python/bufr_attributes.sh
+++ b/examples/python/bufr_attributes.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/bufr_clone.py b/examples/python/bufr_clone.py
index fac5686..b2bf476 100644
--- a/examples/python/bufr_clone.py
+++ b/examples/python/bufr_clone.py
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -14,7 +14,6 @@
 # Description: how to create a new BUFR message by cloning
 # an existing message.
 #
-#
 
 import traceback
 import sys
@@ -25,25 +24,23 @@ INPUT = '../../data/bufr/syno_1.bufr'
 OUTPUT = 'bufr_clone_test_p.clone.bufr'
 VERBOSE = 1  # verbose error reporting
 
-
 def example():
 
-    # open bufr file
+    # open BUFR file
     fin = open(INPUT)
 
-    # open otput bufr file
+    # open output BUFR file
     fout = open(OUTPUT, 'w')
 
     # get handle for message
-    gid = codes_bufr_new_from_file(fin)
+    bufr = codes_bufr_new_from_file(fin)
 
     # create several clones of this message and alter them
     # in different ways
-
     for centre in range(0, 3):
 
         # clone the message
-        clone_id = codes_clone(gid)
+        clone_id = codes_clone(bufr)
 
         # this is the place where you may wish to modify the clone
         codes_set(clone_id, 'bufrHeaderCentre', centre)
@@ -55,7 +52,7 @@ def example():
         codes_release(clone_id)
 
     # release the source's handle
-    codes_release(gid)
+    codes_release(bufr)
 
     fin.close()
     fout.close()
diff --git a/examples/python/bufr_clone.sh b/examples/python/bufr_clone.sh
index 430e813..a0967b4 100755
--- a/examples/python/bufr_clone.sh
+++ b/examples/python/bufr_clone.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/bufr_copy_data.py b/examples/python/bufr_copy_data.py
new file mode 100644
index 0000000..adf1f0b
--- /dev/null
+++ b/examples/python/bufr_copy_data.py
@@ -0,0 +1,87 @@
+# Copyright 2005-2017 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+#
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation
+# nor does it submit to any jurisdiction.
+
+#
+# Python implementation: bufr_copy_data
+#
+# Description: How to copy all the values in the data section that are present in the same
+#              position in the data tree and with the same number of values to the output handle
+#
+import traceback
+import sys
+from eccodes import *
+
+VERBOSE = 1  # verbose error reporting
+
+def example(input_filename, output_filename):
+    ibufr = codes_new_from_samples('BUFR3', CODES_PRODUCT_BUFR)
+    f = open(input_filename)
+    ibufrin = codes_bufr_new_from_file(f)
+    ivalues=(
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 1, 1, 1, 1, 1, 1, 1,
+        1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+        1, 1, 1, 1, 1, 0, 1, 1, 1, 1,
+        1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+        1, 1, 1, 1, 1, 1, 1, 1, 0)
+    codes_set_array(ibufr, 'inputDataPresentIndicator', ivalues)
+    codes_set(ibufr, 'edition', 3)
+    codes_set(ibufr, 'masterTableNumber', 0)
+    codes_set(ibufr, 'bufrHeaderSubCentre', 0)
+    codes_set(ibufr, 'bufrHeaderCentre', 98)
+    codes_set(ibufr, 'updateSequenceNumber', 1)
+    codes_set(ibufr, 'dataCategory', 0)
+    codes_set(ibufr, 'dataSubCategory', 140)
+    codes_set(ibufr, 'masterTablesVersionNumber', 13)
+    codes_set(ibufr, 'localTablesVersionNumber', 1)
+    codes_set(ibufr, 'typicalYearOfCentury', 15)
+    codes_set(ibufr, 'typicalMonth', 5)
+    codes_set(ibufr, 'typicalDay', 4)
+    codes_set(ibufr, 'typicalHour', 9)
+    codes_set(ibufr, 'typicalMinute', 30)
+    codes_set(ibufr, 'numberOfSubsets', 1)
+    codes_set(ibufr, 'observedData', 1)
+    codes_set(ibufr, 'compressedData', 0)
+    ivalues=(
+        307011,7006,10004,222000,101023,31031,1031,1032,101023,33007,
+        225000,236000,101023,31031,1031,1032,8024,101001,225255,225000,
+        236000,101023,31031,1031,1032,8024,101001,225255,
+        1063,2001,4001,4002,4003,4004,4005,5002,
+        6002,7001,7006,11001,11016,11017,11002)
+    codes_set_array(ibufr, 'unexpandedDescriptors', ivalues)
+    codes_set(ibufrin, 'unpack', 1)
+    codes_bufr_copy_data(ibufrin, ibufr) # Copy data across
+
+    with open(output_filename, 'w') as outfile:
+        codes_write(ibufr, outfile)
+    codes_release(ibufr)
+    codes_release(ibufrin)
+
+
+def main():
+    if len(sys.argv) < 3:
+        print >>sys.stderr, 'Usage: ', sys.argv[0], ' bufr_in bufr_out'
+        sys.exit(1)
+
+    input_filename = sys.argv[1]
+    output_filename = sys.argv[2]
+
+    try:
+        example(input_filename, output_filename)
+    except CodesInternalError as err:
+        if VERBOSE:
+            traceback.print_exc(file=sys.stderr)
+        else:
+            sys.stderr.write(err.msg + '\n')
+
+        return 1
+
+if __name__ == "__main__":
+    sys.exit(main())
diff --git a/examples/python/bufr_copy_data.sh b/examples/python/bufr_copy_data.sh
new file mode 100755
index 0000000..5da7618
--- /dev/null
+++ b/examples/python/bufr_copy_data.sh
@@ -0,0 +1,67 @@
+#!/bin/sh
+# Copyright 2005-2017 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+#
+# In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
+# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
+
+. ./include.sh
+
+#Define a common label for all the tmp files
+label="bufr_copy_data_py"
+
+TEMP=$label.out.bufr
+REF=$label.compare.log.ref
+MYLOG=$label.compare.log
+
+cd ${data_dir}/bufr
+rm -f ${TEMP} ${REF} ${MYLOG}
+
+cat > ${REF} <<EOF
+== 1 == DIFFERENCE == Different size for "unexpandedDescriptors"  [43]  [28]
+== 1 == DIFFERENCE == [#2#icaoLocationIndicator] not found in 2nd field
+== 1 == DIFFERENCE == [#2#icaoLocationIndicator->units] not found in 2nd field
+== 1 == DIFFERENCE == [#2#stationType] not found in 2nd field
+== 1 == DIFFERENCE == [#2#stationType->units] not found in 2nd field
+== 1 == DIFFERENCE == [#2#year] not found in 2nd field
+== 1 == DIFFERENCE == [#2#year->units] not found in 2nd field
+== 1 == DIFFERENCE == [#2#month] not found in 2nd field
+== 1 == DIFFERENCE == [#2#month->units] not found in 2nd field
+== 1 == DIFFERENCE == [#2#day] not found in 2nd field
+== 1 == DIFFERENCE == [#2#day->units] not found in 2nd field
+== 1 == DIFFERENCE == [#2#hour] not found in 2nd field
+== 1 == DIFFERENCE == [#2#hour->units] not found in 2nd field
+== 1 == DIFFERENCE == [#2#minute] not found in 2nd field
+== 1 == DIFFERENCE == [#2#minute->units] not found in 2nd field
+== 1 == DIFFERENCE == [#2#latitude] not found in 2nd field
+== 1 == DIFFERENCE == [#2#latitude->units] not found in 2nd field
+== 1 == DIFFERENCE == [#2#longitude] not found in 2nd field
+== 1 == DIFFERENCE == [#2#longitude->units] not found in 2nd field
+== 1 == DIFFERENCE == [#2#heightOfStation] not found in 2nd field
+== 1 == DIFFERENCE == [#2#heightOfStation->units] not found in 2nd field
+== 1 == DIFFERENCE == [#4#heightAboveStation] not found in 2nd field
+== 1 == DIFFERENCE == [#4#heightAboveStation->units] not found in 2nd field
+== 1 == DIFFERENCE == [#2#windDirection] not found in 2nd field
+== 1 == DIFFERENCE == [#2#windDirection->units] not found in 2nd field
+== 1 == DIFFERENCE == [#2#extremeCounterclockwiseWindDirectionOfAVariableWind] not found in 2nd field
+== 1 == DIFFERENCE == [#2#extremeCounterclockwiseWindDirectionOfAVariableWind->units] not found in 2nd field
+== 1 == DIFFERENCE == [#2#extremeClockwiseWindDirectionOfAVariableWind] not found in 2nd field
+== 1 == DIFFERENCE == [#2#extremeClockwiseWindDirectionOfAVariableWind->units] not found in 2nd field
+== 1 == DIFFERENCE == [#2#windSpeed] not found in 2nd field
+== 1 == DIFFERENCE == [#2#windSpeed->units] not found in 2nd field
+EOF
+
+INPUT=metar_with_2_bias.bufr
+$PYTHON ${examples_src}bufr_copy_data.py ${INPUT} ${TEMP}
+# The input and output BUFR messages should be different
+set +e
+${tools_dir}bufr_compare ${TEMP} ${INPUT} > ${MYLOG}
+status=$?
+set -e
+[ $status -eq 1 ]
+
+diff ${MYLOG} ${REF}
+
+rm -f ${TEMP} ${REF} ${MYLOG}
diff --git a/examples/python/bufr_encode_flight.py b/examples/python/bufr_encode_flight.py
index 3e473c5..577b649 100644
--- a/examples/python/bufr_encode_flight.py
+++ b/examples/python/bufr_encode_flight.py
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/bufr_expanded.py b/examples/python/bufr_expanded.py
index 7018188..1e2e4c6 100644
--- a/examples/python/bufr_expanded.py
+++ b/examples/python/bufr_expanded.py
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/bufr_expanded.sh b/examples/python/bufr_expanded.sh
index 9d830d9..7155272 100755
--- a/examples/python/bufr_expanded.sh
+++ b/examples/python/bufr_expanded.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/bufr_get_keys.py b/examples/python/bufr_get_keys.py
index 7fc6085..13f084c 100644
--- a/examples/python/bufr_get_keys.py
+++ b/examples/python/bufr_get_keys.py
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/bufr_get_keys.sh b/examples/python/bufr_get_keys.sh
index 75f5ade..de2b42d 100755
--- a/examples/python/bufr_get_keys.sh
+++ b/examples/python/bufr_get_keys.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/bufr_keys_iterator.py b/examples/python/bufr_keys_iterator.py
index f4f7c30..7fb8444 100644
--- a/examples/python/bufr_keys_iterator.py
+++ b/examples/python/bufr_keys_iterator.py
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/bufr_keys_iterator.sh b/examples/python/bufr_keys_iterator.sh
index cd64f39..61a104a 100755
--- a/examples/python/bufr_keys_iterator.sh
+++ b/examples/python/bufr_keys_iterator.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/bufr_read_header.py b/examples/python/bufr_read_header.py
index 410cf91..44e30a8 100644
--- a/examples/python/bufr_read_header.py
+++ b/examples/python/bufr_read_header.py
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/bufr_read_scatterometer.py b/examples/python/bufr_read_scatterometer.py
index 0cd722b..95adb15 100644
--- a/examples/python/bufr_read_scatterometer.py
+++ b/examples/python/bufr_read_scatterometer.py
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -45,7 +45,7 @@ def example():
 
         print "message: %s" % cnt
 
-        # we need to instruct ecCodes to expand all the descriptors
+        # We need to instruct ecCodes to expand all the descriptors
         # i.e. unpack the data values
         codes_set(bufr, 'unpack', 1)
 
@@ -86,10 +86,10 @@ def example():
 
         cnt += 1
 
-        # delete handle
+        # Release handle
         codes_release(bufr)
 
-    # close the file
+    # Close the file
     f.close()
 
 
diff --git a/examples/python/bufr_read_scatterometer.sh b/examples/python/bufr_read_scatterometer.sh
index b841dba..1eda574 100755
--- a/examples/python/bufr_read_scatterometer.sh
+++ b/examples/python/bufr_read_scatterometer.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/bufr_read_synop.py b/examples/python/bufr_read_synop.py
index 20b623a..fd7bad3 100644
--- a/examples/python/bufr_read_synop.py
+++ b/examples/python/bufr_read_synop.py
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/bufr_read_synop.sh b/examples/python/bufr_read_synop.sh
index b7208d9..c77326c 100755
--- a/examples/python/bufr_read_synop.sh
+++ b/examples/python/bufr_read_synop.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/bufr_read_temp.py b/examples/python/bufr_read_temp.py
index c06e645..7d2b9f5 100644
--- a/examples/python/bufr_read_temp.py
+++ b/examples/python/bufr_read_temp.py
@@ -1,5 +1,5 @@
 #
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/bufr_read_temp.sh b/examples/python/bufr_read_temp.sh
index e73491b..0f2f22c 100755
--- a/examples/python/bufr_read_temp.sh
+++ b/examples/python/bufr_read_temp.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/bufr_read_tropical_cyclone.py b/examples/python/bufr_read_tropical_cyclone.py
index b0466ae..8b3281b 100644
--- a/examples/python/bufr_read_tropical_cyclone.py
+++ b/examples/python/bufr_read_tropical_cyclone.py
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -26,7 +26,7 @@ data=collections.defaultdict(dict)
 
 def example():
 
-    # open bufr file
+    # open BUFR file
     f = open(INPUT)
 
     cnt = 0
@@ -34,46 +34,46 @@ def example():
     # loop for the messages in the file
     while 1:
         # get handle for message
-        gid = codes_bufr_new_from_file(f)
-        if gid is None:
+        bufr = codes_bufr_new_from_file(f)
+        if bufr is None:
             break
 
         print '**************** MESSAGE: ',cnt+1,'  *****************'
 
         # we need to instruct ecCodes to expand all the descriptors
         # i.e. unpack the data values
-        codes_set(gid, 'unpack', 1)
+        codes_set(bufr, 'unpack', 1)
 
-        numObs= codes_get(gid,"numberOfSubsets")
-        year  = codes_get(gid, "year")
-        month = codes_get(gid, "month")
-        day   = codes_get(gid, "day")
-        hour  = codes_get(gid, "hour")
-        minute= codes_get(gid, "minute")
+        numObs= codes_get(bufr, "numberOfSubsets")
+        year  = codes_get(bufr, "year")
+        month = codes_get(bufr, "month")
+        day   = codes_get(bufr, "day")
+        hour  = codes_get(bufr, "hour")
+        minute= codes_get(bufr, "minute")
 
         print 'Date and time: ',  day,'.',month,'.',year,'  ',hour,':',minute
 
-        stormIdentifier =  codes_get(gid,"stormIdentifier")
+        stormIdentifier =  codes_get(bufr,"stormIdentifier")
         print  'Storm identifier: ', stormIdentifier
 
-        #How many different timePeriod in the data structure?
+        # How many different timePeriod in the data structure?
         numberOfPeriods=0
         while True:
             numberOfPeriods=numberOfPeriods+1
             try:
-                codes_get_array(gid,"#%d#timePeriod" %numberOfPeriods)
+                codes_get_array(bufr,"#%d#timePeriod" %numberOfPeriods)
             except CodesInternalError as err:
                 break
             #the numberOfPeriods includes the analysis (period=0)
 
         # Get ensembleMemberNumber
-        memberNumber = codes_get_array(gid, "ensembleMemberNumber")
+        memberNumber = codes_get_array(bufr, "ensembleMemberNumber")
         memberNumberLen=len(memberNumber)
 
         # Observed Storm Centre
-        significance    = codes_get(gid,'#1#meteorologicalAttributeSignificance')
-        latitudeCentre  = codes_get(gid,'#1#latitude')
-        longitudeCentre = codes_get(gid,'#1#longitude')
+        significance    = codes_get(bufr,'#1#meteorologicalAttributeSignificance')
+        latitudeCentre  = codes_get(bufr,'#1#latitude')
+        longitudeCentre = codes_get(bufr,'#1#longitude')
 
         if significance!=1:
             print 'ERROR: unexpected #1#meteorologicalAttributeSignificance'
@@ -85,26 +85,26 @@ def example():
             print 'Observed storm centre: latitude=',latitudeCentre,' longitude=',longitudeCentre
 
         # Location of storm in perturbed analysis
-        significance = codes_get(gid,'#2#meteorologicalAttributeSignificance')
+        significance = codes_get(bufr,'#2#meteorologicalAttributeSignificance')
 
         if significance!=4:
             print 'ERROR: unexpected #2#meteorologicalAttributeSignificance'
             return 1
 
-        latitudeAnalysis = codes_get_array(gid,'#2#latitude')
-        longitudeAnalysis = codes_get_array(gid,'#2#longitude')
-        pressureAnalysis = codes_get_array(gid,'#1#pressureReducedToMeanSeaLevel')
+        latitudeAnalysis = codes_get_array(bufr,'#2#latitude')
+        longitudeAnalysis = codes_get_array(bufr,'#2#longitude')
+        pressureAnalysis = codes_get_array(bufr,'#1#pressureReducedToMeanSeaLevel')
 
         # Location of Maximum Wind
-        significance=codes_get(gid,'#3#meteorologicalAttributeSignificance')
+        significance=codes_get(bufr,'#3#meteorologicalAttributeSignificance')
 
         if significance!=3:
             print 'ERROR: unexpected #3#meteorologicalAttributeSignificance=', significance
             return 1
 
-        latitudeMaxWind0=codes_get_array(gid,'#3#latitude')
-        longitudeMaxWind0= codes_get_array(gid,'#3#longitude')
-        windMaxWind0= codes_get_array(gid,'#1#windSpeedAt10M')
+        latitudeMaxWind0=codes_get_array(bufr,'#3#latitude')
+        longitudeMaxWind0= codes_get_array(bufr,'#3#longitude')
+        windMaxWind0= codes_get_array(bufr,'#1#windSpeedAt10M')
 
         if len(latitudeAnalysis)==len(memberNumber) and len(latitudeMaxWind0)==len(memberNumber):
             for k in range(len(memberNumber)):
@@ -120,7 +120,7 @@ def example():
             rank1 = i * 2 + 2
             rank3 = i * 2 + 3
 
-            ivalues= codes_get_array(gid,"#%d#timePeriod" %(i))
+            ivalues= codes_get_array(bufr,"#%d#timePeriod" %(i))
 
             if len(ivalues)==1:
                 timePeriod[i]=ivalues[0]
@@ -130,8 +130,8 @@ def example():
                         timePeriod[i]=ivalues[j]
                         break
 
-            #Location of the storm
-            values = codes_get_array(gid, "#%d#meteorologicalAttributeSignificance" % rank1)
+            # Location of the storm
+            values = codes_get_array(bufr, "#%d#meteorologicalAttributeSignificance" % rank1)
             if len(values)==1:
                 significance=values[0]
             else:
@@ -141,14 +141,14 @@ def example():
                         break
 
             if significance==1:
-                lat = codes_get_array(gid, "#%d#latitude" % rank1)
-                lon = codes_get_array(gid, "#%d#longitude" % rank1)
-                press = codes_get_array(gid, "#%d#pressureReducedToMeanSeaLevel" % (i + 1))
+                lat = codes_get_array(bufr, "#%d#latitude" % rank1)
+                lon = codes_get_array(bufr, "#%d#longitude" % rank1)
+                press = codes_get_array(bufr, "#%d#pressureReducedToMeanSeaLevel" % (i + 1))
             else:
                 print 'ERROR: unexpected meteorologicalAttributeSignificance=',significance
 
-            #Location of maximum wind
-            values = codes_get_array(gid, "#%d#meteorologicalAttributeSignificance" % rank3)
+            # Location of maximum wind
+            values = codes_get_array(bufr, "#%d#meteorologicalAttributeSignificance" % rank3)
             if len(values)==1:
                 significanceWind=values[0]
             else:
@@ -158,9 +158,9 @@ def example():
                         break
 
             if significanceWind==3:
-                latWind = codes_get_array(gid, "#%d#latitude" % rank3)
-                lonWind = codes_get_array(gid, "#%d#longitude" % rank3)
-                wind10m = codes_get_array(gid, "#%d#windSpeedAt10M" % (i + 1))
+                latWind = codes_get_array(bufr, "#%d#latitude" % rank3)
+                lonWind = codes_get_array(bufr, "#%d#longitude" % rank3)
+                wind10m = codes_get_array(bufr, "#%d#windSpeedAt10M" % (i + 1))
             else:
                 print 'ERROR: unexpected meteorologicalAttributeSignificance=',significanceWind
 
@@ -183,7 +183,7 @@ def example():
         cnt += 1
 
         # release the BUFR message
-        codes_release(gid)
+        codes_release(bufr)
 
     # close the file
     f.close()
diff --git a/examples/python/bufr_read_tropical_cyclone.sh b/examples/python/bufr_read_tropical_cyclone.sh
index 98386ba..034e567 100755
--- a/examples/python/bufr_read_tropical_cyclone.sh
+++ b/examples/python/bufr_read_tropical_cyclone.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/bufr_set_keys.py b/examples/python/bufr_set_keys.py
index 6117a9f..d753fc8 100644
--- a/examples/python/bufr_set_keys.py
+++ b/examples/python/bufr_set_keys.py
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -26,10 +26,10 @@ VERBOSE = 1  # verbose error reporting
 
 def example():
 
-    # open bufr file
+    # open BUFR file
     fin = open(INPUT)
 
-    # open otput bufr file
+    # open output BUFR file
     fout = open(OUTPUT, 'w')
 
     cnt = 0
diff --git a/examples/python/bufr_set_keys.sh b/examples/python/bufr_set_keys.sh
index c915b4d..71b7c2a 100755
--- a/examples/python/bufr_set_keys.sh
+++ b/examples/python/bufr_set_keys.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/bufr_subset.py b/examples/python/bufr_subset.py
index 5b7196e..7c7116b 100644
--- a/examples/python/bufr_subset.py
+++ b/examples/python/bufr_subset.py
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/bufr_subset.sh b/examples/python/bufr_subset.sh
index 5130b91..e46750e 100755
--- a/examples/python/bufr_subset.sh
+++ b/examples/python/bufr_subset.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/get_product_kind.py b/examples/python/get_product_kind.py
index d633895..b4f64e4 100644
--- a/examples/python/get_product_kind.py
+++ b/examples/python/get_product_kind.py
@@ -1,5 +1,5 @@
 #
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/get_product_kind.sh b/examples/python/get_product_kind.sh
index b70a49a..aaec57b 100755
--- a/examples/python/get_product_kind.sh
+++ b/examples/python/get_product_kind.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/grib_ccsds.py b/examples/python/grib_ccsds.py
index e7c93de..7d6eb3b 100644
--- a/examples/python/grib_ccsds.py
+++ b/examples/python/grib_ccsds.py
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/grib_clone.py b/examples/python/grib_clone.py
index 179f141..11585d7 100644
--- a/examples/python/grib_clone.py
+++ b/examples/python/grib_clone.py
@@ -1,5 +1,5 @@
 #
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/grib_count_messages.c b/examples/python/grib_count_messages.c
index e76b402..ca862f6 100644
--- a/examples/python/grib_count_messages.c
+++ b/examples/python/grib_count_messages.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/grib_count_messages.py b/examples/python/grib_count_messages.py
index c124d78..6f46cdc 100644
--- a/examples/python/grib_count_messages.py
+++ b/examples/python/grib_count_messages.py
@@ -1,5 +1,5 @@
 #
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/grib_get_keys.py b/examples/python/grib_get_keys.py
index 86dc61e..8f402f5 100644
--- a/examples/python/grib_get_keys.py
+++ b/examples/python/grib_get_keys.py
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/grib_get_message_offset.py b/examples/python/grib_get_message_offset.py
index bb7609f..3cfffdb 100644
--- a/examples/python/grib_get_message_offset.py
+++ b/examples/python/grib_get_message_offset.py
@@ -1,5 +1,5 @@
 #
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/grib_get_message_offset.sh b/examples/python/grib_get_message_offset.sh
index 259336c..9a49719 100755
--- a/examples/python/grib_get_message_offset.sh
+++ b/examples/python/grib_get_message_offset.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/grib_index.py b/examples/python/grib_index.py
index 440ee2d..15cc7d7 100644
--- a/examples/python/grib_index.py
+++ b/examples/python/grib_index.py
@@ -1,5 +1,5 @@
 #
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/grib_index.sh b/examples/python/grib_index.sh
index 9e1a44e..110dde6 100755
--- a/examples/python/grib_index.sh
+++ b/examples/python/grib_index.sh
@@ -2,6 +2,5 @@
 
 . ./include.sh
 
-REDIRECT=/dev/null
-$PYTHON $examples_src/grib_index.py 2> $REDIRECT > $REDIRECT
-rm my.idx || true
+$PYTHON $examples_src/grib_index.py
+rm -f my.idx
diff --git a/examples/python/grib_iterator.c b/examples/python/grib_iterator.c
index 965da6c..690eac4 100644
--- a/examples/python/grib_iterator.c
+++ b/examples/python/grib_iterator.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/grib_iterator.py b/examples/python/grib_iterator.py
index e73102f..8f1fa46 100644
--- a/examples/python/grib_iterator.py
+++ b/examples/python/grib_iterator.py
@@ -1,5 +1,5 @@
 #
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/grib_iterator_bitmap.py b/examples/python/grib_iterator_bitmap.py
index 5979f03..a73ad85 100644
--- a/examples/python/grib_iterator_bitmap.py
+++ b/examples/python/grib_iterator_bitmap.py
@@ -1,5 +1,5 @@
 #
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/grib_keys_iterator.c b/examples/python/grib_keys_iterator.c
index 792f7aa..a0ca5b8 100644
--- a/examples/python/grib_keys_iterator.c
+++ b/examples/python/grib_keys_iterator.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/grib_keys_iterator.py b/examples/python/grib_keys_iterator.py
index 62b91b8..98890ab 100644
--- a/examples/python/grib_keys_iterator.py
+++ b/examples/python/grib_keys_iterator.py
@@ -1,5 +1,5 @@
 #
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/grib_ls_JSON.py b/examples/python/grib_ls_JSON.py
new file mode 100644
index 0000000..9b5e4f3
--- /dev/null
+++ b/examples/python/grib_ls_JSON.py
@@ -0,0 +1,106 @@
+# Copyright 2005-2017 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+#
+# In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
+# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
+#
+# Python implementation:  bufr_read_tropical_cyclone
+#
+# Description: how to read data of the ECMWF EPS tropical cyclone tracks encoded in BUFR format.
+#
+
+import traceback
+import sys
+import os
+import getopt
+from eccodes import *
+
+VERBOSE=1 # verbose error reporting
+default_namespace='ls'
+
+def do_print(namespace, INPUT):
+    f = open(INPUT)
+    first_time = True
+
+    print '{'
+    print '   "messages" : ['
+    while 1:
+        gid = codes_grib_new_from_file(f)
+        if gid is None:
+            break
+
+        if not first_time:
+            print '      ,{'
+        else:
+            print '      {'
+            first_time = False
+
+        iterid = codes_keys_iterator_new(gid, namespace)
+
+        f1 = True
+        while codes_keys_iterator_next(iterid):
+            keyname = codes_keys_iterator_get_name(iterid)
+            keyval = codes_get_string(iterid,keyname)
+            if not f1:
+                print ','
+            else:
+                print ''
+                f1 = False
+            print "         \"%s\" : \"%s\"" % (keyname,keyval),
+
+        print ''
+        print '      }'
+        codes_keys_iterator_delete(iterid)
+        codes_release(gid)
+
+    print '   ]'
+    print '}'
+    f.close()
+
+def usage():
+    progname = os.path.basename(sys.argv[0])
+    print "Usage: ", progname, "[options] grib_file1 grib_file2 ..."
+    print 'Options:'
+    print '\t-n namespace'
+    print '\t\tAll the keys belonging to namespace are printed.'
+    print '\t-m Mars keys are printed.'
+    print ''
+
+def main():
+    if len(sys.argv) < 2:
+        usage()
+        return 1
+    try:
+        options = "mn:"
+        namespace = default_namespace
+        opts, args = getopt.getopt(sys.argv[1:], options)
+        for o, a in opts:
+            if o == '-m':
+                namespace = 'mars'
+            elif o == '-n':
+                namespace = a or default_namespace
+            else:
+                assert False, 'Invalid option'
+
+        # Check we have some GRIB files to process
+        if not args:
+            usage()
+            return 1
+        for arg in args:
+            do_print(namespace, arg)
+    except getopt.GetoptError as err:
+        print 'Error: ',err
+        usage()
+        return 1
+    except GribInternalError as err:
+        if VERBOSE:
+            traceback.print_exc(file=sys.stderr)
+        else:
+            print >>sys.stderr,err.msg
+
+        return 1
+
+if __name__ == "__main__":
+    sys.exit(main())
diff --git a/examples/python/grib_multi_write.py b/examples/python/grib_multi_write.py
index f8d61b0..0c5e59a 100644
--- a/examples/python/grib_multi_write.py
+++ b/examples/python/grib_multi_write.py
@@ -1,5 +1,5 @@
 #
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/grib_nearest.py b/examples/python/grib_nearest.py
index ad27638..8c33a67 100644
--- a/examples/python/grib_nearest.py
+++ b/examples/python/grib_nearest.py
@@ -1,5 +1,5 @@
 #
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/grib_print_data.c b/examples/python/grib_print_data.c
index 039be0b..eefec74 100644
--- a/examples/python/grib_print_data.c
+++ b/examples/python/grib_print_data.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/grib_print_data.py b/examples/python/grib_print_data.py
index f862bb8..61562b6 100644
--- a/examples/python/grib_print_data.py
+++ b/examples/python/grib_print_data.py
@@ -1,5 +1,5 @@
 #
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/grib_samples.py b/examples/python/grib_samples.py
index af8ac6b..6d388c7 100644
--- a/examples/python/grib_samples.py
+++ b/examples/python/grib_samples.py
@@ -1,5 +1,5 @@
 #
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/grib_set_bitmap.py b/examples/python/grib_set_bitmap.py
index 9ea9dcf..d6cd27d 100644
--- a/examples/python/grib_set_bitmap.py
+++ b/examples/python/grib_set_bitmap.py
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/grib_set_keys.py b/examples/python/grib_set_keys.py
index 64c2a7b..41e0c02 100644
--- a/examples/python/grib_set_keys.py
+++ b/examples/python/grib_set_keys.py
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/grib_set_missing.py b/examples/python/grib_set_missing.py
index 7b70a9d..a7cb9ef 100644
--- a/examples/python/grib_set_missing.py
+++ b/examples/python/grib_set_missing.py
@@ -1,5 +1,5 @@
 #
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/grib_set_pv.py b/examples/python/grib_set_pv.py
index 5307665..47fb641 100644
--- a/examples/python/grib_set_pv.py
+++ b/examples/python/grib_set_pv.py
@@ -1,5 +1,5 @@
 #
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -30,7 +30,7 @@ def example():
     numberOfCoefficients = 2 * (numberOfLevels + 1)
     assert(len(pv) == numberOfCoefficients)
 
-    fout = open('out.pv.grib1', 'w')
+    fout = open('grib_set_pv.py.temp.grib', 'w')
     gid = codes_grib_new_from_samples('reduced_gg_sfc_grib1')
 
     codes_set(gid, 'typeOfLevel', 'hybrid')
diff --git a/examples/python/grib_set_pv.sh b/examples/python/grib_set_pv.sh
new file mode 100755
index 0000000..4b3ccab
--- /dev/null
+++ b/examples/python/grib_set_pv.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+. ./include.sh
+
+OUTPUT=grib_set_pv.py.temp.grib
+$PYTHON $examples_src/grib_set_pv.py
+rm $OUTPUT
diff --git a/examples/python/gts_get_keys.py b/examples/python/gts_get_keys.py
index e1237a9..5a31314 100644
--- a/examples/python/gts_get_keys.py
+++ b/examples/python/gts_get_keys.py
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/gts_get_keys.sh b/examples/python/gts_get_keys.sh
index 9f877ee..fc656f0 100755
--- a/examples/python/gts_get_keys.sh
+++ b/examples/python/gts_get_keys.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/high_level_api.py b/examples/python/high_level_api.py
new file mode 100644
index 0000000..4f32df4
--- /dev/null
+++ b/examples/python/high_level_api.py
@@ -0,0 +1,396 @@
+#!/bin/env python
+
+"""
+Unit tests for high level Python interface.
+
+Author: Daniel Lee, DWD, 2016
+"""
+
+import os
+from tempfile import NamedTemporaryFile
+import unittest
+
+from eccodes import GribFile
+from eccodes import GribIndex
+from eccodes import GribMessage
+from eccodes.high_level.gribmessage import IndexNotSelectedError
+from eccodes import BufrFile, BufrMessage
+
+TESTGRIB = "../../data/high_level_api.grib2"
+TESTBUFR = "../../data/bufr/syno_multi.bufr"
+TEST_OUTPUT = "test-output.codes"
+TEST_INDEX = "test.index"
+TEST_KEYS = ("dataDate", "stepRange")
+TEST_VALUES = 20110225, 0
+SELECTION_DICTIONARY = {}
+for i1 in range(len(TEST_KEYS)):
+    SELECTION_DICTIONARY[TEST_KEYS[i1]] = TEST_VALUES[i1]
+TEST_INDEX_OUTPUT = TESTGRIB
+TEST_STEPRANGE = ('0', '12', '18', '24', '6')
+# These keys should be available even if new keys are defined
+KNOWN_GRIB_KEYS = ['7777', 'EPS information', 'GRIBEditionNumber', 'N', 'NV',
+                   'Ni', 'Nj', 'PLPresent', 'PVPresent',
+                   'Parameter information', 'addEmptySection2',
+                   'addExtraLocalSection', 'alternativeRowScanning',
+                   'angleDivisor', 'angleMultiplier', 'angularPrecision',
+                   'average', 'backgroundProcess',
+                   'basicAngleOfTheInitialProductionDomain',
+                   'binaryScaleFactor', 'bitMapIndicator', 'bitmapPresent',
+                   'bitsPerValue', 'bottomLevel', 'centre',
+                   'centreDescription', 'cfName', 'cfNameECMF', 'cfVarName',
+                   'cfVarNameECMF', 'changeDecimalPrecision', 'class',
+                   'climateDateFrom', 'climateDateTo', 'codedValues',
+                   'dataDate', 'dataRepresentationTemplateNumber', 'dataTime',
+                   'day', 'decimalPrecision', 'decimalScaleFactor',
+                   'deleteCalendarId', 'deleteExtraLocalSection', 'deletePV',
+                   'discipline', 'distinctLatitudes', 'distinctLongitudes',
+                   'editionNumber', 'endStep', 'eps',
+                   'experimentVersionNumber', 'extraLocalSectionPresent',
+                   'forecastTime', 'g2grid', 'gaussianGridName',
+                   'genVertHeightCoords', 'generatingProcessIdentifier',
+                   'getNumberOfValues', 'global', 'globalDomain',
+                   'grib 2 Section 5 DATA REPRESENTATION SECTION',
+                   'grib 2 Section 6 BIT-MAP SECTION', 'grib 2 Section 7 data',
+                   'grib2LocalSectionNumber', 'grib2LocalSectionPresent',
+                   'grib2divider', 'gridDefinitionDescription',
+                   'gridDefinitionTemplateNumber',
+                   'gridDescriptionSectionPresent', 'gridType', 'hour',
+                   'hoursAfterDataCutoff', 'iDirectionIncrement',
+                   'iDirectionIncrementGiven', 'iDirectionIncrementInDegrees',
+                   'iScansNegatively', 'iScansPositively', 'identifier',
+                   'ieeeFloats', 'ifsParam', 'ijDirectionIncrementGiven',
+                   'indicatorOfUnitOfTimeRange',
+                   'interpretationOfNumberOfPoints', 'isConstant',
+                   'isHindcast', 'isOctahedral', 'is_uerra',
+                   'jDirectionIncrementGiven', 'jPointsAreConsecutive',
+                   'jScansPositively', 'julianDay', 'kurtosis', 'latLonValues',
+                   'latitudeOfFirstGridPoint',
+                   'latitudeOfFirstGridPointInDegrees',
+                   'latitudeOfLastGridPoint',
+                   'latitudeOfLastGridPointInDegrees', 'latitudes',
+                   'legBaseDate', 'legBaseTime', 'legNumber',
+                   'lengthOfHeaders', 'level', 'localDefinitionNumber',
+                   'localDir', 'localTablesVersion',
+                   'longitudeOfFirstGridPoint',
+                   'longitudeOfFirstGridPointInDegrees',
+                   'longitudeOfLastGridPoint',
+                   'longitudeOfLastGridPointInDegrees', 'longitudes',
+                   'mAngleMultiplier', 'mBasicAngle', 'marsClass',
+                   'marsStream', 'marsType', 'masterDir', 'maximum',
+                   'md5Headers', 'md5Section1', 'md5Section3', 'md5Section4',
+                   'md5Section5', 'md5Section6', 'md5Section7', 'minimum',
+                   'minute', 'minutesAfterDataCutoff', 'missingValue',
+                   'modelName', 'month', 'name', 'nameECMF',
+                   'nameOfFirstFixedSurface', 'nameOfSecondFixedSurface',
+                   'neitherPresent', 'numberOfDataPoints',
+                   'numberOfForecastsInEnsemble', 'numberOfMissing',
+                   'numberOfOctectsForNumberOfPoints', 'numberOfSection',
+                   'numberOfValues', 'oceanAtmosphereCoupling',
+                   'offsetValuesBy', 'optimizeScaleFactor', 'packingError',
+                   'packingType', 'paramId', 'paramIdECMF',
+                   'parameterCategory', 'parameterName', 'parameterNumber',
+                   'parameterUnits', 'perturbationNumber', 'pressureUnits',
+                   'productDefinitionTemplateNumber',
+                   'productDefinitionTemplateNumberInternal', 'productType',
+                   'productionStatusOfProcessedData', 'radius',
+                   'referenceDate', 'referenceValue', 'referenceValueError',
+                   'resolutionAndComponentFlags',
+                   'resolutionAndComponentFlags1',
+                   'resolutionAndComponentFlags2',
+                   'resolutionAndComponentFlags6',
+                   'resolutionAndComponentFlags7',
+                   'resolutionAndComponentFlags8',
+                   'scaleFactorOfEarthMajorAxis',
+                   'scaleFactorOfEarthMinorAxis',
+                   'scaleFactorOfFirstFixedSurface',
+                   'scaleFactorOfRadiusOfSphericalEarth',
+                   'scaleFactorOfSecondFixedSurface', 'scaleValuesBy',
+                   'scaledValueOfEarthMajorAxis',
+                   'scaledValueOfEarthMinorAxis',
+                   'scaledValueOfFirstFixedSurface',
+                   'scaledValueOfRadiusOfSphericalEarth',
+                   'scaledValueOfSecondFixedSurface', 'scanningMode',
+                   'scanningMode5', 'scanningMode6', 'scanningMode7',
+                   'scanningMode8', 'second', 'section0Length',
+                   'section1Length', 'section2Length', 'section2Padding',
+                   'section3Length', 'section3Padding', 'section4Length',
+                   'section5Length', 'section6Length', 'section7Length',
+                   'section8Length', 'sectionNumber',
+                   'selectStepTemplateInstant', 'selectStepTemplateInterval',
+                   'setBitsPerValue', 'setCalendarId', 'shapeOfTheEarth',
+                   'shortName', 'shortNameECMF', 'significanceOfReferenceTime',
+                   'skewness', 'sourceOfGridDefinition', 'standardDeviation',
+                   'startStep', 'stepRange', 'stepType', 'stepTypeInternal',
+                   'stepUnits', 'stream', 'subCentre',
+                   'subdivisionsOfBasicAngle', 'tablesVersion',
+                   'tablesVersionLatest', 'tempPressureUnits', 'topLevel',
+                   'totalLength', 'type', 'typeOfEnsembleForecast',
+                   'typeOfFirstFixedSurface', 'typeOfGeneratingProcess',
+                   'typeOfLevel', 'typeOfOriginalFieldValues',
+                   'typeOfProcessedData', 'typeOfSecondFixedSurface', 'units',
+                   'unitsECMF', 'unitsOfFirstFixedSurface',
+                   'unitsOfSecondFixedSurface', 'unpackedError',
+                   'uvRelativeToGrid', 'validityDate', 'validityTime',
+                   'values', 'x', 'year']
+KNOWN_BUFR_KEYS = ['3HourPressureChange', '7777', 'BUFRstr',
+                   'airTemperatureAt2M', 'blockNumber', 'bufrHeaderCentre',
+                   'bufrHeaderSubCentre', 'bufrTemplate',
+                   'bufrdcExpandedDescriptors', 'centre',
+                   'characteristicOfPressureTendency', 'cloudAmount',
+                   'cloudCoverTotal', 'cloudType', 'compressedData',
+                   'corr1Data', 'corr2Data', 'corr3Data', 'corr4Data',
+                   'correction1', 'correction1Part', 'correction2',
+                   'correction2Part', 'correction3', 'correction3Part',
+                   'correction4', 'correction4Part', 'createNewData',
+                   'dataCategory', 'dataPresentIndicator', 'dataSubCategory',
+                   'day', 'defaultSequence', 'dewpointTemperatureAt2M', 'ed',
+                   'edition', 'expandedAbbreviations', 'expandedCodes',
+                   'expandedCrex_scales', 'expandedCrex_units',
+                   'expandedCrex_widths', 'expandedNames',
+                   'expandedOriginalCodes', 'expandedOriginalReferences',
+                   'expandedOriginalScales', 'expandedOriginalWidths',
+                   'expandedTypes', 'expandedUnits', 'generatingApplication',
+                   'globalDomain', 'heightOfBaseOfCloud', 'heightOfStation',
+                   'horizontalVisibility', 'hour', 'isSatellite',
+                   'isSatelliteType', 'latitude', 'lengthDescriptors',
+                   'localDay', 'localHour', 'localLatitude', 'localLongitude',
+                   'localMinute', 'localMonth', 'localSecond',
+                   'localSectionPresent', 'localTablesVersionNumber',
+                   'localYear', 'longitude', 'masterTableNumber',
+                   'masterTablesVersionNumber', 'md5Data', 'md5Structure',
+                   'messageLength', 'minute', 'month', 'nonCoordinatePressure',
+                   'numberOfSubsets', 'numberOfUnexpandedDescriptors',
+                   'observedData', 'operator', 'pastWeather1', 'pastWeather2',
+                   'presentWeather', 'pressureReducedToMeanSeaLevel',
+                   'qualityControl', 'rdbSubtype', 'rdbType', 'rdbtime',
+                   'rdbtimeDay', 'rdbtimeHour', 'rdbtimeMinute',
+                   'rdbtimeSecond', 'rectime', 'rectimeDay', 'rectimeHour',
+                   'rectimeMinute', 'rectimeSecond', 'relativeHumidity',
+                   'reservedSection2', 'reservedSection3', 'section1Length',
+                   'section1Padding', 'section2Length', 'section2Padding',
+                   'section3Flags', 'section3Length', 'section3Padding',
+                   'section4Length', 'section4Padding', 'section5Length',
+                   'sequences', 'spare', 'spare1', 'stationNumber',
+                   'stationType', 'subsetNumber', 'tableNumber',
+                   'templatesLocalDir', 'templatesMasterDir', 'totalLength',
+                   'totalPrecipitationPast6Hours', 'totalSnowDepth',
+                   'typicalCentury', 'typicalDate', 'typicalDay',
+                   'typicalHour', 'typicalMinute', 'typicalMonth',
+                   'typicalSecond', 'typicalTime', 'typicalYear',
+                   'typicalYearOfCentury', 'unexpandedDescriptors',
+                   'updateSequenceNumber',
+                   'verticalSignificanceSurfaceObservations',
+                   'windDirectionAt10M', 'windSpeedAt10M', 'year']
+
+
+class TestGribFile(unittest.TestCase):
+
+    """Test GribFile functionality."""
+
+    def test_memory_management(self):
+        """Messages in GribFile can be opened and closed properly."""
+        with GribFile(TESTGRIB) as grib:
+            self.assertEqual(len(grib), 5)
+            for i in range(len(grib)):
+                msg = GribMessage(grib)
+                self.assertEqual(msg["shortName"], "msl")
+            self.assertEqual(len(grib.open_messages), 5)
+        self.assertEqual(len(grib.open_messages), 0)
+
+    def test_message_counting_works(self):
+        """The GribFile is aware of its messages."""
+        with GribFile(TESTGRIB) as grib:
+            msg_count = len(grib)
+        self.assertEqual(msg_count, 5)
+
+    def test_iterator_protocol(self):
+        """The GribFile allows pythonic iteration over all messages."""
+        step_ranges = []
+        with GribFile(TESTGRIB) as grib:
+            for msg in grib:
+                step_ranges.append(msg["stepRange"])
+        self.assertSequenceEqual(step_ranges, ["0", "6", "12", "18", "24"])
+
+    def test_read_past_last_message(self):
+        """Trying to open message on exhausted GRIB file raises IOError."""
+        with GribFile(TESTGRIB) as grib:
+            for _ in range(len(grib)):
+                GribMessage(grib)
+            self.assertRaises(IOError, lambda: GribMessage(grib))
+
+    def test_read_invalid_file(self):
+        """Trying to open message on nonexistent GRIB file raises IOError."""
+        with NamedTemporaryFile(mode='r') as f:
+            with GribFile(f.name) as grib:
+                self.assertRaises(IOError, lambda: GribMessage(grib))
+
+
+class TestGribMessage(unittest.TestCase):
+
+    """Test GribMessage functionality."""
+
+    def test_metadata(self):
+        """Metadata is read correctly from GribMessage."""
+        with GribFile(TESTGRIB) as grib:
+            msg = GribMessage(grib)
+            for key in KNOWN_GRIB_KEYS:
+                assert key in msg.keys()
+            self.assertEqual(msg.size(), 160219)
+            self.assertEqual(len(msg.keys()), len(msg))
+
+    def test_missing_message_behaviour(self):
+        """Key with MISSING value."""
+        with GribFile(TESTGRIB) as grib:
+            msg = GribMessage(grib)
+            self.assertTrue(msg.missing("scaleFactorOfSecondFixedSurface"))
+            msg["scaleFactorOfSecondFixedSurface"] = 5
+            msg.set_missing("scaleFactorOfSecondFixedSurface")
+            #with self.assertRaises(KeyError):
+            #    msg["scaleFactorOfSecondFixedSurface"]
+
+    def test_value_setting(self):
+        """Keys can be set properly."""
+        with GribFile(TESTGRIB) as grib:
+            msg = GribMessage(grib)
+            msg["scaleFactorOfSecondFixedSurface"] = 5
+            msg["values"] = [1, 2, 3]
+
+    def test_serialize(self):
+        """Message can be serialized to file."""
+        with GribFile(TESTGRIB) as grib:
+            msg = GribMessage(grib)
+            with open(TEST_OUTPUT, "w") as test:
+                msg.write(test)
+        os.unlink(TEST_OUTPUT)
+
+    def test_clone(self):
+        """Messages can be used to produce clone Messages."""
+        with GribFile(TESTGRIB) as grib:
+            msg = GribMessage(grib)
+            msg2 = GribMessage(clone=msg)
+            self.assertSequenceEqual(msg.keys(), msg2.keys())
+
+
+class TestGribIndex(unittest.TestCase):
+
+    """Test GribIndex functionality."""
+
+    def test_memory_management(self):
+        """GribIndex closes GribMessages properly."""
+        with GribIndex(TESTGRIB, TEST_KEYS) as idx:
+            idx.select(SELECTION_DICTIONARY)
+            self.assertEqual(len(idx.open_messages), 1)
+        self.assertEqual(len(idx.open_messages), 0)
+
+    def test_create_and_serialize_index(self):
+        """GribIndex can be saved to file, file can be added to index."""
+        with GribIndex(TESTGRIB, TEST_KEYS) as idx:
+            idx.write(TEST_INDEX)
+        with GribIndex(file_index=TEST_INDEX) as idx:
+            idx.add(TESTGRIB)
+        os.unlink(TEST_INDEX)
+
+    def test_index_comprehension(self):
+        """GribIndex understands underlying GRIB index properly."""
+        with GribIndex(TESTGRIB, TEST_KEYS) as idx:
+            self.assertEqual(idx.size(TEST_KEYS[1]), 5)
+            self.assertSequenceEqual(idx.values(TEST_KEYS[1]), TEST_STEPRANGE)
+            with self.assertRaises(IndexNotSelectedError):
+                # Note: The following will issue a message to stderr:
+                #   ECCODES ERROR   :  please select a value for index key "dataDate"
+                # This is expected behaviour
+                idx.select({TEST_KEYS[1]: TEST_VALUES[0]})
+            # Now it will be OK as we have selected all necessary keys
+            idx.select(SELECTION_DICTIONARY)
+            self.assertEqual(len(idx.open_messages), 1)
+
+
+class TestBufrFile(unittest.TestCase):
+
+    """Test BufrFile functionality."""
+
+    def test_memory_management(self):
+        """Messages in BufrFile can be opened and closed properly."""
+        with BufrFile(TESTBUFR) as bufr:
+            self.assertEqual(len(bufr), 3)
+            for i in range(len(bufr)):
+                msg = BufrMessage(bufr)
+                self.assertEqual(msg["bufrHeaderCentre"], 98)
+            self.assertEqual(len(bufr.open_messages), 3)
+        self.assertEquals(len(bufr.open_messages), 0)
+
+    def test_message_counting_works(self):
+        """The BufrFile is aware of its messages."""
+        with BufrFile(TESTBUFR) as bufr:
+            msg_count = len(bufr)
+        self.assertEqual(msg_count, 3)
+
+    def test_iterator_protocol(self):
+        """The BufrFile allows pythonic iteration over all messages."""
+        latitudes = []
+        with BufrFile(TESTBUFR) as bufr:
+            for msg in bufr:
+                latitudes.append(msg["localLatitude"])
+        self.assertSequenceEqual(latitudes, [70.93, 77, 78.92])
+
+    def test_read_past_last_message(self):
+        """Trying to open message on exhausted BUFR file raises IOError."""
+        with BufrFile(TESTBUFR) as bufr:
+            for _ in range(len(bufr)):
+                BufrMessage(bufr)
+            self.assertRaises(IOError, lambda: BufrMessage(bufr))
+
+    def test_read_invalid_file(self):
+        """Trying to open message on nonexistent file raises IOError."""
+        with NamedTemporaryFile(mode='r') as f:
+            with BufrFile(f.name) as bufr:
+                self.assertRaises(IOError, lambda: BufrMessage(bufr))
+
+
+class TestBufrMessage(unittest.TestCase):
+
+    """Test BufrMessage functionality"""
+
+    def test_metadata(self):
+        """Metadata is read correctly from BufrMessage."""
+        with BufrFile(TESTBUFR) as bufr:
+            msg = BufrMessage(bufr)
+            for key in KNOWN_BUFR_KEYS:
+                assert key in msg.keys()
+            self.assertEqual(msg.size(), 220)
+            self.assertEqual(len(msg.keys()), len(msg))
+
+    def test_content(self):
+        """Data values are read correctly from BufrMessage."""
+        with BufrFile(TESTBUFR) as bufr:
+            msg = BufrMessage(bufr)
+            self.assertEqual(msg["airTemperatureAt2M"], 274.5)
+
+    # TODO: Test behaviour with missing messages (SUP-1874)
+
+    def test_value_setting(self):
+        """Keys can be set properly."""
+        with BufrFile(TESTBUFR) as bufr:
+            msg = BufrMessage(bufr)
+            key, val = "localLongitude", 5
+            msg[key] = val
+            self.assertEqual(msg[key], val)
+
+    def test_serialize(self):
+        """Message can be serialized to file."""
+        with BufrFile(TESTBUFR) as bufr:
+            msg = BufrMessage(bufr)
+            with open(TEST_OUTPUT, "w") as test:
+                msg.write(test)
+        os.unlink(TEST_OUTPUT)
+
+    def test_clone(self):
+        """Messages can be used to produce clone Messages."""
+        with BufrFile(TESTBUFR) as bufr:
+            msg = BufrMessage(bufr)
+            msg2 = BufrMessage(clone=msg)
+            self.assertSequenceEqual(msg.keys(), msg2.keys())
+
+
+if __name__ == "__main__":
+    unittest.main()
diff --git a/examples/python/high_level_api.sh b/examples/python/high_level_api.sh
new file mode 100755
index 0000000..6c468ea
--- /dev/null
+++ b/examples/python/high_level_api.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+. ./include.sh
+
+# To get verbose output
+#$PYTHON -m unittest -v high_level_api
+
+$PYTHON $examples_src/high_level_api.py
+
+rm -f test.index
diff --git a/examples/python/keys_iterator_bufr.py b/examples/python/keys_iterator_bufr.py
deleted file mode 100644
index 36e49c9..0000000
--- a/examples/python/keys_iterator_bufr.py
+++ /dev/null
@@ -1,62 +0,0 @@
-#
-# Copyright 2005-2016 ECMWF.
-#
-# This software is licensed under the terms of the Apache Licence Version 2.0
-# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
-#
-# In applying this licence, ECMWF does not waive the privileges and immunities
-# granted to it by virtue of its status as an intergovernmental organisation
-# nor does it submit to any jurisdiction.
-#
-
-import traceback
-import sys
-
-from eccodes import *
-
-INPUT = '../../data/gts.bufr'
-VERBOSE = 1  # verbose error reporting
-
-
-def example():
-    f = open(INPUT)
-
-    while 1:
-        bid = bufr_new_from_file(f)
-        if bid is None:
-            break
-
-        iterid = codes_keys_iterator_new(bid)
-
-        # Different types of keys can be skipped
-        # codes_skip_computed(iterid)
-        # codes_skip_coded(iterid)
-        # codes_skip_edition_specific(iterid)
-        # codes_skip_duplicates(iterid)
-        # codes_skip_read_only(iterid)
-        # codes_skip_function(iterid)
-
-        while codes_keys_iterator_next(iterid):
-            keyname = codes_keys_iterator_get_name(iterid)
-            keyval = codes_get_string(iterid, keyname)
-            print "%s = %s" % (keyname, keyval)
-
-        codes_keys_iterator_delete(iterid)
-        codes_release(bid)
-
-    f.close()
-
-
-def main():
-    try:
-        example()
-    except CodesInternalError as err:
-        if VERBOSE:
-            traceback.print_exc(file=sys.stderr)
-        else:
-            sys.stderr.write(err.msg + '\n')
-
-        return 1
-
-if __name__ == "__main__":
-    sys.exit(main())
diff --git a/examples/python/keys_iterator_gts.py b/examples/python/keys_iterator_gts.py
index 63e5860..7f8f8f9 100644
--- a/examples/python/keys_iterator_gts.py
+++ b/examples/python/keys_iterator_gts.py
@@ -1,5 +1,5 @@
 #
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/metar_get_keys.py b/examples/python/metar_get_keys.py
index f41fae9..8f8b0c8 100644
--- a/examples/python/metar_get_keys.py
+++ b/examples/python/metar_get_keys.py
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/examples/python/metar_get_keys.sh b/examples/python/metar_get_keys.sh
index d07d2f6..a42435a 100755
--- a/examples/python/metar_get_keys.sh
+++ b/examples/python/metar_get_keys.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/fortran/create_grib_f90.sh b/fortran/create_grib_f90.sh
index 358305e..8823bf5 100755
--- a/fortran/create_grib_f90.sh
+++ b/fortran/create_grib_f90.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/fortran/eccodes_constants.h b/fortran/eccodes_constants.h
index 15a04e8..8a14e93 100644
--- a/fortran/eccodes_constants.h
+++ b/fortran/eccodes_constants.h
@@ -1,68 +1,68 @@
-  integer, parameter,public :: CODES_WRONG_BITMAP_SIZE                             = -66
-  integer, parameter,public :: CODES_OUT_OF_RANGE                                  = -65
-  integer, parameter,public :: CODES_UNSUPPORTED_EDITION                           = -64
-  integer, parameter,public :: CODES_ATTRIBUTE_NOT_FOUND                           = -63
-  integer, parameter,public :: CODES_TOO_MANY_ATTRIBUTES                           = -62
-  integer, parameter,public :: CODES_ATTRIBUTE_CLASH                               = -61
-  integer, parameter,public :: CODES_NULL_POINTER                                  = -60
-  integer, parameter,public :: CODES_MISSING_BUFR_ENTRY                            = -59
-  integer, parameter,public :: CODES_WRONG_CONVERSION                              = -58
-  integer, parameter,public :: CODES_STRING_TOO_SMALL                              = -57
-  integer, parameter,public :: CODES_INVALID_KEY_VALUE                             = -56
-  integer, parameter,public :: CODES_VALUE_DIFFERENT                               = -55
-  integer, parameter,public :: CODES_DIFFERENT_EDITION                             = -54
-  integer, parameter,public :: CODES_INVALID_BPV                                   = -53
-  integer, parameter,public :: CODES_CORRUPTED_INDEX                               = -52
-  integer, parameter,public :: CODES_MESSAGE_MALFORMED                             = -51
-  integer, parameter,public :: CODES_UNDERFLOW                                     = -50
-  integer, parameter,public :: CODES_SWITCH_NO_MATCH                               = -49
-  integer, parameter,public :: CODES_CONSTANT_FIELD                                = -48
-  integer, parameter,public :: CODES_MESSAGE_TOO_LARGE                             = -47
-  integer, parameter,public :: CODES_INTERNAL_ARRAY_TOO_SMALL                      = -46
-  integer, parameter,public :: CODES_PREMATURE_END_OF_FILE                         = -45
-  integer, parameter,public :: CODES_NULL_INDEX                                    = -44
-  integer, parameter,public :: CODES_END_OF_INDEX                                  = -43
-  integer, parameter,public :: CODES_WRONG_GRID                                    = -42
-  integer, parameter,public :: CODES_NO_VALUES                                     = -41
-  integer, parameter,public :: CODES_END                                           = -40
-  integer, parameter,public :: CODES_WRONG_TYPE                                    = -39
-  integer, parameter,public :: CODES_NO_DEFINITIONS                                = -38
-  integer, parameter,public :: CODES_HASH_ARRAY_NO_MATCH                           = -37
-  integer, parameter,public :: CODES_CONCEPT_NO_MATCH                              = -36
-  integer, parameter,public :: CODES_OUT_OF_AREA                                   = -35
-  integer, parameter,public :: CODES_MISSING_KEY                                   = -34
-  integer, parameter,public :: CODES_INVALID_ORDERBY                               = -33
-  integer, parameter,public :: CODES_INVALID_NEAREST                               = -32
-  integer, parameter,public :: CODES_INVALID_KEYS_ITERATOR                         = -31
-  integer, parameter,public :: CODES_INVALID_ITERATOR                              = -30
-  integer, parameter,public :: CODES_INVALID_INDEX                                 = -29
-  integer, parameter,public :: CODES_INVALID_GRIB                                  = -28
-  integer, parameter,public :: CODES_INVALID_FILE                                  = -27
-  integer, parameter,public :: CODES_WRONG_STEP_UNIT                               = -26
-  integer, parameter,public :: CODES_WRONG_STEP                                    = -25
-  integer, parameter,public :: CODES_INVALID_TYPE                                  = -24
-  integer, parameter,public :: CODES_WRONG_LENGTH                                  = -23
-  integer, parameter,public :: CODES_VALUE_CANNOT_BE_MISSING                       = -22
-  integer, parameter,public :: CODES_INVALID_SECTION_NUMBER                        = -21
-  integer, parameter,public :: CODES_NULL_HANDLE                                   = -20
-  integer, parameter,public :: CODES_INVALID_ARGUMENT                              = -19
-  integer, parameter,public :: CODES_READ_ONLY                                     = -18
-  integer, parameter,public :: CODES_OUT_OF_MEMORY                                 = -17
-  integer, parameter,public :: CODES_GEOCALCULUS_PROBLEM                           = -16
-  integer, parameter,public :: CODES_NO_MORE_IN_SET                                = -15
-  integer, parameter,public :: CODES_ENCODING_ERROR                                = -14
-  integer, parameter,public :: CODES_DECODING_ERROR                                = -13
-  integer, parameter,public :: CODES_INVALID_MESSAGE                               = -12
-  integer, parameter,public :: CODES_IO_PROBLEM                                    = -11
-  integer, parameter,public :: CODES_NOT_FOUND                                     = -10
-  integer, parameter,public :: CODES_WRONG_ARRAY_SIZE                              = -9
-  integer, parameter,public :: CODES_CODE_NOT_FOUND_IN_TABLE                       = -8
-  integer, parameter,public :: CODES_FILE_NOT_FOUND                                = -7
-  integer, parameter,public :: CODES_ARRAY_TOO_SMALL                               = -6
-  integer, parameter,public :: CODES_7777_NOT_FOUND                                = -5
-  integer, parameter,public :: CODES_NOT_IMPLEMENTED                               = -4
-  integer, parameter,public :: CODES_BUFFER_TOO_SMALL                              = -3
-  integer, parameter,public :: CODES_INTERNAL_ERROR                                = -2
-  integer, parameter,public :: CODES_END_OF_FILE                                   = -1
-  integer, parameter,public :: CODES_SUCCESS                                       = 0
-  integer, parameter,public :: CODES_NULL                                          = -1
+  integer, parameter,public :: CODES_WRONG_BITMAP_SIZE                            = -66
+  integer, parameter,public :: CODES_OUT_OF_RANGE                                 = -65
+  integer, parameter,public :: CODES_UNSUPPORTED_EDITION                          = -64
+  integer, parameter,public :: CODES_ATTRIBUTE_NOT_FOUND                          = -63
+  integer, parameter,public :: CODES_TOO_MANY_ATTRIBUTES                          = -62
+  integer, parameter,public :: CODES_ATTRIBUTE_CLASH                              = -61
+  integer, parameter,public :: CODES_NULL_POINTER                                 = -60
+  integer, parameter,public :: CODES_MISSING_BUFR_ENTRY                           = -59
+  integer, parameter,public :: CODES_WRONG_CONVERSION                             = -58
+  integer, parameter,public :: CODES_STRING_TOO_SMALL                             = -57
+  integer, parameter,public :: CODES_INVALID_KEY_VALUE                            = -56
+  integer, parameter,public :: CODES_VALUE_DIFFERENT                              = -55
+  integer, parameter,public :: CODES_DIFFERENT_EDITION                            = -54
+  integer, parameter,public :: CODES_INVALID_BPV                                  = -53
+  integer, parameter,public :: CODES_CORRUPTED_INDEX                              = -52
+  integer, parameter,public :: CODES_MESSAGE_MALFORMED                            = -51
+  integer, parameter,public :: CODES_UNDERFLOW                                    = -50
+  integer, parameter,public :: CODES_SWITCH_NO_MATCH                              = -49
+  integer, parameter,public :: CODES_CONSTANT_FIELD                               = -48
+  integer, parameter,public :: CODES_MESSAGE_TOO_LARGE                            = -47
+  integer, parameter,public :: CODES_INTERNAL_ARRAY_TOO_SMALL                     = -46
+  integer, parameter,public :: CODES_PREMATURE_END_OF_FILE                        = -45
+  integer, parameter,public :: CODES_NULL_INDEX                                   = -44
+  integer, parameter,public :: CODES_END_OF_INDEX                                 = -43
+  integer, parameter,public :: CODES_WRONG_GRID                                   = -42
+  integer, parameter,public :: CODES_NO_VALUES                                    = -41
+  integer, parameter,public :: CODES_END                                          = -40
+  integer, parameter,public :: CODES_WRONG_TYPE                                   = -39
+  integer, parameter,public :: CODES_NO_DEFINITIONS                               = -38
+  integer, parameter,public :: CODES_HASH_ARRAY_NO_MATCH                          = -37
+  integer, parameter,public :: CODES_CONCEPT_NO_MATCH                             = -36
+  integer, parameter,public :: CODES_OUT_OF_AREA                                  = -35
+  integer, parameter,public :: CODES_MISSING_KEY                                  = -34
+  integer, parameter,public :: CODES_INVALID_ORDERBY                              = -33
+  integer, parameter,public :: CODES_INVALID_NEAREST                              = -32
+  integer, parameter,public :: CODES_INVALID_KEYS_ITERATOR                        = -31
+  integer, parameter,public :: CODES_INVALID_ITERATOR                             = -30
+  integer, parameter,public :: CODES_INVALID_INDEX                                = -29
+  integer, parameter,public :: CODES_INVALID_GRIB                                 = -28
+  integer, parameter,public :: CODES_INVALID_FILE                                 = -27
+  integer, parameter,public :: CODES_WRONG_STEP_UNIT                              = -26
+  integer, parameter,public :: CODES_WRONG_STEP                                   = -25
+  integer, parameter,public :: CODES_INVALID_TYPE                                 = -24
+  integer, parameter,public :: CODES_WRONG_LENGTH                                 = -23
+  integer, parameter,public :: CODES_VALUE_CANNOT_BE_MISSING                      = -22
+  integer, parameter,public :: CODES_INVALID_SECTION_NUMBER                       = -21
+  integer, parameter,public :: CODES_NULL_HANDLE                                  = -20
+  integer, parameter,public :: CODES_INVALID_ARGUMENT                             = -19
+  integer, parameter,public :: CODES_READ_ONLY                                    = -18
+  integer, parameter,public :: CODES_OUT_OF_MEMORY                                = -17
+  integer, parameter,public :: CODES_GEOCALCULUS_PROBLEM                          = -16
+  integer, parameter,public :: CODES_NO_MORE_IN_SET                               = -15
+  integer, parameter,public :: CODES_ENCODING_ERROR                               = -14
+  integer, parameter,public :: CODES_DECODING_ERROR                               = -13
+  integer, parameter,public :: CODES_INVALID_MESSAGE                              = -12
+  integer, parameter,public :: CODES_IO_PROBLEM                                   = -11
+  integer, parameter,public :: CODES_NOT_FOUND                                    = -10
+  integer, parameter,public :: CODES_WRONG_ARRAY_SIZE                             = -9
+  integer, parameter,public :: CODES_CODE_NOT_FOUND_IN_TABLE                      = -8
+  integer, parameter,public :: CODES_FILE_NOT_FOUND                               = -7
+  integer, parameter,public :: CODES_ARRAY_TOO_SMALL                              = -6
+  integer, parameter,public :: CODES_7777_NOT_FOUND                               = -5
+  integer, parameter,public :: CODES_NOT_IMPLEMENTED                              = -4
+  integer, parameter,public :: CODES_BUFFER_TOO_SMALL                             = -3
+  integer, parameter,public :: CODES_INTERNAL_ERROR                               = -2
+  integer, parameter,public :: CODES_END_OF_FILE                                  = -1
+  integer, parameter,public :: CODES_SUCCESS                                      = 0
+  integer, parameter,public :: CODES_NULL                                         = -1
diff --git a/fortran/eccodes_f90_head.f90 b/fortran/eccodes_f90_head.f90
index 172ba4c..6ed3d14 100644
--- a/fortran/eccodes_f90_head.f90
+++ b/fortran/eccodes_f90_head.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/fortran/eccodes_f90_int.f90 b/fortran/eccodes_f90_int.f90
index 1ddc21f..63f75eb 100644
--- a/fortran/eccodes_f90_int.f90
+++ b/fortran/eccodes_f90_int.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/fortran/eccodes_f90_int_size_t.f90 b/fortran/eccodes_f90_int_size_t.f90
index 729546a..33988fa 100644
--- a/fortran/eccodes_f90_int_size_t.f90
+++ b/fortran/eccodes_f90_int_size_t.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/fortran/eccodes_f90_long_int.f90 b/fortran/eccodes_f90_long_int.f90
index c6e4bf2..ff4cbfe 100644
--- a/fortran/eccodes_f90_long_int.f90
+++ b/fortran/eccodes_f90_long_int.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/fortran/eccodes_f90_long_size_t.f90 b/fortran/eccodes_f90_long_size_t.f90
index 22f7de7..fcb2e20 100644
--- a/fortran/eccodes_f90_long_size_t.f90
+++ b/fortran/eccodes_f90_long_size_t.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/fortran/eccodes_f90_tail.f90 b/fortran/eccodes_f90_tail.f90
index aa474e3..a196e19 100644
--- a/fortran/eccodes_f90_tail.f90
+++ b/fortran/eccodes_f90_tail.f90
@@ -1577,6 +1577,31 @@ subroutine codes_get_string_array ( msgid, key, value, status )
 
 end subroutine codes_get_string_array 
 
+  !> Copy data values from a BUFR message msgid1 to another message msgid2
+  !>
+  !> In case of error, if the status parameter (optional) is not given, the program will
+  !> exit with an error message.\n Otherwise the error message can be
+  !> gathered with @ref codes_get_error_string.\n
+  !>
+  !> @param msgid1      id of the message from which the data are copied
+  !> @param msgid2      id of the message to which the data are copied
+  !> @param status      CODES_SUCCESS if OK, integer value on error
+subroutine codes_bufr_copy_data ( msgid1, msgid2, status )
+    integer(kind=kindOfInt),               intent(in)  :: msgid1
+    integer(kind=kindOfInt),               intent(in)  :: msgid2
+    integer(kind=kindOfInt),optional, intent(out)      :: status
+    integer(kind=kindOfInt)                            :: iret
+
+    iret=codes_f_bufr_copy_data ( msgid1,msgid2 )
+
+    if (present(status)) then
+      status = iret
+    else
+      call grib_check(iret,'bufr_copy_data','error while copying')
+    endif
+
+end subroutine codes_bufr_copy_data 
+
   !> Set the string values for an array key in a message.
   !>
   !> In case of error, if the status parameter (optional) is not given, the program will
@@ -1863,17 +1888,17 @@ end subroutine codes_get_real8_array
   !>
   !> @param msgid   id of the grib loaded in memory
   !> @param key     key name
-  !> @param index   integer(4) index
+  !> @param kindex  integer(4) index
   !> @param value   real(4) value
   !> @param status  CODES_SUCCESS if OK, integer value on error
-subroutine codes_get_real4_element ( msgid, key, index,value, status )
+subroutine codes_get_real4_element ( msgid, key, kindex,value, status )
     integer(kind=kindOfInt),                     intent(in)  :: msgid
     character(len=*),                            intent(in)  :: key
-    integer(kind=kindOfInt),                     intent(in)  :: index
+    integer(kind=kindOfInt),                     intent(in)  :: kindex
     real(kind = kindOfFloat),                    intent(out) :: value
     integer(kind=kindOfInt),optional,            intent(out) :: status
 
-    call grib_get_real4_element ( msgid, key, index,value, status )
+    call grib_get_real4_element ( msgid, key, kindex,value, status )
 end subroutine codes_get_real4_element 
 
 
@@ -1885,17 +1910,17 @@ end subroutine codes_get_real4_element
   !>
   !> @param msgid      id of the grib loaded in memory
   !> @param key        key name
-  !> @param index      integer(4) index
+  !> @param kindex     integer(4) index
   !> @param value      real(8) value
   !> @param status     CODES_SUCCESS if OK, integer value on error
-subroutine codes_get_real8_element ( msgid, key, index,value, status )
+subroutine codes_get_real8_element ( msgid, key, kindex,value, status )
     integer(kind=kindOfInt),                     intent(in)  :: msgid
     character(len=*),                            intent(in)  :: key
-    integer(kind=kindOfInt),                     intent(in)  :: index
+    integer(kind=kindOfInt),                     intent(in)  :: kindex
     real(kind = kindOfDouble),                   intent(out) :: value
     integer(kind=kindOfInt),optional,            intent(out) :: status
 
-    call grib_get_real8_element ( msgid, key, index,value, status )
+    call grib_get_real8_element ( msgid, key, kindex,value, status )
 end subroutine codes_get_real8_element
 
 
@@ -1907,17 +1932,17 @@ end subroutine codes_get_real8_element
   !>
   !> @param msgid      id of the grib loaded in memory
   !> @param key        key name
-  !> @param index      integer(4) array indexes
+  !> @param kindex     integer(4) array indexes
   !> @param value      real(4) array value
   !> @param status     CODES_SUCCESS if OK, integer value on error
-subroutine codes_get_real4_elements ( msgid, key, index,value, status )
+subroutine codes_get_real4_elements ( msgid, key, kindex,value, status )
     integer(kind=kindOfInt),                  intent(in)  :: msgid
     character(len=*),                         intent(in)  :: key
-    integer(kind=kindOfInt),dimension(:),  intent(in)     :: index
+    integer(kind=kindOfInt),dimension(:),  intent(in)     :: kindex
     real(kind = kindOfFloat), dimension(:),   intent(out) :: value
     integer(kind=kindOfInt),optional,         intent(out) :: status
 
-    call grib_get_real4_elements ( msgid, key, index,value, status )
+    call grib_get_real4_elements ( msgid, key, kindex,value, status )
 end subroutine codes_get_real4_elements 
 
   !> Get the real(8) values whose indexes are stored in the array "index" from an array key.
@@ -1928,17 +1953,17 @@ end subroutine codes_get_real4_elements
   !>
   !> @param msgid      id of the grib loaded in memory
   !> @param key        key name
-  !> @param index      integer(4) array index
+  !> @param kindex     integer(4) array index
   !> @param value      real(8) array value
   !> @param status     CODES_SUCCESS if OK, integer value on error
-subroutine codes_get_real8_elements ( msgid, key, index,value, status )
+subroutine codes_get_real8_elements ( msgid, key, kindex,value, status )
     integer(kind=kindOfInt),                   intent(in)  :: msgid
     character(len=*),                          intent(in)  :: key
-    integer(kind=kindOfInt),dimension(:),   intent(in)     :: index
+    integer(kind=kindOfInt),dimension(:),   intent(in)     :: kindex
     real(kind = kindOfDouble), dimension(:),   intent(out) :: value
     integer(kind=kindOfInt),optional,          intent(out) :: status
 
-    call grib_get_real8_elements ( msgid, key, index,value, status )
+    call grib_get_real8_elements ( msgid, key, kindex,value, status )
 end subroutine codes_get_real8_elements 
 
   !> Set the integer value for a key in a message.
@@ -2334,12 +2359,12 @@ end subroutine codes_grib_find_nearest_multiple
   !> @param outlat     latitude of the nearest point
   !> @param outlon     longitude of the nearest point
   !> @param distance   distance between the given point and its nearest
-  !> @param index      zero based index
+  !> @param kindex     zero based index
   !> @param value      value of the field in the nearest point
   !> @param status     CODES_SUCCESS if OK, integer value on error
 subroutine codes_grib_find_nearest_single(gribid,is_lsm,  &
                  inlat,inlon,outlat,outlon,          &
-                 value,distance, index,status)
+                 value,distance, kindex,status)
     integer(kind=kindOfInt),   intent(in)   :: gribid
     logical,                   intent(in)   :: is_lsm
     real(kind = kindOfDouble), intent(in)   :: inlat
@@ -2348,12 +2373,12 @@ subroutine codes_grib_find_nearest_single(gribid,is_lsm,  &
     real(kind = kindOfDouble), intent(out)  :: outlon
     real(kind = kindOfDouble), intent(out)  :: distance
     real(kind = kindOfDouble), intent(out)  :: value
-    integer(kind = kindOfInt), intent(out)  :: index
+    integer(kind = kindOfInt), intent(out)  :: kindex
     integer(kind=kindOfInt),optional, intent(out)  :: status
 
     call grib_find_nearest_single(gribid,is_lsm,  &
                  inlat,inlon,outlat,outlon,       &
-                 value,distance, index,status)
+                 value,distance, kindex,status)
 end subroutine codes_grib_find_nearest_single
 
 
@@ -2370,12 +2395,12 @@ end subroutine codes_grib_find_nearest_single
   !> @param outlat     latitude of the nearest point
   !> @param outlon     longitude of the nearest point
   !> @param distance   distance between the given point and its nearest
-  !> @param index      zero based index
+  !> @param kindex     zero based index
   !> @param value      value of the field in the nearest point
   !> @param status     CODES_SUCCESS if OK, integer value on error
 subroutine codes_grib_find_nearest_four_single(gribid,is_lsm, &
                  inlat,inlon,outlat,outlon,              &
-                 value,distance, index,status)
+                 value,distance, kindex,status)
     integer(kind=kindOfInt),                  intent(in)    :: gribid
     logical,                                  intent(in)    :: is_lsm
     real(kind = kindOfDouble), intent(in)                   :: inlat
@@ -2384,12 +2409,12 @@ subroutine codes_grib_find_nearest_four_single(gribid,is_lsm, &
     real(kind = kindOfDouble), dimension(4), intent(out)    :: outlon
     real(kind = kindOfDouble), dimension(4), intent(out)    :: distance
     real(kind = kindOfDouble), dimension(4), intent(out)    :: value
-    integer(kind = kindOfInt), dimension(4), intent(out)    :: index
+    integer(kind = kindOfInt), dimension(4), intent(out)    :: kindex
     integer(kind=kindOfInt),optional, intent(out)           :: status
 
     call grib_find_nearest_four_single(gribid,is_lsm, &
                  inlat,inlon,outlat,outlon,           &
-                 value,distance, index,status)
+                 value,distance, kindex,status)
   end subroutine codes_grib_find_nearest_four_single
 
 
@@ -2548,6 +2573,63 @@ subroutine codes_set_samples_path ( path,  status )
 end subroutine codes_set_samples_path
 
 
+subroutine codes_julian_to_datetime ( jd,year,month,day,hour,minute,second,  status )
+    real(kind=kindOfDouble) , intent(in)          :: jd
+    integer(kind=kindOfLong) , intent(out)         :: year,month,day,hour,minute,second
+    integer(kind=kindOfInt),optional, intent(out)  :: status
+    integer(kind=kindOfInt)                        :: iret
 
-end module eccodes
+    iret=grib_f_julian_to_datetime(jd,year,month,day,hour,minute,second)
+    if (iret /= 0) then
+      if (present(status)) then
+         status = iret
+      else
+         call grib_check(iret,'codes_julian_to_datetime',' ')
+      endif
+      return
+    endif
+end subroutine codes_julian_to_datetime
 
+subroutine codes_datetime_to_julian ( year,month,day,hour,minute,second,jd, status )
+    integer(kind=kindOfLong) , intent(in) :: year,month,day,hour,minute,second
+    real (kind=kindOfDouble) , intent(out)  :: jd
+    integer(kind=kindOfInt),optional, intent(out)  :: status
+    integer(kind=kindOfInt)                        :: iret
+
+    iret=grib_f_datetime_to_julian(year,month,day,hour,minute,second,jd)
+    if (iret /= 0) then
+      if (present(status)) then
+         status = iret
+      else
+         call grib_check(iret,'codes_datetime_to_julian',' ')
+      endif
+      return
+    endif
+end subroutine codes_datetime_to_julian
+
+  !> Copy the value of a key from the source message to the destination message
+  !>
+  !> In case of error, if the status parameter (optional) is not given, the program will
+  !> exit with an error message.\n Otherwise the error message can be
+  !> gathered with @ref codes_get_error_string.
+  !>
+  !> @param msgid_src     source message
+  !> @param msgid_dest    destination message
+  !> @param key           key whose value is to be copied
+  !> @param status        GRIB_SUCCESS if OK, integer value on error
+subroutine codes_copy_key( msgid_src, key, msgid_dest, status )
+    integer(kind=kindOfInt),          intent(in)  :: msgid_src
+    integer(kind=kindOfInt),          intent(in)  :: msgid_dest
+    character(LEN=*),                 intent(in)  :: key
+    integer(kind=kindOfInt),optional, intent(out) :: status
+    integer(kind=kindOfInt)                       :: iret
+
+    iret=grib_f_copy_key(msgid_src, key, msgid_dest)
+    if (present(status)) then
+        status = iret
+    else
+        call grib_check(iret,'codes_copy_key','('//key//')')
+    endif
+end subroutine codes_copy_key 
+
+end module eccodes
diff --git a/fortran/eccodes_visibility.h b/fortran/eccodes_visibility.h
index 3c958d0..dbd69ae 100644
--- a/fortran/eccodes_visibility.h
+++ b/fortran/eccodes_visibility.h
@@ -27,3 +27,4 @@ public :: codes_clone, codes_copy_namespace
 public :: codes_index_get,codes_index_select,&
           codes_index_create,codes_index_get_size,codes_index_release,&
           codes_grib_util_sections_copy
+public :: codes_datetime_to_julian,codes_julian_to_datetime,codes_copy_key
diff --git a/fortran/grib_api_externals.h b/fortran/grib_api_externals.h
index fe43562..ffecc4a 100644
--- a/fortran/grib_api_externals.h
+++ b/fortran/grib_api_externals.h
@@ -33,7 +33,8 @@ integer, external :: grib_f_get_int, grib_f_get_long,grib_f_get_int_array, &
                      grib_f_get_real8, grib_f_get_real8_array, &
                      grib_f_get_real4_element, grib_f_get_real8_element, &
                      grib_f_get_real4_elements, grib_f_get_real8_elements, &
-					           grib_f_get_string,grib_f_get_string_array, &
+                     grib_f_get_string,grib_f_get_string_array, &
+                     codes_f_bufr_copy_data, &
                      grib_f_is_missing,grib_f_is_defined
 integer, external :: grib_f_new_from_index, &
                      grib_f_index_new_from_file, &
@@ -45,7 +46,7 @@ integer, external :: grib_f_new_from_index, &
                      grib_f_index_get_size_int, &
                      grib_f_index_get_int, &
                      grib_f_index_get_long, &
-					 grib_f_index_get_string, &
+                     grib_f_index_get_string, &
                      grib_f_index_get_real8, &
                      grib_f_index_select_real8, &
                      grib_f_index_select_string, &
@@ -67,3 +68,4 @@ integer, external :: grib_f_clone, grib_f_copy_namespace
 external :: grib_f_check
 integer, external :: grib_f_util_sections_copy
 integer, external :: grib_f_set_definitions_path, grib_f_set_samples_path
+integer, external :: grib_f_julian_to_datetime, grib_f_datetime_to_julian, grib_f_copy_key
diff --git a/fortran/grib_api_visibility.h b/fortran/grib_api_visibility.h
index 88a0d4e..ad34358 100644
--- a/fortran/grib_api_visibility.h
+++ b/fortran/grib_api_visibility.h
@@ -12,7 +12,7 @@ public :: grib_keys_iterator_get_name, &
           grib_keys_iterator_rewind
 public :: grib_new_from_message, &
           grib_new_from_samples, grib_new_from_file, &
-		  grib_read_from_file,grib_headers_only_new_from_file
+          grib_read_from_file,grib_headers_only_new_from_file
 public :: grib_release
 public :: grib_dump
 public :: grib_get_error_string
@@ -23,4 +23,4 @@ public :: grib_check
 public :: grib_clone, grib_copy_namespace
 public :: grib_index_get,grib_index_select,&
           grib_index_create,grib_index_get_size,grib_index_release,&
-		  grib_util_sections_copy
+          grib_util_sections_copy
diff --git a/fortran/grib_f77.c b/fortran/grib_f77.c
index 3f246e4..721130b 100644
--- a/fortran/grib_f77.c
+++ b/fortran/grib_f77.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/fortran/grib_f90_head.f90 b/fortran/grib_f90_head.f90
index f0e7306..1ff65f8 100644
--- a/fortran/grib_f90_head.f90
+++ b/fortran/grib_f90_head.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/fortran/grib_f90_int.f90 b/fortran/grib_f90_int.f90
index d0c8811..a88fdc8 100644
--- a/fortran/grib_f90_int.f90
+++ b/fortran/grib_f90_int.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/fortran/grib_f90_int_size_t.f90 b/fortran/grib_f90_int_size_t.f90
index b2ad367..128f461 100644
--- a/fortran/grib_f90_int_size_t.f90
+++ b/fortran/grib_f90_int_size_t.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/fortran/grib_f90_long_int.f90 b/fortran/grib_f90_long_int.f90
index e9d8dad..8e349bb 100644
--- a/fortran/grib_f90_long_int.f90
+++ b/fortran/grib_f90_long_int.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/fortran/grib_f90_long_size_t.f90 b/fortran/grib_f90_long_size_t.f90
index 08fea04..d898117 100644
--- a/fortran/grib_f90_long_size_t.f90
+++ b/fortran/grib_f90_long_size_t.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/fortran/grib_f90_tail.f90 b/fortran/grib_f90_tail.f90
index b8cd51f..a99cc92 100644
--- a/fortran/grib_f90_tail.f90
+++ b/fortran/grib_f90_tail.f90
@@ -1449,9 +1449,9 @@
       integer(kind=kindOfInt)                       :: iret
 
       iret=grib_f_release ( gribid )
-	  if (iret /= 0) then
-	    call grib_f_write_on_fail(gribid)
-	  endif
+      if (iret /= 0) then
+        call grib_f_write_on_fail(gribid)
+      endif
       if (present(status)) then
          status = iret
       else
@@ -1481,9 +1481,9 @@
       integer(kind=kindOfInt)                       :: iret
 
       iret=grib_f_clone(gribid_src,gribid_dest)
-	  if (iret /= 0) then
-	    call grib_f_write_on_fail(gribid_src)
-	  endif
+      if (iret /= 0) then
+        call grib_f_write_on_fail(gribid_src)
+      endif
       if (present(status)) then
          status = iret
       else
@@ -1495,14 +1495,14 @@
       integer(kind=kindOfInt),          intent(in)  :: gribid_from
       integer(kind=kindOfInt),          intent(in) :: gribid_to
       integer(kind=kindOfInt),          intent(out) :: gribid_out
-      integer(kind=kindOfInt),			intent(in) :: what
+      integer(kind=kindOfInt),          intent(in) :: what
       integer(kind=kindOfInt),optional, intent(out) :: status
       integer(kind=kindOfInt)                       :: iret
 
       iret=grib_f_util_sections_copy(gribid_from,gribid_to,what,gribid_out)
-	  if (iret /= 0) then
-	    call grib_f_write_on_fail(gribid_from)
-	  endif
+      if (iret /= 0) then
+        call grib_f_write_on_fail(gribid_from)
+      endif
       if (present(status)) then
          status = iret
       else
@@ -1519,7 +1519,6 @@
   !> gathered with @ref grib_get_error_string.
   !>
   !>
-  !>
   !> @param gribid_src     source message
   !> @param gribid_dest    destination message
   !> @param namespace      namespace to be copied
@@ -1582,9 +1581,9 @@
 
       npoints=size(lats)
       iret = grib_f_get_data_real4 ( gribid, lats, lons, values,npoints )
-	  if (iret /= 0) then
-	    call grib_f_write_on_fail(gribid)
-	  endif
+      if (iret /= 0) then
+        call grib_f_write_on_fail(gribid)
+      endif
       if (present(status)) then
          status = iret
       else
@@ -1618,9 +1617,9 @@
 
       npoints=size(lats)
       iret = grib_f_get_data_real8 ( gribid, lats, lons, values,npoints )
-	  if (iret /= 0) then
-	    call grib_f_write_on_fail(gribid)
-	  endif
+      if (iret /= 0) then
+        call grib_f_write_on_fail(gribid)
+      endif
       if (present(status)) then
          status = iret
       else
@@ -1806,9 +1805,9 @@
       integer(kind=kindOfInt)                       :: iret
 
       iret=grib_f_get_size_int ( gribid, key, size )
-	  if (iret /= 0) then
-	    call grib_f_write_on_fail(gribid)
-	  endif
+      if (iret /= 0) then
+        call grib_f_write_on_fail(gribid)
+      endif
       if (present(status)) then
          status = iret
       else
@@ -1864,9 +1863,9 @@
       integer(kind=kindOfInt)                       :: iret
 
       iret=grib_f_get_int ( gribid, key, value )
-	  if (iret /= 0) then
-	    call grib_f_write_on_fail(gribid)
-	  endif
+      if (iret /= 0) then
+        call grib_f_write_on_fail(gribid)
+      endif
       if (present(status)) then
          status = iret
       else
@@ -1892,9 +1891,9 @@
     integer(kind=kindOfInt)                       :: iret
 
     iret=grib_f_get_long ( gribid, key, value )
-	 if (iret /= 0) then
-	   call grib_f_write_on_fail(gribid)
-	 endif
+    if (iret /= 0) then
+       call grib_f_write_on_fail(gribid)
+    endif
     if (present(status)) then
       status = iret
     else
@@ -1920,9 +1919,9 @@
     integer(kind=kindOfInt)                       :: iret
 
     iret=grib_f_is_missing ( gribid, key, is_missing )
-	 if (iret /= 0) then
-	    call grib_f_write_on_fail(gribid)
-	 endif
+    if (iret /= 0) then
+      call grib_f_write_on_fail(gribid)
+    endif
     if (present(status)) then
     status = iret
     else
@@ -1948,9 +1947,9 @@
   integer(kind=kindOfInt)                       :: iret
 
     iret=grib_f_is_defined( gribid, key, is_defined )
-	 if (iret /= 0) then
-	    call grib_f_write_on_fail(gribid)
-	 endif
+    if (iret /= 0) then
+      call grib_f_write_on_fail(gribid)
+    endif
     if (present(status)) then
     status = iret
     else
@@ -1976,9 +1975,9 @@
       integer(kind=kindOfInt)                                  :: iret
 
       iret=grib_f_get_real4 ( gribid, key, value )
-	  if (iret /= 0) then
-	    call grib_f_write_on_fail(gribid)
-	  endif
+      if (iret /= 0) then
+        call grib_f_write_on_fail(gribid)
+      endif
       if (present(status)) then
          status = iret
       else
@@ -2004,9 +2003,9 @@
       integer(kind=kindOfInt)                           :: iret
 
       iret=grib_f_get_real8 ( gribid, key, value )
-	  if (iret /= 0) then
-	    call grib_f_write_on_fail(gribid)
-	  endif
+      if (iret /= 0) then
+        call grib_f_write_on_fail(gribid)
+      endif
       if (present(status)) then
          status = iret
       else
@@ -2032,9 +2031,9 @@
       integer(kind=kindOfInt)                       :: iret
 
       iret=grib_f_get_string ( gribid, key, value )
-	  if (iret /= 0) then
-	    call grib_f_write_on_fail(gribid)
-	  endif
+      if (iret /= 0) then
+        call grib_f_write_on_fail(gribid)
+      endif
       if (present(status)) then
          status = iret
       else
@@ -2064,9 +2063,9 @@
 
       nb_values = size(value)
       iret=grib_f_get_int_array ( gribid, key, value , nb_values )
-	  if (iret /= 0) then
-	    call grib_f_write_on_fail(gribid)
-	  endif
+      if (iret /= 0) then
+        call grib_f_write_on_fail(gribid)
+      endif
       if (present(status)) then
          status = iret
       else
@@ -2094,9 +2093,9 @@
 
     nb_values = size(value)
     iret=grib_f_get_long_array ( gribid, key, value , nb_values )
-	if (iret /= 0) then
-	  call grib_f_write_on_fail(gribid)
-	endif
+    if (iret /= 0) then
+      call grib_f_write_on_fail(gribid)
+    endif
     if (present(status)) then
       status = iret
     else
@@ -2162,9 +2161,9 @@
 
       nb_values = size(value)
       iret=grib_f_get_real4_array ( gribid, key, value , nb_values )
-	  if (iret /= 0) then
-	    call grib_f_write_on_fail(gribid)
-	  endif
+      if (iret /= 0) then
+        call grib_f_write_on_fail(gribid)
+      endif
       if (present(status)) then
         status = iret
       else
@@ -2192,9 +2191,9 @@
 
       nb_values = size(value)
       iret=grib_f_get_real8_array ( gribid, key, value, nb_values )
-	  if (iret /= 0) then
-	    call grib_f_write_on_fail(gribid)
-	  endif
+      if (iret /= 0) then
+        call grib_f_write_on_fail(gribid)
+      endif
       if (present(status)) then
          status = iret
       else
@@ -2209,22 +2208,22 @@
   !> gathered with @ref grib_get_error_string.
   !>
   !> @param gribid      id of the grib loaded in memory
-  !> @param key     key name
-  !> @param index       integer(4) index
+  !> @param key         key name
+  !> @param kindex      integer(4) index
   !> @param value       real(4) value
-  !> @param status       GRIB_SUCCESS if OK, integer value on error
-  subroutine grib_get_real4_element ( gribid, key, index,value, status )
+  !> @param status      GRIB_SUCCESS if OK, integer value on error
+  subroutine grib_get_real4_element ( gribid, key, kindex,value, status )
       integer(kind=kindOfInt),                     intent(in)  :: gribid
       character(len=*),                            intent(in)  :: key
-      integer(kind=kindOfInt),                       intent(in)  :: index
-      real(kind = kindOfFloat),intent(out) :: value
+      integer(kind=kindOfInt),                     intent(in)  :: kindex
+      real(kind = kindOfFloat),intent(out)                     :: value
       integer(kind=kindOfInt),optional,            intent(out) :: status
       integer(kind=kindOfInt)                                  :: iret
 
-      iret=grib_f_get_real4_element ( gribid, key, index,value )
-	  if (iret /= 0) then
-	    call grib_f_write_on_fail(gribid)
-	  endif
+      iret=grib_f_get_real4_element ( gribid, key, kindex,value )
+      if (iret /= 0) then
+        call grib_f_write_on_fail(gribid)
+      endif
       if (present(status)) then
          status = iret
       else
@@ -2238,23 +2237,23 @@
   !> exit with an error message.\n Otherwise the error message can be
   !> gathered with @ref grib_get_error_string.
   !>
-  !> @param gribid      id of the grib loaded in memory
-  !> @param key     key name
-  !> @param index       integer(4) index
-  !> @param value       real(8) value
-  !> @param status       GRIB_SUCCESS if OK, integer value on error
-  subroutine grib_get_real8_element ( gribid, key, index,value, status )
+  !> @param gribid    id of the grib loaded in memory
+  !> @param key       key name
+  !> @param kindex    integer(4) index
+  !> @param value     real(8) value
+  !> @param status    GRIB_SUCCESS if OK, integer value on error
+  subroutine grib_get_real8_element ( gribid, key, kindex,value, status )
       integer(kind=kindOfInt),                     intent(in)  :: gribid
       character(len=*),                            intent(in)  :: key
-      integer(kind=kindOfInt),                  intent(in)  :: index
+      integer(kind=kindOfInt),                     intent(in)  :: kindex
       real(kind = kindOfDouble),                   intent(out) :: value
       integer(kind=kindOfInt),optional,            intent(out) :: status
       integer(kind=kindOfInt)                                  :: iret
 
-      iret=grib_f_get_real8_element ( gribid, key, index,value )
-	  if (iret /= 0) then
-	    call grib_f_write_on_fail(gribid)
-	  endif
+      iret=grib_f_get_real8_element ( gribid, key, kindex,value )
+      if (iret /= 0) then
+        call grib_f_write_on_fail(gribid)
+      endif
       if (present(status)) then
          status = iret
       else
@@ -2268,25 +2267,25 @@
   !> exit with an error message.\n Otherwise the error message can be
   !> gathered with @ref grib_get_error_string.
   !>
-  !> @param gribid      id of the grib loaded in memory
-  !> @param key     key name
-  !> @param index       integer(4) array indexes
-  !> @param value       real(4) array value
-  !> @param status       GRIB_SUCCESS if OK, integer value on error
-  subroutine grib_get_real4_elements ( gribid, key, index,value, status )
+  !> @param gribid   id of the grib loaded in memory
+  !> @param key      key name
+  !> @param kindex   integer(4) array indexes
+  !> @param value    real(4) array value
+  !> @param status   GRIB_SUCCESS if OK, integer value on error
+  subroutine grib_get_real4_elements ( gribid, key, kindex, value, status )
       integer(kind=kindOfInt),                  intent(in)  :: gribid
       character(len=*),                         intent(in)  :: key
-      integer(kind=kindOfInt),dimension(:),  intent(in)  :: index
+      integer(kind=kindOfInt),dimension(:),     intent(in)  :: kindex
       real(kind = kindOfFloat), dimension(:),   intent(out) :: value
       integer(kind=kindOfInt),optional,         intent(out) :: status
       integer(kind=kindOfInt)                               :: iret
       integer(kind=kindOfInt)                               ::npoints
 
       npoints=size(value)
-      iret=grib_f_get_real4_elements ( gribid, key, index,value,npoints )
-	  if (iret /= 0) then
-	    call grib_f_write_on_fail(gribid)
-	  endif
+      iret=grib_f_get_real4_elements ( gribid, key, kindex,value,npoints )
+      if (iret /= 0) then
+        call grib_f_write_on_fail(gribid)
+      endif
       if (present(status)) then
          status = iret
       else
@@ -2300,25 +2299,25 @@
   !> exit with an error message.\n Otherwise the error message can be
   !> gathered with @ref grib_get_error_string.
   !>
-  !> @param gribid      id of the grib loaded in memory
-  !> @param key     key name
-  !> @param index       integer(4) array index
-  !> @param value       real(8) array value
-  !> @param status       GRIB_SUCCESS if OK, integer value on error
-  subroutine grib_get_real8_elements ( gribid, key, index,value, status )
+  !> @param gribid   id of the grib loaded in memory
+  !> @param key      key name
+  !> @param kindex   integer(4) array index
+  !> @param value    real(8) array value
+  !> @param status   GRIB_SUCCESS if OK, integer value on error
+  subroutine grib_get_real8_elements ( gribid, key, kindex, value, status )
       integer(kind=kindOfInt),                   intent(in)  :: gribid
       character(len=*),                          intent(in)  :: key
-      integer(kind=kindOfInt),dimension(:),   intent(in)  :: index
+      integer(kind=kindOfInt),dimension(:),      intent(in)  :: kindex
       real(kind = kindOfDouble), dimension(:),   intent(out) :: value
       integer(kind=kindOfInt),optional,          intent(out) :: status
       integer(kind=kindOfInt)                                :: iret
       integer(kind=kindOfInt)                                :: npoints
 
       npoints=size(value)
-      iret=grib_f_get_real8_elements ( gribid, key, index,value,npoints )
-	  if (iret /= 0) then
-	    call grib_f_write_on_fail(gribid)
-	  endif
+      iret=grib_f_get_real8_elements ( gribid, key, kindex,value,npoints )
+      if (iret /= 0) then
+        call grib_f_write_on_fail(gribid)
+      endif
       if (present(status)) then
          status = iret
       else
@@ -2344,9 +2343,9 @@
       integer(kind=kindOfInt)                       :: iret
 
       iret=grib_f_set_int ( gribid, key, value )
-	  if (iret /= 0) then
-	    call grib_f_write_on_fail(gribid)
-	  endif
+      if (iret /= 0) then
+        call grib_f_write_on_fail(gribid)
+      endif
       if (present(status)) then
          status = iret
       else
@@ -2400,9 +2399,9 @@
       integer(kind=kindOfInt)                              :: iret
 
       iret=grib_f_set_real4 ( gribid, key, value )
-	  if (iret /= 0) then
-	    call grib_f_write_on_fail(gribid)
-	  endif
+      if (iret /= 0) then
+        call grib_f_write_on_fail(gribid)
+      endif
       if (present(status)) then
          status = iret
       else
@@ -2428,9 +2427,9 @@
       integer(kind=kindOfInt)                               :: iret
 
       iret=grib_f_set_real8 ( gribid, key, value )
-	  if (iret /= 0) then
-	    call grib_f_write_on_fail(gribid)
-	  endif
+      if (iret /= 0) then
+        call grib_f_write_on_fail(gribid)
+      endif
       if (present(status)) then
          status = iret
       else
@@ -2458,9 +2457,9 @@
 
       nb_values = size(value)
       iret=grib_f_set_int_array ( gribid, key, value, nb_values )
-	  if (iret /= 0) then
-	    call grib_f_write_on_fail(gribid)
-	  endif
+      if (iret /= 0) then
+        call grib_f_write_on_fail(gribid)
+      endif
       if (present(status)) then
          status = iret
       else
@@ -2488,9 +2487,9 @@
 
     nb_values = size(value)
     iret=grib_f_set_long_array ( gribid, key, value, nb_values )
-	  if (iret /= 0) then
-	    call grib_f_write_on_fail(gribid)
-	  endif
+    if (iret /= 0) then
+      call grib_f_write_on_fail(gribid)
+    endif
     if (present(status)) then
       status = iret
     else
@@ -2556,9 +2555,9 @@
 
       nb_values = size(value)
       iret=grib_f_set_real4_array ( gribid, key, value, nb_values )
-	  if (iret /= 0) then
-	    call grib_f_write_on_fail(gribid)
-	  endif
+      if (iret /= 0) then
+        call grib_f_write_on_fail(gribid)
+      endif
       if (present(status)) then
          status = iret
       else
@@ -2586,9 +2585,9 @@
 
       nb_values = size(value)
       iret=grib_f_set_real8_array ( gribid, key, value, nb_values )
-	  if (iret /= 0) then
-	    call grib_f_write_on_fail(gribid)
-	  endif
+      if (iret /= 0) then
+        call grib_f_write_on_fail(gribid)
+      endif
       if (present(status)) then
          status = iret
       else
@@ -2617,9 +2616,9 @@
 
       nb_values = size(value)
       iret=grib_f_set_force_real4_array ( gribid, key, value, nb_values )
-	  if (iret /= 0) then
-	    call grib_f_write_on_fail(gribid)
-	  endif
+      if (iret /= 0) then
+        call grib_f_write_on_fail(gribid)
+      endif
       if (present(status)) then
          status = iret
       else
@@ -2648,9 +2647,9 @@
 
       nb_values = size(value)
       iret=grib_f_set_force_real8_array ( gribid, key, value, nb_values )
-	  if (iret /= 0) then
-	    call grib_f_write_on_fail(gribid)
-	  endif
+      if (iret /= 0) then
+        call grib_f_write_on_fail(gribid)
+      endif
       if (present(status)) then
          status = iret
       else
@@ -2676,9 +2675,9 @@
       integer(kind=kindOfInt)                                   :: iret
 
       iret=grib_f_set_string  ( gribid, key, value )
-	  if (iret /= 0) then
-	    call grib_f_write_on_fail(gribid)
-	  endif
+      if (iret /= 0) then
+        call grib_f_write_on_fail(gribid)
+      endif
       if (present(status)) then
          status = iret
       else
@@ -2707,9 +2706,9 @@
         iret = GRIB_MESSAGE_TOO_LARGE
       endif
       nbytes = ibytes
-	  if (iret /= 0) then
-	    call grib_f_write_on_fail(gribid)
-	  endif
+      if (iret /= 0) then
+        call grib_f_write_on_fail(gribid)
+      endif
       if (present(status)) then
          status = iret
       else
@@ -2733,9 +2732,9 @@
       integer(kind=kindOfInt)                                   :: iret
 
       iret=grib_f_get_message_size ( gribid, nbytes )
-	  if (iret /= 0) then
-	    call grib_f_write_on_fail(gribid)
-	  endif
+      if (iret /= 0) then
+        call grib_f_write_on_fail(gribid)
+      endif
       if (present(status)) then
          status = iret
       else
@@ -2905,12 +2904,12 @@
   !> @param outlat     latitude of the nearest point
   !> @param outlon     longitude of the nearest point
   !> @param distance   distance between the given point and its nearest
-  !> @param index      zero based index
+  !> @param kindex     zero based index
   !> @param value      value of the field in the nearest point
   !> @param status     GRIB_SUCCESS if OK, integer value on error
-  subroutine grib_find_nearest_single(gribid,is_lsm,                  &
-                 inlat,inlon,outlat,outlon,              &
-                 value,distance, index,status)
+  subroutine grib_find_nearest_single(gribid, is_lsm,       &
+                 inlat, inlon, outlat, outlon,              &
+                 value, distance, kindex, status)
     integer(kind=kindOfInt),                                  intent(in)    :: gribid
     logical,                                  intent(in)    :: is_lsm
     real(kind = kindOfDouble), intent(in)    :: inlat
@@ -2919,14 +2918,14 @@
     real(kind = kindOfDouble), intent(out)   :: outlon
     real(kind = kindOfDouble), intent(out)   :: distance
     real(kind = kindOfDouble), intent(out)   :: value
-    integer(kind = kindOfInt), intent(out)  :: index
+    integer(kind = kindOfInt), intent(out)   :: kindex
     integer(kind=kindOfInt),optional, intent(out)                           :: status
     integer(kind=kindOfInt)                                                 :: iret
     integer(kind=kindOfInt) :: intis_lsm =0
 
     if (is_lsm) intis_lsm=1
     iret=grib_f_find_nearest_single(gribid,intis_lsm,inlat,inlon,outlat,outlon, &
-      value,distance,index)
+      value,distance,kindex)
 
     if (present(status)) then
          status = iret
@@ -2948,21 +2947,21 @@
   !> @param outlat     latitude of the nearest point
   !> @param outlon     longitude of the nearest point
   !> @param distance   distance between the given point and its nearest
-  !> @param index      zero based index
+  !> @param kindex     zero based index
   !> @param value      value of the field in the nearest point
   !> @param status     GRIB_SUCCESS if OK, integer value on error
   subroutine grib_find_nearest_four_single(gribid,is_lsm, &
                  inlat,inlon,outlat,outlon,               &
-                 value,distance, index,status)
+                 value,distance, kindex,status)
     integer(kind=kindOfInt),                                  intent(in)    :: gribid
-    logical,                                  intent(in)    :: is_lsm
-    real(kind = kindOfDouble), intent(in)    :: inlat
-    real(kind = kindOfDouble), intent(in)    :: inlon
+    logical,                                  intent(in)   :: is_lsm
+    real(kind = kindOfDouble), intent(in)                  :: inlat
+    real(kind = kindOfDouble), intent(in)                  :: inlon
     real(kind = kindOfDouble), dimension(4), intent(out)   :: outlat
     real(kind = kindOfDouble), dimension(4), intent(out)   :: outlon
     real(kind = kindOfDouble), dimension(4), intent(out)   :: distance
     real(kind = kindOfDouble), dimension(4), intent(out)   :: value
-    integer(kind = kindOfInt), dimension(4), intent(out)  :: index
+    integer(kind = kindOfInt), dimension(4), intent(out)   :: kindex
     integer(kind=kindOfInt),optional, intent(out)                           :: status
     integer(kind=kindOfInt)                                                 :: iret
     integer(kind=kindOfInt) :: intis_lsm =0
@@ -2970,7 +2969,7 @@
     if (is_lsm) intis_lsm=1
 
     iret=grib_f_find_nearest_four_single(gribid,intis_lsm,inlat,inlon,outlat,outlon, &
-      value,distance,index)
+      value,distance,kindex)
 
     if (present(status)) then
        status = iret
diff --git a/fortran/grib_fortran.c b/fortran/grib_fortran.c
index 942c62a..9c4e077 100644
--- a/fortran/grib_fortran.c
+++ b/fortran/grib_fortran.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -1364,6 +1364,27 @@ int grib_f_clone(int* gidsrc,int* giddest){
 }
 
 /*****************************************************************************/
+int grib_f_copy_key_(int* gidsrc, char* key, int* giddest, int len)
+{
+    grib_handle *src  = get_handle(*gidsrc);
+    grib_handle *dest = get_handle(*giddest);
+
+    if(src && dest) {
+        char buf[1024]={0,};
+        char* ckey = (char*)key;
+        const int type = GRIB_TYPE_UNDEFINED; /* will be computed */
+        return codes_copy_key(src, dest, cast_char(buf,ckey,len), type);
+    }
+
+    return GRIB_INVALID_GRIB;
+}
+int grib_f_copy_key__(int* gidsrc, char* name, int* giddest, int len){
+    return grib_f_copy_key_(gidsrc, name, giddest, len);
+}
+int grib_f_copy_key(int* gidsrc, char* name, int* giddest, int len){
+    return grib_f_copy_key_(gidsrc, name, giddest, len);
+}
+/*****************************************************************************/
 int grib_f_util_sections_copy_(int* gidfrom,int* gidto,int* what,int *gidout){
     int err=0;
     grib_handle *hfrom  = get_handle(*gidfrom);
@@ -2771,19 +2792,29 @@ int grib_f_get_string_array(int* gid, char* key, char* val,int* nvals,int* slen,
     return  grib_f_get_string_array_( gid,  key,  val, nvals, slen, len);
 }
 
-
 /*****************************************************************************/
-/* Strip whitespace from the end of a string */
-static void rtrim(char* s)
+int codes_f_bufr_copy_data_(int* gid1,int* gid2)
 {
-    size_t len = 0;
-    if (!s) return;
-    len = strlen(s);
-    while (len > 0 && isspace((unsigned char)s[len - 1]))
-        len--;
-    s[len] = '\0';
+    grib_handle *hin = get_handle(*gid1);
+    grib_handle *hout = get_handle(*gid2);
+    int err = GRIB_SUCCESS;
+
+    if(!hin || !hout ) return  GRIB_INVALID_GRIB;
+
+    err=codes_bufr_copy_data(hin,hout);
+    if (err) return err;
+
+    return  err;
+}
+int codes_f_bufr_copy_data__(int* gid1,int* gid2){
+    return  codes_f_bufr_copy_data_(gid1, gid2);
+}
+int codes_f_bufr_copy_data(int* gid1,int* gid2){
+    return  codes_f_bufr_copy_data_(gid1, gid2);
 }
 
+
+/*****************************************************************************/
 int grib_f_set_string_array_(int* gid, char* key, char* val,int* nvals,int* slen,int len)
 {
     grib_handle *h = get_handle(*gid);
@@ -3082,3 +3113,24 @@ int grib_f_set_samples_path__(char* path,  int len){
 int grib_f_set_samples_path(char* path,  int len){
     return grib_f_set_samples_path_(path, len);
 }
+
+int grib_f_julian_to_datetime(double* jd,long* year,long* month,long* day,long *hour,long *minute,long *second) {
+    return grib_julian_to_datetime(*jd,year,month,day,hour,minute,second);
+}
+int grib_f_julian_to_datetime_(double* jd,long* year,long* month,long* day,long *hour,long *minute,long *second) {
+    return grib_julian_to_datetime(*jd,year,month,day,hour,minute,second);
+}
+int grib_f_julian_to_datetime__(double* jd,long* year,long* month,long* day,long *hour,long *minute,long *second) {
+    return grib_julian_to_datetime(*jd,year,month,day,hour,minute,second);
+}
+
+int grib_f_datetime_to_julian(long* year,long* month,long* day, long* hour,long* minute,long* second,double* jd) {
+    return grib_datetime_to_julian(*year,*month,*day,*hour,*minute,*second,jd);
+}
+int grib_f_datetime_to_julian_(long* year,long* month,long* day, long* hour,long* minute,long* second,double* jd) {
+    return grib_datetime_to_julian(*year,*month,*day,*hour,*minute,*second,jd);
+}
+int grib_f_datetime_to_julian__(long* year,long* month,long* day, long* hour,long* minute,long* second,double* jd) {
+    return grib_datetime_to_julian(*year,*month,*day,*hour,*minute,*second,jd);
+}
+
diff --git a/fortran/grib_fortran_kinds.c b/fortran/grib_fortran_kinds.c
index 0433fdc..034d235 100644
--- a/fortran/grib_fortran_kinds.c
+++ b/fortran/grib_fortran_kinds.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/fortran/grib_fortran_prototypes.h b/fortran/grib_fortran_prototypes.h
index 1cb3093..b399697 100644
--- a/fortran/grib_fortran_prototypes.h
+++ b/fortran/grib_fortran_prototypes.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -109,6 +109,11 @@ int grib_f_util_sections_copy(int *gidfrom, int *gidto, int *what, int *gidout);
 int grib_f_copy_namespace_(int *gidsrc, char *name, int *giddest, int len);
 int grib_f_copy_namespace__(int *gidsrc, char *name, int *giddest, int len);
 int grib_f_copy_namespace(int *gidsrc, char *name, int *giddest, int len);
+
+int grib_f_copy_key_ (int *gidsrc, char *name, int *giddest, int len);
+int grib_f_copy_key__(int *gidsrc, char *name, int *giddest, int len);
+int grib_f_copy_key  (int *gidsrc, char *name, int *giddest, int len);
+
 int grib_f_count_in_file(int *fid, int *n);
 int grib_f_count_in_file_(int *fid, int *n);
 int grib_f_count_in_file__(int *fid, int *n);
diff --git a/fortran/grib_types.f90 b/fortran/grib_types.f90
index fab3e56..de7d5a8 100644
--- a/fortran/grib_types.f90
+++ b/fortran/grib_types.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/fortran/same_int_long.f90 b/fortran/same_int_long.f90
index a7e3273..9a54380 100644
--- a/fortran/same_int_long.f90
+++ b/fortran/same_int_long.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/fortran/same_int_size_t.f90 b/fortran/same_int_size_t.f90
index 3c2a4ea..dd61169 100644
--- a/fortran/same_int_size_t.f90
+++ b/fortran/same_int_size_t.f90
@@ -1,4 +1,4 @@
-! Copyright 2005-2016 ECMWF.
+! Copyright 2005-2017 ECMWF.
 !
 ! This software is licensed under the terms of the Apache Licence Version 2.0
 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/html/annotated.html b/html/annotated.html
index bc69154..468a636 100644
--- a/html/annotated.html
+++ b/html/annotated.html
@@ -86,31 +86,36 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 <div class="contents">
 <div class="textblock">Here are the data structures with brief descriptions:</div><div class="directory">
 <div class="levels">[detail level <span onclick="javascript:toggleLevel(1);">1</span><span onclick="javascript:toggleLevel(2);">2</span>]</div><table class="directory">
-<tr id="row_0_" class="even"><td class="entry"><img id="arr_0_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('0_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><a class="el" href="namespaceec_codes.html" target="_self">ecCodes</a></td><td class="desc">This package is the <b>Python</b> interface to <a class="el" href="namespaceec_codes.html" title="This package is the Python interface to ecCodes. ">ecCodes</a> </td></tr>
-<tr id="row_0_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classec_codes_1_1_codes_internal_error.html" target="_self">CodesInternalError</a></td><td class="desc">Wrap errors coming from the C API in a Python exception object </td></tr>
-<tr id="row_1_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structcodes__context.html" target="_self">codes_context</a></td><td class="desc"></td></tr>
-<tr id="row_2_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structcodes__handle.html" target="_self">codes_handle</a></td><td class="desc"></td></tr>
-<tr id="row_3_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structcodes__index.html" target="_self">codes_index</a></td><td class="desc"></td></tr>
-<tr id="row_4_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structcodes__iterator.html" target="_self">codes_iterator</a></td><td class="desc"></td></tr>
-<tr id="row_5_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structcodes__keys__iterator.html" target="_self">codes_keys_iterator</a></td><td class="desc"></td></tr>
-<tr id="row_6_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structcodes__multi__handle.html" target="_self">codes_multi_handle</a></td><td class="desc"></td></tr>
-<tr id="row_7_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structcodes__nearest.html" target="_self">codes_nearest</a></td><td class="desc"></td></tr>
-<tr id="row_8_"><td class="entry"><img id="arr_8_" src="ftv2mlastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('8_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classeccodes.html" target="_self">eccodes</a></td><td class="desc">Module eccodes<br/>
+<tr id="row_0_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2ns.png" alt="N" width="24" height="22" /><a class="el" href="namespaceec_codes.html" target="_self">ecCodes</a></td><td class="desc">This package is the <b>Python</b> interface to <a class="el" href="namespaceec_codes.html" title="This package is the Python interface to ecCodes. ">ecCodes</a> </td></tr>
+<tr id="row_1_"><td class="entry"><img id="arr_1_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('1_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>high_level_api</b></td><td class="desc"></td></tr>
+<tr id="row_1_0_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classhigh__level__api_1_1_test_grib_file.html" target="_self">TestGribFile</a></td><td class="desc">Test GribFile functionality </td></tr>
+<tr id="row_1_1_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classhigh__level__api_1_1_test_grib_message.html" target="_self">TestGribMessage</a></td><td class="desc">Test GribMessage functionality </td></tr>
+<tr id="row_1_2_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classhigh__level__api_1_1_test_grib_index.html" target="_self">TestGribIndex</a></td><td class="desc">Test GribIndex functionality </td></tr>
+<tr id="row_1_3_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classhigh__level__api_1_1_test_bufr_file.html" target="_self">TestBufrFile</a></td><td class="desc">Test BufrFile functionality </td></tr>
+<tr id="row_1_4_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classhigh__level__api_1_1_test_bufr_message.html" target="_self">TestBufrMessage</a></td><td class="desc">Test BufrMessage functionality </td></tr>
+<tr id="row_2_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structcodes__context.html" target="_self">codes_context</a></td><td class="desc"></td></tr>
+<tr id="row_3_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structcodes__handle.html" target="_self">codes_handle</a></td><td class="desc"></td></tr>
+<tr id="row_4_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structcodes__index.html" target="_self">codes_index</a></td><td class="desc"></td></tr>
+<tr id="row_5_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structcodes__iterator.html" target="_self">codes_iterator</a></td><td class="desc"></td></tr>
+<tr id="row_6_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structcodes__keys__iterator.html" target="_self">codes_keys_iterator</a></td><td class="desc"></td></tr>
+<tr id="row_7_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structcodes__multi__handle.html" target="_self">codes_multi_handle</a></td><td class="desc"></td></tr>
+<tr id="row_8_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structcodes__nearest.html" target="_self">codes_nearest</a></td><td class="desc"></td></tr>
+<tr id="row_9_" class="even"><td class="entry"><img id="arr_9_" src="ftv2mlastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('9_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classeccodes.html" target="_self">eccodes</a></td><td class="desc">Module eccodes<br/>
  This is the <b>Fortran90</b> interface for <a class="el" href="namespaceec_codes.html" title="This package is the Python interface to ecCodes. ">ecCodes</a> </td></tr>
-<tr id="row_8_0_" class="even"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="interfaceeccodes_1_1codes__get.html" target="_self">codes_get</a></td><td class="desc">Get the value for a key from a grib message </td></tr>
-<tr id="row_8_1_"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="interfaceeccodes_1_1codes__get__element.html" target="_self">codes_get_element</a></td><td class="desc">Get a value of specified index from an array key </td></tr>
-<tr id="row_8_2_" class="even"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="interfaceeccodes_1_1codes__get__message__size.html" target="_self">codes_get_message_size</a></td><td class="desc">Get the size of a coded message </td></tr>
-<tr id="row_8_3_"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="interfaceeccodes_1_1codes__get__size.html" target="_self">codes_get_size</a></td><td class="desc">Get the size of an array key </td></tr>
-<tr id="row_8_4_" class="even"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="interfaceeccodes_1_1codes__grib__find__nearest.html" target="_self">codes_grib_find_nearest</a></td><td class="desc">Find the nearest point/points of a given latitude/longitude point </td></tr>
-<tr id="row_8_5_"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="interfaceeccodes_1_1codes__grib__get__data.html" target="_self">codes_grib_get_data</a></td><td class="desc">Get latitude/longitude and data values </td></tr>
-<tr id="row_8_6_" class="even"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="interfaceeccodes_1_1codes__index__get.html" target="_self">codes_index_get</a></td><td class="desc">Get the distinct values of the key in argument contained in the index </td></tr>
-<tr id="row_8_7_"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="interfaceeccodes_1_1codes__index__get__size.html" target="_self">codes_index_get_size</a></td><td class="desc">Get the number of distinct values of the key in argument contained in the index </td></tr>
-<tr id="row_8_8_" class="even"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="interfaceeccodes_1_1codes__index__select.html" target="_self">codes_index_select</a></td><td class="desc">Select the message subset with key==value </td></tr>
-<tr id="row_8_9_"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="interfaceeccodes_1_1codes__new__from__message.html" target="_self">codes_new_from_message</a></td><td class="desc">Create a new message in memory from an integer or character array containting the coded message </td></tr>
-<tr id="row_8_10_" class="even"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="interfaceeccodes_1_1codes__read__bytes.html" target="_self">codes_read_bytes</a></td><td class="desc">Reads nbytes bytes into the buffer from a file opened with codes_open_file </td></tr>
-<tr id="row_8_11_"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="interfaceeccodes_1_1codes__read__from__file.html" target="_self">codes_read_from_file</a></td><td class="desc">Reads a message in the buffer array from the file opened with codes_open_file </td></tr>
-<tr id="row_8_12_" class="even"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="interfaceeccodes_1_1codes__set.html" target="_self">codes_set</a></td><td class="desc">Set the value for a key in a grib message </td></tr>
-<tr id="row_8_13_"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="interfaceeccodes_1_1codes__write__bytes.html" target="_self">codes_write_bytes</a></td><td class="desc">Write nbytes bytes from the buffer in a file opened with codes_open_file </td></tr>
+<tr id="row_9_0_"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="interfaceeccodes_1_1codes__get.html" target="_self">codes_get</a></td><td class="desc">Get the value for a key from a grib message </td></tr>
+<tr id="row_9_1_" class="even"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="interfaceeccodes_1_1codes__get__element.html" target="_self">codes_get_element</a></td><td class="desc">Get a value of specified index from an array key </td></tr>
+<tr id="row_9_2_"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="interfaceeccodes_1_1codes__get__message__size.html" target="_self">codes_get_message_size</a></td><td class="desc">Get the size of a coded message </td></tr>
+<tr id="row_9_3_" class="even"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="interfaceeccodes_1_1codes__get__size.html" target="_self">codes_get_size</a></td><td class="desc">Get the size of an array key </td></tr>
+<tr id="row_9_4_"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="interfaceeccodes_1_1codes__grib__find__nearest.html" target="_self">codes_grib_find_nearest</a></td><td class="desc">Find the nearest point/points of a given latitude/longitude point </td></tr>
+<tr id="row_9_5_" class="even"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="interfaceeccodes_1_1codes__grib__get__data.html" target="_self">codes_grib_get_data</a></td><td class="desc">Get latitude/longitude and data values </td></tr>
+<tr id="row_9_6_"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="interfaceeccodes_1_1codes__index__get.html" target="_self">codes_index_get</a></td><td class="desc">Get the distinct values of the key in argument contained in the index </td></tr>
+<tr id="row_9_7_" class="even"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="interfaceeccodes_1_1codes__index__get__size.html" target="_self">codes_index_get_size</a></td><td class="desc">Get the number of distinct values of the key in argument contained in the index </td></tr>
+<tr id="row_9_8_"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="interfaceeccodes_1_1codes__index__select.html" target="_self">codes_index_select</a></td><td class="desc">Select the message subset with key==value </td></tr>
+<tr id="row_9_9_" class="even"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="interfaceeccodes_1_1codes__new__from__message.html" target="_self">codes_new_from_message</a></td><td class="desc">Create a new message in memory from an integer or character array containting the coded message </td></tr>
+<tr id="row_9_10_"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="interfaceeccodes_1_1codes__read__bytes.html" target="_self">codes_read_bytes</a></td><td class="desc">Reads nbytes bytes into the buffer from a file opened with codes_open_file </td></tr>
+<tr id="row_9_11_" class="even"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="interfaceeccodes_1_1codes__read__from__file.html" target="_self">codes_read_from_file</a></td><td class="desc">Reads a message in the buffer array from the file opened with codes_open_file </td></tr>
+<tr id="row_9_12_"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="interfaceeccodes_1_1codes__set.html" target="_self">codes_set</a></td><td class="desc">Set the value for a key in a grib message </td></tr>
+<tr id="row_9_13_" class="even"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="interfaceeccodes_1_1codes__write__bytes.html" target="_self">codes_write_bytes</a></td><td class="desc">Write nbytes bytes from the buffer in a file opened with codes_open_file </td></tr>
 </table>
 </div><!-- directory -->
 </div><!-- contents -->
diff --git a/html/classec_codes_1_1_codes_internal_error.html b/html/classec_codes_1_1_codes_internal_error.html
deleted file mode 100644
index e22d1e0..0000000
--- a/html/classec_codes_1_1_codes_internal_error.html
+++ /dev/null
@@ -1,109 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.5"/>
-<title>eccodes: CodesInternalError Class Reference</title>
-<link href="tabs.css" rel="stylesheet" type="text/css"/>
-<script type="text/javascript" src="jquery.js"></script>
-<script type="text/javascript" src="dynsections.js"></script>
-<link href="search/search.css" rel="stylesheet" type="text/css"/>
-<script type="text/javascript" src="search/search.js"></script>
-<script type="text/javascript">
-  $(document).ready(function() { searchBox.OnSelectItem(0); });
-</script>
-<link href="doxygen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
-<div id="titlearea">
-<table cellspacing="0" cellpadding="0">
- <tbody>
- <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
-   <div id="projectname">eccodes
-   </div>
-  </td>
- </tr>
- </tbody>
-</table>
-</div>
-<!-- end header part -->
-<!-- Generated by Doxygen 1.8.5 -->
-<script type="text/javascript">
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
-</script>
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main Page</span></a></li>
-      <li><a href="modules.html"><span>C Interface</span></a></li>
-      <li><a href="classeccodes.html"><span>F90 Interface</span></a></li>
-      <li><a href="namespaces.html"><span>Python Interface</span></a></li>
-      <li>
-        <div id="MSearchBox" class="MSearchBoxInactive">
-        <span class="left">
-          <img id="MSearchSelect" src="search/mag_sel.png"
-               onmouseover="return searchBox.OnSearchSelectShow()"
-               onmouseout="return searchBox.OnSearchSelectHide()"
-               alt=""/>
-          <input type="text" id="MSearchField" value="Search" accesskey="S"
-               onfocus="searchBox.OnSearchFieldFocus(true)" 
-               onblur="searchBox.OnSearchFieldFocus(false)" 
-               onkeyup="searchBox.OnSearchFieldChange(event)"/>
-          </span><span class="right">
-            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
-          </span>
-        </div>
-      </li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="annotated.html"><span>Data Structures</span></a></li>
-      <li><a href="functions.html"><span>Data Fields</span></a></li>
-    </ul>
-  </div>
-<!-- window showing the filter options -->
-<div id="MSearchSelectWindow"
-     onmouseover="return searchBox.OnSearchSelectShow()"
-     onmouseout="return searchBox.OnSearchSelectHide()"
-     onkeydown="return searchBox.OnSearchSelectKey(event)">
-<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectIt [...]
-
-<!-- iframe showing the search results (closed by default) -->
-<div id="MSearchResultsWindow">
-<iframe src="javascript:void(0)" frameborder="0" 
-        name="MSearchResults" id="MSearchResults">
-</iframe>
-</div>
-
-<div id="nav-path" class="navpath">
-  <ul>
-<li class="navelem"><a class="el" href="namespaceec_codes.html">ecCodes</a></li><li class="navelem"><a class="el" href="classec_codes_1_1_codes_internal_error.html">CodesInternalError</a></li>  </ul>
-</div>
-</div><!-- top -->
-<div class="header">
-  <div class="headertitle">
-<div class="title">CodesInternalError Class Reference</div>  </div>
-</div><!--header-->
-<div class="contents">
-
-<p>Wrap errors coming from the C API in a Python exception object.  
- <a href="classec_codes_1_1_codes_internal_error.html#details">More...</a></p>
-
-<p>Inherits Exception.</p>
-<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
-<div class="textblock"><p>Wrap errors coming from the C API in a Python exception object. </p>
-</div><hr/>The documentation for this class was generated from the following file:<ul>
-<li>ecCodes.py</li>
-</ul>
-</div><!-- contents -->
-<!-- start footer part -->
-<hr class="footer"/><address class="footer"><small>
-Generated by  <a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.5
-</small></address>
-</body>
-</html>
diff --git a/html/classeccodes.html b/html/classeccodes.html
index 7a527ba..59c029e 100644
--- a/html/classeccodes.html
+++ b/html/classeccodes.html
@@ -364,6 +364,9 @@ Public Member Functions</h2></td></tr>
 <tr class="memitem:a731aac9d5d75917e12048573ae86e7c6"><td class="memItemLeft" align="right" valign="top">subroutine </td><td class="memItemRight" valign="bottom"><a class="el" href="classeccodes.html#a731aac9d5d75917e12048573ae86e7c6">codes_get_string_array</a> (msgid, key, value, status)</td></tr>
 <tr class="memdesc:a731aac9d5d75917e12048573ae86e7c6"><td class="mdescLeft"> </td><td class="mdescRight">Get the string array of values for a key from a message.  <a href="#a731aac9d5d75917e12048573ae86e7c6">More...</a><br/></td></tr>
 <tr class="separator:a731aac9d5d75917e12048573ae86e7c6"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a030c4f01609c1206deef936ba3e0029b"><td class="memItemLeft" align="right" valign="top">subroutine </td><td class="memItemRight" valign="bottom"><a class="el" href="classeccodes.html#a030c4f01609c1206deef936ba3e0029b">codes_bufr_copy_data</a> (msgid1, msgid2, status)</td></tr>
+<tr class="memdesc:a030c4f01609c1206deef936ba3e0029b"><td class="mdescLeft"> </td><td class="mdescRight">Copy data values from a BUFR message msgid1 to another message msgid2.  <a href="#a030c4f01609c1206deef936ba3e0029b">More...</a><br/></td></tr>
+<tr class="separator:a030c4f01609c1206deef936ba3e0029b"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:aae3ccb53638a4d16daf98d937a96e8b6"><td class="memItemLeft" align="right" valign="top">subroutine </td><td class="memItemRight" valign="bottom"><a class="el" href="classeccodes.html#aae3ccb53638a4d16daf98d937a96e8b6">codes_set_string_array</a> (msgid, key, value, status)</td></tr>
 <tr class="memdesc:aae3ccb53638a4d16daf98d937a96e8b6"><td class="mdescLeft"> </td><td class="mdescRight">Set the string values for an array key in a message.  <a href="#aae3ccb53638a4d16daf98d937a96e8b6">More...</a><br/></td></tr>
 <tr class="separator:aae3ccb53638a4d16daf98d937a96e8b6"><td class="memSeparator" colspan="2"> </td></tr>
@@ -382,18 +385,18 @@ Public Member Functions</h2></td></tr>
 <tr class="memitem:a4b28e570e54dad5a779e0452d3ed66d4"><td class="memItemLeft" align="right" valign="top">subroutine </td><td class="memItemRight" valign="bottom"><a class="el" href="classeccodes.html#a4b28e570e54dad5a779e0452d3ed66d4">codes_get_real8_array</a> (msgid, key, value, status)</td></tr>
 <tr class="memdesc:a4b28e570e54dad5a779e0452d3ed66d4"><td class="mdescLeft"> </td><td class="mdescRight">Get the real(8) array of values for a key from a message.  <a href="#a4b28e570e54dad5a779e0452d3ed66d4">More...</a><br/></td></tr>
 <tr class="separator:a4b28e570e54dad5a779e0452d3ed66d4"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a95426fb251262a83fbdcc5ae86968b4b"><td class="memItemLeft" align="right" valign="top">subroutine </td><td class="memItemRight" valign="bottom"><a class="el" href="classeccodes.html#a95426fb251262a83fbdcc5ae86968b4b">codes_get_real4_element</a> (msgid, key, index, value, status)</td></tr>
-<tr class="memdesc:a95426fb251262a83fbdcc5ae86968b4b"><td class="mdescLeft"> </td><td class="mdescRight">Get a real(4) value of specified index from an array key.  <a href="#a95426fb251262a83fbdcc5ae86968b4b">More...</a><br/></td></tr>
-<tr class="separator:a95426fb251262a83fbdcc5ae86968b4b"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ac9ceb83558433f918eac6aeb00b620af"><td class="memItemLeft" align="right" valign="top">subroutine </td><td class="memItemRight" valign="bottom"><a class="el" href="classeccodes.html#ac9ceb83558433f918eac6aeb00b620af">codes_get_real8_element</a> (msgid, key, index, value, status)</td></tr>
-<tr class="memdesc:ac9ceb83558433f918eac6aeb00b620af"><td class="mdescLeft"> </td><td class="mdescRight">Get a real(8) value of specified index from an array key.  <a href="#ac9ceb83558433f918eac6aeb00b620af">More...</a><br/></td></tr>
-<tr class="separator:ac9ceb83558433f918eac6aeb00b620af"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a0587c719213f5eb38afbb80cb30a2b8b"><td class="memItemLeft" align="right" valign="top">subroutine </td><td class="memItemRight" valign="bottom"><a class="el" href="classeccodes.html#a0587c719213f5eb38afbb80cb30a2b8b">codes_get_real4_elements</a> (msgid, key, index, value, status)</td></tr>
-<tr class="memdesc:a0587c719213f5eb38afbb80cb30a2b8b"><td class="mdescLeft"> </td><td class="mdescRight">Get the real(4) values whose indexes are stored in the array "index" from an array key.  <a href="#a0587c719213f5eb38afbb80cb30a2b8b">More...</a><br/></td></tr>
-<tr class="separator:a0587c719213f5eb38afbb80cb30a2b8b"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a1e550ade4f5781f19718fa8bdec802f9"><td class="memItemLeft" align="right" valign="top">subroutine </td><td class="memItemRight" valign="bottom"><a class="el" href="classeccodes.html#a1e550ade4f5781f19718fa8bdec802f9">codes_get_real8_elements</a> (msgid, key, index, value, status)</td></tr>
-<tr class="memdesc:a1e550ade4f5781f19718fa8bdec802f9"><td class="mdescLeft"> </td><td class="mdescRight">Get the real(8) values whose indexes are stored in the array "index" from an array key.  <a href="#a1e550ade4f5781f19718fa8bdec802f9">More...</a><br/></td></tr>
-<tr class="separator:a1e550ade4f5781f19718fa8bdec802f9"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a9d846a6d3872e4fdb991b007b7ab1301"><td class="memItemLeft" align="right" valign="top">subroutine </td><td class="memItemRight" valign="bottom"><a class="el" href="classeccodes.html#a9d846a6d3872e4fdb991b007b7ab1301">codes_get_real4_element</a> (msgid, key, kindex, value, status)</td></tr>
+<tr class="memdesc:a9d846a6d3872e4fdb991b007b7ab1301"><td class="mdescLeft"> </td><td class="mdescRight">Get a real(4) value of specified index from an array key.  <a href="#a9d846a6d3872e4fdb991b007b7ab1301">More...</a><br/></td></tr>
+<tr class="separator:a9d846a6d3872e4fdb991b007b7ab1301"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a7f8c1bc6b5c77950fe80d324c99e541a"><td class="memItemLeft" align="right" valign="top">subroutine </td><td class="memItemRight" valign="bottom"><a class="el" href="classeccodes.html#a7f8c1bc6b5c77950fe80d324c99e541a">codes_get_real8_element</a> (msgid, key, kindex, value, status)</td></tr>
+<tr class="memdesc:a7f8c1bc6b5c77950fe80d324c99e541a"><td class="mdescLeft"> </td><td class="mdescRight">Get a real(8) value of specified index from an array key.  <a href="#a7f8c1bc6b5c77950fe80d324c99e541a">More...</a><br/></td></tr>
+<tr class="separator:a7f8c1bc6b5c77950fe80d324c99e541a"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a6e52b77671af20322bd3fc72282449e3"><td class="memItemLeft" align="right" valign="top">subroutine </td><td class="memItemRight" valign="bottom"><a class="el" href="classeccodes.html#a6e52b77671af20322bd3fc72282449e3">codes_get_real4_elements</a> (msgid, key, kindex, value, status)</td></tr>
+<tr class="memdesc:a6e52b77671af20322bd3fc72282449e3"><td class="mdescLeft"> </td><td class="mdescRight">Get the real(4) values whose indexes are stored in the array "index" from an array key.  <a href="#a6e52b77671af20322bd3fc72282449e3">More...</a><br/></td></tr>
+<tr class="separator:a6e52b77671af20322bd3fc72282449e3"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ad2652d9dd45016f29721a60a5104867f"><td class="memItemLeft" align="right" valign="top">subroutine </td><td class="memItemRight" valign="bottom"><a class="el" href="classeccodes.html#ad2652d9dd45016f29721a60a5104867f">codes_get_real8_elements</a> (msgid, key, kindex, value, status)</td></tr>
+<tr class="memdesc:ad2652d9dd45016f29721a60a5104867f"><td class="mdescLeft"> </td><td class="mdescRight">Get the real(8) values whose indexes are stored in the array "index" from an array key.  <a href="#ad2652d9dd45016f29721a60a5104867f">More...</a><br/></td></tr>
+<tr class="separator:ad2652d9dd45016f29721a60a5104867f"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:ac060bb983b9e515db8ad7edd3d91ce9a"><td class="memItemLeft" align="right" valign="top">subroutine </td><td class="memItemRight" valign="bottom"><a class="el" href="classeccodes.html#ac060bb983b9e515db8ad7edd3d91ce9a">codes_set_int</a> (msgid, key, value, status)</td></tr>
 <tr class="memdesc:ac060bb983b9e515db8ad7edd3d91ce9a"><td class="mdescLeft"> </td><td class="mdescRight">Set the integer value for a key in a message.  <a href="#ac060bb983b9e515db8ad7edd3d91ce9a">More...</a><br/></td></tr>
 <tr class="separator:ac060bb983b9e515db8ad7edd3d91ce9a"><td class="memSeparator" colspan="2"> </td></tr>
@@ -445,12 +448,12 @@ Public Member Functions</h2></td></tr>
 <tr class="memitem:acb92b7a78966c0b2f53ee6e288bff673"><td class="memItemLeft" align="right" valign="top">subroutine </td><td class="memItemRight" valign="bottom"><a class="el" href="classeccodes.html#acb92b7a78966c0b2f53ee6e288bff673">codes_grib_find_nearest_multiple</a> (gribid, is_lsm, inlats, inlons, outlats, outlons, values, distances, indexes, status)</td></tr>
 <tr class="memdesc:acb92b7a78966c0b2f53ee6e288bff673"><td class="mdescLeft"> </td><td class="mdescRight">Find the nearest point of a set of points whose latitudes and longitudes are given in the inlats, inlons arrays respectively.  <a href="#acb92b7a78966c0b2f53ee6e288bff673">More...</a><br/></td></tr>
 <tr class="separator:acb92b7a78966c0b2f53ee6e288bff673"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a036ae036cc766718ad224851d47d99a2"><td class="memItemLeft" align="right" valign="top">subroutine </td><td class="memItemRight" valign="bottom"><a class="el" href="classeccodes.html#a036ae036cc766718ad224851d47d99a2">codes_grib_find_nearest_single</a> (gribid, is_lsm, inlat, inlon, outlat, outlon, value, distance, index, status)</td></tr>
-<tr class="memdesc:a036ae036cc766718ad224851d47d99a2"><td class="mdescLeft"> </td><td class="mdescRight">Find the nearest point of a given latitude/longitude point.  <a href="#a036ae036cc766718ad224851d47d99a2">More...</a><br/></td></tr>
-<tr class="separator:a036ae036cc766718ad224851d47d99a2"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ad4b53c47aecc5fa5ae43c95357d2d690"><td class="memItemLeft" align="right" valign="top">subroutine </td><td class="memItemRight" valign="bottom"><a class="el" href="classeccodes.html#ad4b53c47aecc5fa5ae43c95357d2d690">codes_grib_find_nearest_four_single</a> (gribid, is_lsm, inlat, inlon, outlat, outlon, value, distance, index, status)</td></tr>
-<tr class="memdesc:ad4b53c47aecc5fa5ae43c95357d2d690"><td class="mdescLeft"> </td><td class="mdescRight">Find the 4 nearest points of a latitude longitude point.  <a href="#ad4b53c47aecc5fa5ae43c95357d2d690">More...</a><br/></td></tr>
-<tr class="separator:ad4b53c47aecc5fa5ae43c95357d2d690"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a96fb4afe88914ad24ac796fbecc453c4"><td class="memItemLeft" align="right" valign="top">subroutine </td><td class="memItemRight" valign="bottom"><a class="el" href="classeccodes.html#a96fb4afe88914ad24ac796fbecc453c4">codes_grib_find_nearest_single</a> (gribid, is_lsm, inlat, inlon, outlat, outlon, value, distance, kindex, status)</td></tr>
+<tr class="memdesc:a96fb4afe88914ad24ac796fbecc453c4"><td class="mdescLeft"> </td><td class="mdescRight">Find the nearest point of a given latitude/longitude point.  <a href="#a96fb4afe88914ad24ac796fbecc453c4">More...</a><br/></td></tr>
+<tr class="separator:a96fb4afe88914ad24ac796fbecc453c4"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a2b677451802af47da342addf6624870a"><td class="memItemLeft" align="right" valign="top">subroutine </td><td class="memItemRight" valign="bottom"><a class="el" href="classeccodes.html#a2b677451802af47da342addf6624870a">codes_grib_find_nearest_four_single</a> (gribid, is_lsm, inlat, inlon, outlat, outlon, value, distance, kindex, status)</td></tr>
+<tr class="memdesc:a2b677451802af47da342addf6624870a"><td class="mdescLeft"> </td><td class="mdescRight">Find the 4 nearest points of a latitude longitude point.  <a href="#a2b677451802af47da342addf6624870a">More...</a><br/></td></tr>
+<tr class="separator:a2b677451802af47da342addf6624870a"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:a69d578039c073e637d727078778ca3ef"><td class="memItemLeft" align="right" valign="top">subroutine </td><td class="memItemRight" valign="bottom"><a class="el" href="classeccodes.html#a69d578039c073e637d727078778ca3ef">codes_grib_multi_support_on</a> (status)</td></tr>
 <tr class="memdesc:a69d578039c073e637d727078778ca3ef"><td class="mdescLeft"> </td><td class="mdescRight">Turn on the support for multiple fields in a single message.  <a href="#a69d578039c073e637d727078778ca3ef">More...</a><br/></td></tr>
 <tr class="separator:a69d578039c073e637d727078778ca3ef"><td class="memSeparator" colspan="2"> </td></tr>
@@ -481,6 +484,9 @@ Public Member Functions</h2></td></tr>
 <tr class="memitem:af4be467f3273e17111becbd483c25018"><td class="memItemLeft" align="right" valign="top">subroutine </td><td class="memItemRight" valign="bottom"><a class="el" href="classeccodes.html#af4be467f3273e17111becbd483c25018">codes_set_samples_path</a> (path, status)</td></tr>
 <tr class="memdesc:af4be467f3273e17111becbd483c25018"><td class="mdescLeft"> </td><td class="mdescRight">Set the samples path.  <a href="#af4be467f3273e17111becbd483c25018">More...</a><br/></td></tr>
 <tr class="separator:af4be467f3273e17111becbd483c25018"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a43bbbee406c2e974ae9cd4dcea41bd4d"><td class="memItemLeft" align="right" valign="top">subroutine </td><td class="memItemRight" valign="bottom"><a class="el" href="classeccodes.html#a43bbbee406c2e974ae9cd4dcea41bd4d">codes_copy_key</a> (msgid_src, key, msgid_dest, status)</td></tr>
+<tr class="memdesc:a43bbbee406c2e974ae9cd4dcea41bd4d"><td class="mdescLeft"> </td><td class="mdescRight">Copy the value of a key from the source message to the destination message.  <a href="#a43bbbee406c2e974ae9cd4dcea41bd4d">More...</a><br/></td></tr>
+<tr class="separator:a43bbbee406c2e974ae9cd4dcea41bd4d"><td class="memSeparator" colspan="2"> </td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>Module eccodes<br/>
@@ -531,6 +537,51 @@ Public Member Functions</h2></td></tr>
 
 </div>
 </div>
+<a class="anchor" id="a030c4f01609c1206deef936ba3e0029b"></a>
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">subroutine codes_bufr_copy_data </td>
+          <td>(</td>
+          <td class="paramtype">integer(kind=kindofint), intent(in) </td>
+          <td class="paramname"><em>msgid1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">integer(kind=kindofint), intent(in) </td>
+          <td class="paramname"><em>msgid2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">integer(kind=kindofint), intent(out), optional </td>
+          <td class="paramname"><em>status</em> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Copy data values from a BUFR message msgid1 to another message msgid2. </p>
+<p>In case of error, if the status parameter (optional) is not given, the program will exit with an error message.<br/>
+ Otherwise the error message can be gathered with <a class="el" href="classeccodes.html#a835de867b8ad79cc43f127e7048712f3">codes_get_error_string</a>.<br/>
+ </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">msgid1</td><td>id of the message from which the data are copied </td></tr>
+    <tr><td class="paramname">msgid2</td><td>id of the message to which the data are copied </td></tr>
+    <tr><td class="paramname">status</td><td>CODES_SUCCESS if OK, integer value on error </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
 <a class="anchor" id="a94050d64954482cd82ea6f007fdc9ac0"></a>
 <div class="memitem">
 <div class="memproto">
@@ -751,6 +802,57 @@ Public Member Functions</h2></td></tr>
 
 </div>
 </div>
+<a class="anchor" id="a43bbbee406c2e974ae9cd4dcea41bd4d"></a>
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">subroutine codes_copy_key </td>
+          <td>(</td>
+          <td class="paramtype">integer(kind=kindofint), intent(in) </td>
+          <td class="paramname"><em>msgid_src</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">character(len=*), intent(in) </td>
+          <td class="paramname"><em>key</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">integer(kind=kindofint), intent(in) </td>
+          <td class="paramname"><em>msgid_dest</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">integer(kind=kindofint), intent(out), optional </td>
+          <td class="paramname"><em>status</em> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Copy the value of a key from the source message to the destination message. </p>
+<p>In case of error, if the status parameter (optional) is not given, the program will exit with an error message.<br/>
+ Otherwise the error message can be gathered with <a class="el" href="classeccodes.html#a835de867b8ad79cc43f127e7048712f3">codes_get_error_string</a>.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">msgid_src</td><td>source message </td></tr>
+    <tr><td class="paramname">msgid_dest</td><td>destination message </td></tr>
+    <tr><td class="paramname">key</td><td>key whose value is to be copied </td></tr>
+    <tr><td class="paramname">status</td><td>GRIB_SUCCESS if OK, integer value on error </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
 <a class="anchor" id="afdd32c1a78f0a3d54992e0a6a6bfc66b"></a>
 <div class="memitem">
 <div class="memproto">
@@ -1423,7 +1525,7 @@ Public Member Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a95426fb251262a83fbdcc5ae86968b4b"></a>
+<a class="anchor" id="a9d846a6d3872e4fdb991b007b7ab1301"></a>
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -1443,7 +1545,7 @@ Public Member Functions</h2></td></tr>
           <td class="paramkey"></td>
           <td></td>
           <td class="paramtype">integer(kind=kindofint), intent(in) </td>
-          <td class="paramname"><em>index</em>, </td>
+          <td class="paramname"><em>kindex</em>, </td>
         </tr>
         <tr>
           <td class="paramkey"></td>
@@ -1472,7 +1574,7 @@ Public Member Functions</h2></td></tr>
   <table class="params">
     <tr><td class="paramname">msgid</td><td>id of the grib loaded in memory </td></tr>
     <tr><td class="paramname">key</td><td>key name </td></tr>
-    <tr><td class="paramname">index</td><td>integer(4) index </td></tr>
+    <tr><td class="paramname">kindex</td><td>integer(4) index </td></tr>
     <tr><td class="paramname">value</td><td>real(4) value </td></tr>
     <tr><td class="paramname">status</td><td>CODES_SUCCESS if OK, integer value on error </td></tr>
   </table>
@@ -1481,7 +1583,7 @@ Public Member Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a0587c719213f5eb38afbb80cb30a2b8b"></a>
+<a class="anchor" id="a6e52b77671af20322bd3fc72282449e3"></a>
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -1501,7 +1603,7 @@ Public Member Functions</h2></td></tr>
           <td class="paramkey"></td>
           <td></td>
           <td class="paramtype">integer(kind=kindofint), dimension(:), intent(in) </td>
-          <td class="paramname"><em>index</em>, </td>
+          <td class="paramname"><em>kindex</em>, </td>
         </tr>
         <tr>
           <td class="paramkey"></td>
@@ -1530,7 +1632,7 @@ Public Member Functions</h2></td></tr>
   <table class="params">
     <tr><td class="paramname">msgid</td><td>id of the grib loaded in memory </td></tr>
     <tr><td class="paramname">key</td><td>key name </td></tr>
-    <tr><td class="paramname">index</td><td>integer(4) array indexes </td></tr>
+    <tr><td class="paramname">kindex</td><td>integer(4) array indexes </td></tr>
     <tr><td class="paramname">value</td><td>real(4) array value </td></tr>
     <tr><td class="paramname">status</td><td>CODES_SUCCESS if OK, integer value on error </td></tr>
   </table>
@@ -1642,7 +1744,7 @@ Public Member Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="ac9ceb83558433f918eac6aeb00b620af"></a>
+<a class="anchor" id="a7f8c1bc6b5c77950fe80d324c99e541a"></a>
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -1662,7 +1764,7 @@ Public Member Functions</h2></td></tr>
           <td class="paramkey"></td>
           <td></td>
           <td class="paramtype">integer(kind=kindofint), intent(in) </td>
-          <td class="paramname"><em>index</em>, </td>
+          <td class="paramname"><em>kindex</em>, </td>
         </tr>
         <tr>
           <td class="paramkey"></td>
@@ -1691,7 +1793,7 @@ Public Member Functions</h2></td></tr>
   <table class="params">
     <tr><td class="paramname">msgid</td><td>id of the grib loaded in memory </td></tr>
     <tr><td class="paramname">key</td><td>key name </td></tr>
-    <tr><td class="paramname">index</td><td>integer(4) index </td></tr>
+    <tr><td class="paramname">kindex</td><td>integer(4) index </td></tr>
     <tr><td class="paramname">value</td><td>real(8) value </td></tr>
     <tr><td class="paramname">status</td><td>CODES_SUCCESS if OK, integer value on error </td></tr>
   </table>
@@ -1700,7 +1802,7 @@ Public Member Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a1e550ade4f5781f19718fa8bdec802f9"></a>
+<a class="anchor" id="ad2652d9dd45016f29721a60a5104867f"></a>
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -1720,7 +1822,7 @@ Public Member Functions</h2></td></tr>
           <td class="paramkey"></td>
           <td></td>
           <td class="paramtype">integer(kind=kindofint), dimension(:), intent(in) </td>
-          <td class="paramname"><em>index</em>, </td>
+          <td class="paramname"><em>kindex</em>, </td>
         </tr>
         <tr>
           <td class="paramkey"></td>
@@ -1749,7 +1851,7 @@ Public Member Functions</h2></td></tr>
   <table class="params">
     <tr><td class="paramname">msgid</td><td>id of the grib loaded in memory </td></tr>
     <tr><td class="paramname">key</td><td>key name </td></tr>
-    <tr><td class="paramname">index</td><td>integer(4) array index </td></tr>
+    <tr><td class="paramname">kindex</td><td>integer(4) array index </td></tr>
     <tr><td class="paramname">value</td><td>real(8) array value </td></tr>
     <tr><td class="paramname">status</td><td>CODES_SUCCESS if OK, integer value on error </td></tr>
   </table>
@@ -1965,7 +2067,7 @@ Public Member Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="ad4b53c47aecc5fa5ae43c95357d2d690"></a>
+<a class="anchor" id="a2b677451802af47da342addf6624870a"></a>
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -2021,7 +2123,7 @@ Public Member Functions</h2></td></tr>
           <td class="paramkey"></td>
           <td></td>
           <td class="paramtype">integer(kind = kindofint), dimension(4), intent(out) </td>
-          <td class="paramname"><em>index</em>, </td>
+          <td class="paramname"><em>kindex</em>, </td>
         </tr>
         <tr>
           <td class="paramkey"></td>
@@ -2049,7 +2151,7 @@ Public Member Functions</h2></td></tr>
     <tr><td class="paramname">outlat</td><td>latitude of the nearest point </td></tr>
     <tr><td class="paramname">outlon</td><td>longitude of the nearest point </td></tr>
     <tr><td class="paramname">distance</td><td>distance between the given point and its nearest </td></tr>
-    <tr><td class="paramname">index</td><td>zero based index </td></tr>
+    <tr><td class="paramname">kindex</td><td>zero based index </td></tr>
     <tr><td class="paramname">value</td><td>value of the field in the nearest point </td></tr>
     <tr><td class="paramname">status</td><td>CODES_SUCCESS if OK, integer value on error </td></tr>
   </table>
@@ -2151,7 +2253,7 @@ Public Member Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a036ae036cc766718ad224851d47d99a2"></a>
+<a class="anchor" id="a96fb4afe88914ad24ac796fbecc453c4"></a>
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -2207,7 +2309,7 @@ Public Member Functions</h2></td></tr>
           <td class="paramkey"></td>
           <td></td>
           <td class="paramtype">integer(kind = kindofint), intent(out) </td>
-          <td class="paramname"><em>index</em>, </td>
+          <td class="paramname"><em>kindex</em>, </td>
         </tr>
         <tr>
           <td class="paramkey"></td>
@@ -2235,7 +2337,7 @@ Public Member Functions</h2></td></tr>
     <tr><td class="paramname">outlat</td><td>latitude of the nearest point </td></tr>
     <tr><td class="paramname">outlon</td><td>longitude of the nearest point </td></tr>
     <tr><td class="paramname">distance</td><td>distance between the given point and its nearest </td></tr>
-    <tr><td class="paramname">index</td><td>zero based index </td></tr>
+    <tr><td class="paramname">kindex</td><td>zero based index </td></tr>
     <tr><td class="paramname">value</td><td>value of the field in the nearest point </td></tr>
     <tr><td class="paramname">status</td><td>CODES_SUCCESS if OK, integer value on error </td></tr>
   </table>
diff --git a/html/classes.html b/html/classes.html
index 16a88cb..1d72000 100644
--- a/html/classes.html
+++ b/html/classes.html
@@ -84,19 +84,22 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 <div class="title">xxindex</div>  </div>
 </div><!--header-->
 <div class="contents">
-<div class="qindex"><a class="qindex" href="#letter_C">C</a> | <a class="qindex" href="#letter_E">E</a></div>
+<div class="qindex"><a class="qindex" href="#letter_C">C</a> | <a class="qindex" href="#letter_E">E</a> | <a class="qindex" href="#letter_T">T</a></div>
 <table style="margin: 10px; white-space: nowrap;" align="center" width="95%" border="0" cellspacing="0" cellpadding="0">
 <tr><td rowspan="2" valign="bottom"><a name="letter_C"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  C  </div></td></tr></table>
-</td><td valign="top"><a class="el" href="interfaceeccodes_1_1codes__get__size.html">eccodes::codes_get_size</a>   </td><td valign="top"><a class="el" href="interfaceeccodes_1_1codes__index__get__size.html">eccodes::codes_index_get_size</a>   </td><td valign="top"><a class="el" href="interfaceeccodes_1_1codes__new__from__message.html">eccodes::codes_new_from_message</a>   </td><td rowspan="2" valign="bottom"><a name="letter_E"></a><table borde [...]
-</td></tr>
-<tr><td valign="top"><a class="el" href="interfaceeccodes_1_1codes__grib__find__nearest.html">eccodes::codes_grib_find_nearest</a>   </td><td valign="top"><a class="el" href="interfaceeccodes_1_1codes__index__select.html">eccodes::codes_index_select</a>   </td><td valign="top"><a class="el" href="interfaceeccodes_1_1codes__read__bytes.html">eccodes::codes_read_bytes</a>   </td></tr>
-<tr><td valign="top"><a class="el" href="structcodes__context.html">codes_context</a>   </td><td valign="top"><a class="el" href="interfaceeccodes_1_1codes__grib__get__data.html">eccodes::codes_grib_get_data</a>   </td><td valign="top"><a class="el" href="structcodes__iterator.html">codes_iterator</a>   </td><td valign="top"><a class="el" href="interfaceeccodes_1_1codes__read__from__file.html">eccodes::codes_read_from_file</a>  &#160 [...]
-<tr><td valign="top"><a class="el" href="interfaceeccodes_1_1codes__get.html">eccodes::codes_get</a>   </td><td valign="top"><a class="el" href="structcodes__handle.html">codes_handle</a>   </td><td valign="top"><a class="el" href="structcodes__keys__iterator.html">codes_keys_iterator</a>   </td><td valign="top"><a class="el" href="interfaceeccodes_1_1codes__set.html">eccodes::codes_set</a>   </td><td></td></tr>
-<tr><td valign="top"><a class="el" href="interfaceeccodes_1_1codes__get__element.html">eccodes::codes_get_element</a>   </td><td valign="top"><a class="el" href="structcodes__index.html">codes_index</a>   </td><td valign="top"><a class="el" href="structcodes__multi__handle.html">codes_multi_handle</a>   </td><td valign="top"><a class="el" href="interfaceeccodes_1_1codes__write__bytes.html">eccodes::codes_write_bytes</a>   </td>< [...]
-<tr><td valign="top"><a class="el" href="interfaceeccodes_1_1codes__get__message__size.html">eccodes::codes_get_message_size</a>   </td><td valign="top"><a class="el" href="interfaceeccodes_1_1codes__index__get.html">eccodes::codes_index_get</a>   </td><td valign="top"><a class="el" href="structcodes__nearest.html">codes_nearest</a>   </td><td valign="top"><a class="el" href="classec_codes_1_1_codes_internal_error.html">CodesInternalError</a>  [...]
+</td><td valign="top"><a class="el" href="interfaceeccodes_1_1codes__grib__find__nearest.html">eccodes::codes_grib_find_nearest</a>   </td><td valign="top"><a class="el" href="structcodes__iterator.html">codes_iterator</a>   </td><td valign="top"><a class="el" href="interfaceeccodes_1_1codes__set.html">eccodes::codes_set</a>   </td><td valign="top"><a class="el" href="classhigh__level__api_1_1_test_bufr_message.html">TestBufrMessage</a> (high_ [...]
+<tr><td valign="top"><a class="el" href="interfaceeccodes_1_1codes__grib__get__data.html">eccodes::codes_grib_get_data</a>   </td><td valign="top"><a class="el" href="structcodes__keys__iterator.html">codes_keys_iterator</a>   </td><td valign="top"><a class="el" href="interfaceeccodes_1_1codes__write__bytes.html">eccodes::codes_write_bytes</a>   </td><td valign="top"><a class="el" href="classhigh__level__api_1_1_test_grib_file.html">TestGribFi [...]
+<tr><td valign="top"><a class="el" href="structcodes__context.html">codes_context</a>   </td><td valign="top"><a class="el" href="structcodes__handle.html">codes_handle</a>   </td><td valign="top"><a class="el" href="structcodes__multi__handle.html">codes_multi_handle</a>   </td><td rowspan="2" valign="bottom"><a name="letter_E"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  E  </div></td></ [...]
+</td><td valign="top"><a class="el" href="classhigh__level__api_1_1_test_grib_index.html">TestGribIndex</a> (high_level_api)   </td></tr>
+<tr><td valign="top"><a class="el" href="interfaceeccodes_1_1codes__get.html">eccodes::codes_get</a>   </td><td valign="top"><a class="el" href="structcodes__index.html">codes_index</a>   </td><td valign="top"><a class="el" href="structcodes__nearest.html">codes_nearest</a>   </td><td valign="top"><a class="el" href="classhigh__level__api_1_1_test_grib_message.html">TestGribMessage</a> (high_level_api)   </td></tr>
+<tr><td valign="top"><a class="el" href="interfaceeccodes_1_1codes__get__element.html">eccodes::codes_get_element</a>   </td><td valign="top"><a class="el" href="interfaceeccodes_1_1codes__index__get.html">eccodes::codes_index_get</a>   </td><td valign="top"><a class="el" href="interfaceeccodes_1_1codes__new__from__message.html">eccodes::codes_new_from_message</a>   </td><td valign="top"><a class="el" href="classeccodes.html">eccodes</a>  [...]
+<tr><td valign="top"><a class="el" href="interfaceeccodes_1_1codes__get__message__size.html">eccodes::codes_get_message_size</a>   </td><td valign="top"><a class="el" href="interfaceeccodes_1_1codes__index__get__size.html">eccodes::codes_index_get_size</a>   </td><td valign="top"><a class="el" href="interfaceeccodes_1_1codes__read__bytes.html">eccodes::codes_read_bytes</a>   </td><td rowspan="2" valign="bottom"><a name="letter_T"></a><table bo [...]
+</td><td></td></tr>
+<tr><td valign="top"><a class="el" href="interfaceeccodes_1_1codes__get__size.html">eccodes::codes_get_size</a>   </td><td valign="top"><a class="el" href="interfaceeccodes_1_1codes__index__select.html">eccodes::codes_index_select</a>   </td><td valign="top"><a class="el" href="interfaceeccodes_1_1codes__read__from__file.html">eccodes::codes_read_from_file</a>   </td><td></td></tr>
+<tr><td></td><td></td><td></td><td valign="top"><a class="el" href="classhigh__level__api_1_1_test_bufr_file.html">TestBufrFile</a> (high_level_api)   </td><td></td></tr>
 <tr><td></td><td></td><td></td><td></td><td></td></tr>
 </table>
-<div class="qindex"><a class="qindex" href="#letter_C">C</a> | <a class="qindex" href="#letter_E">E</a></div>
+<div class="qindex"><a class="qindex" href="#letter_C">C</a> | <a class="qindex" href="#letter_E">E</a> | <a class="qindex" href="#letter_T">T</a></div>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
diff --git a/html/classhigh__level__api_1_1_test_bufr_file.html b/html/classhigh__level__api_1_1_test_bufr_file.html
new file mode 100644
index 0000000..5dffa2d
--- /dev/null
+++ b/html/classhigh__level__api_1_1_test_bufr_file.html
@@ -0,0 +1,229 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.5"/>
+<title>eccodes: TestBufrFile Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+  $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">eccodes
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.5 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="modules.html"><span>C Interface</span></a></li>
+      <li><a href="classeccodes.html"><span>F90 Interface</span></a></li>
+      <li><a href="namespaces.html"><span>Python Interface</span></a></li>
+      <li>
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Data Structures</span></a></li>
+      <li><a href="functions.html"><span>Data Fields</span></a></li>
+    </ul>
+  </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectIt [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><b>high_level_api</b></li><li class="navelem"><a class="el" href="classhigh__level__api_1_1_test_bufr_file.html">TestBufrFile</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#pub-methods">Public Member Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">TestBufrFile Class Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Test BufrFile functionality.  
+ <a href="classhigh__level__api_1_1_test_bufr_file.html#details">More...</a></p>
+
+<p>Inherits TestCase.</p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a4794a05e5b1eb5d444652bae54f04128"><td class="memItemLeft" align="right" valign="top">def </td><td class="memItemRight" valign="bottom"><a class="el" href="classhigh__level__api_1_1_test_bufr_file.html#a4794a05e5b1eb5d444652bae54f04128">test_memory_management</a></td></tr>
+<tr class="memdesc:a4794a05e5b1eb5d444652bae54f04128"><td class="mdescLeft"> </td><td class="mdescRight">Messages in BufrFile can be opened and closed properly.  <a href="#a4794a05e5b1eb5d444652bae54f04128">More...</a><br/></td></tr>
+<tr class="separator:a4794a05e5b1eb5d444652bae54f04128"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a400f7c3570e6aac8231fb9e7e55a16a2"><td class="memItemLeft" align="right" valign="top">def </td><td class="memItemRight" valign="bottom"><a class="el" href="classhigh__level__api_1_1_test_bufr_file.html#a400f7c3570e6aac8231fb9e7e55a16a2">test_message_counting_works</a></td></tr>
+<tr class="memdesc:a400f7c3570e6aac8231fb9e7e55a16a2"><td class="mdescLeft"> </td><td class="mdescRight">The BufrFile is aware of its messages.  <a href="#a400f7c3570e6aac8231fb9e7e55a16a2">More...</a><br/></td></tr>
+<tr class="separator:a400f7c3570e6aac8231fb9e7e55a16a2"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ac296c5581454cae229c9e926509488f4"><td class="memItemLeft" align="right" valign="top">def </td><td class="memItemRight" valign="bottom"><a class="el" href="classhigh__level__api_1_1_test_bufr_file.html#ac296c5581454cae229c9e926509488f4">test_iterator_protocol</a></td></tr>
+<tr class="memdesc:ac296c5581454cae229c9e926509488f4"><td class="mdescLeft"> </td><td class="mdescRight">The BufrFile allows pythonic iteration over all messages.  <a href="#ac296c5581454cae229c9e926509488f4">More...</a><br/></td></tr>
+<tr class="separator:ac296c5581454cae229c9e926509488f4"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a42d0160d68272b2d96cdffbc2db5f3f2"><td class="memItemLeft" align="right" valign="top">def </td><td class="memItemRight" valign="bottom"><a class="el" href="classhigh__level__api_1_1_test_bufr_file.html#a42d0160d68272b2d96cdffbc2db5f3f2">test_read_past_last_message</a></td></tr>
+<tr class="memdesc:a42d0160d68272b2d96cdffbc2db5f3f2"><td class="mdescLeft"> </td><td class="mdescRight">Trying to open message on exhausted BUFR file raises IOError.  <a href="#a42d0160d68272b2d96cdffbc2db5f3f2">More...</a><br/></td></tr>
+<tr class="separator:a42d0160d68272b2d96cdffbc2db5f3f2"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:adf65917be1841c4717dee205457d576b"><td class="memItemLeft" align="right" valign="top">def </td><td class="memItemRight" valign="bottom"><a class="el" href="classhigh__level__api_1_1_test_bufr_file.html#adf65917be1841c4717dee205457d576b">test_read_invalid_file</a></td></tr>
+<tr class="memdesc:adf65917be1841c4717dee205457d576b"><td class="mdescLeft"> </td><td class="mdescRight">Trying to open message on nonexistent file raises IOError.  <a href="#adf65917be1841c4717dee205457d576b">More...</a><br/></td></tr>
+<tr class="separator:adf65917be1841c4717dee205457d576b"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Test BufrFile functionality. </p>
+</div><h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="ac296c5581454cae229c9e926509488f4"></a>
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">def test_iterator_protocol </td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname"><em>self</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>The BufrFile allows pythonic iteration over all messages. </p>
+
+</div>
+</div>
+<a class="anchor" id="a4794a05e5b1eb5d444652bae54f04128"></a>
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">def test_memory_management </td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname"><em>self</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Messages in BufrFile can be opened and closed properly. </p>
+
+<p>References <a class="el" href="classhigh__level__api_1_1_test_bufr_file.html#a42d0160d68272b2d96cdffbc2db5f3f2">TestBufrFile.test_read_past_last_message()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a400f7c3570e6aac8231fb9e7e55a16a2"></a>
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">def test_message_counting_works </td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname"><em>self</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>The BufrFile is aware of its messages. </p>
+
+<p>References <a class="el" href="classhigh__level__api_1_1_test_bufr_file.html#adf65917be1841c4717dee205457d576b">TestBufrFile.test_read_invalid_file()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="adf65917be1841c4717dee205457d576b"></a>
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">def test_read_invalid_file </td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname"><em>self</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Trying to open message on nonexistent file raises IOError. </p>
+
+<p>Referenced by <a class="el" href="classhigh__level__api_1_1_test_bufr_file.html#a400f7c3570e6aac8231fb9e7e55a16a2">TestBufrFile.test_message_counting_works()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a42d0160d68272b2d96cdffbc2db5f3f2"></a>
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">def test_read_past_last_message </td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname"><em>self</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Trying to open message on exhausted BUFR file raises IOError. </p>
+
+<p>Referenced by <a class="el" href="classhigh__level__api_1_1_test_bufr_file.html#a4794a05e5b1eb5d444652bae54f04128">TestBufrFile.test_memory_management()</a>.</p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>high_level_api.py</li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by  <a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.5
+</small></address>
+</body>
+</html>
diff --git a/html/classhigh__level__api_1_1_test_bufr_message.html b/html/classhigh__level__api_1_1_test_bufr_message.html
new file mode 100644
index 0000000..ae9f68c
--- /dev/null
+++ b/html/classhigh__level__api_1_1_test_bufr_message.html
@@ -0,0 +1,225 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.5"/>
+<title>eccodes: TestBufrMessage Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+  $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">eccodes
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.5 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="modules.html"><span>C Interface</span></a></li>
+      <li><a href="classeccodes.html"><span>F90 Interface</span></a></li>
+      <li><a href="namespaces.html"><span>Python Interface</span></a></li>
+      <li>
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Data Structures</span></a></li>
+      <li><a href="functions.html"><span>Data Fields</span></a></li>
+    </ul>
+  </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectIt [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><b>high_level_api</b></li><li class="navelem"><a class="el" href="classhigh__level__api_1_1_test_bufr_message.html">TestBufrMessage</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#pub-methods">Public Member Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">TestBufrMessage Class Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Test BufrMessage functionality.  
+ <a href="classhigh__level__api_1_1_test_bufr_message.html#details">More...</a></p>
+
+<p>Inherits TestCase.</p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a494685737e2cd151570101279bffe4c2"><td class="memItemLeft" align="right" valign="top">def </td><td class="memItemRight" valign="bottom"><a class="el" href="classhigh__level__api_1_1_test_bufr_message.html#a494685737e2cd151570101279bffe4c2">test_metadata</a></td></tr>
+<tr class="memdesc:a494685737e2cd151570101279bffe4c2"><td class="mdescLeft"> </td><td class="mdescRight">Metadata is read correctly from BufrMessage.  <a href="#a494685737e2cd151570101279bffe4c2">More...</a><br/></td></tr>
+<tr class="separator:a494685737e2cd151570101279bffe4c2"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aae0bd902ad06975ab7daff87c34aea50"><td class="memItemLeft" align="right" valign="top">def </td><td class="memItemRight" valign="bottom"><a class="el" href="classhigh__level__api_1_1_test_bufr_message.html#aae0bd902ad06975ab7daff87c34aea50">test_content</a></td></tr>
+<tr class="memdesc:aae0bd902ad06975ab7daff87c34aea50"><td class="mdescLeft"> </td><td class="mdescRight">Data values are read correctly from BufrMessage.  <a href="#aae0bd902ad06975ab7daff87c34aea50">More...</a><br/></td></tr>
+<tr class="separator:aae0bd902ad06975ab7daff87c34aea50"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a9cab109486b0ae16e800b8777db052e7"><td class="memItemLeft" align="right" valign="top">def </td><td class="memItemRight" valign="bottom"><a class="el" href="classhigh__level__api_1_1_test_bufr_message.html#a9cab109486b0ae16e800b8777db052e7">test_value_setting</a></td></tr>
+<tr class="memdesc:a9cab109486b0ae16e800b8777db052e7"><td class="mdescLeft"> </td><td class="mdescRight">Keys can be set properly.  <a href="#a9cab109486b0ae16e800b8777db052e7">More...</a><br/></td></tr>
+<tr class="separator:a9cab109486b0ae16e800b8777db052e7"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aa2e02e263da64ba84940736a7f00fd96"><td class="memItemLeft" align="right" valign="top">def </td><td class="memItemRight" valign="bottom"><a class="el" href="classhigh__level__api_1_1_test_bufr_message.html#aa2e02e263da64ba84940736a7f00fd96">test_serialize</a></td></tr>
+<tr class="memdesc:aa2e02e263da64ba84940736a7f00fd96"><td class="mdescLeft"> </td><td class="mdescRight">Message can be serialized to file.  <a href="#aa2e02e263da64ba84940736a7f00fd96">More...</a><br/></td></tr>
+<tr class="separator:aa2e02e263da64ba84940736a7f00fd96"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ac4ad8985e15d4cb25c2907c09f76891b"><td class="memItemLeft" align="right" valign="top">def </td><td class="memItemRight" valign="bottom"><a class="el" href="classhigh__level__api_1_1_test_bufr_message.html#ac4ad8985e15d4cb25c2907c09f76891b">test_clone</a></td></tr>
+<tr class="memdesc:ac4ad8985e15d4cb25c2907c09f76891b"><td class="mdescLeft"> </td><td class="mdescRight">Messages can be used to produce clone Messages.  <a href="#ac4ad8985e15d4cb25c2907c09f76891b">More...</a><br/></td></tr>
+<tr class="separator:ac4ad8985e15d4cb25c2907c09f76891b"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Test BufrMessage functionality. </p>
+</div><h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="ac4ad8985e15d4cb25c2907c09f76891b"></a>
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">def test_clone </td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname"><em>self</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Messages can be used to produce clone Messages. </p>
+
+<p>Referenced by <a class="el" href="classhigh__level__api_1_1_test_bufr_message.html#a494685737e2cd151570101279bffe4c2">TestBufrMessage.test_metadata()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aae0bd902ad06975ab7daff87c34aea50"></a>
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">def test_content </td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname"><em>self</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Data values are read correctly from BufrMessage. </p>
+
+</div>
+</div>
+<a class="anchor" id="a494685737e2cd151570101279bffe4c2"></a>
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">def test_metadata </td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname"><em>self</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Metadata is read correctly from BufrMessage. </p>
+
+<p>References <a class="el" href="classhigh__level__api_1_1_test_bufr_message.html#ac4ad8985e15d4cb25c2907c09f76891b">TestBufrMessage.test_clone()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa2e02e263da64ba84940736a7f00fd96"></a>
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">def test_serialize </td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname"><em>self</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Message can be serialized to file. </p>
+
+</div>
+</div>
+<a class="anchor" id="a9cab109486b0ae16e800b8777db052e7"></a>
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">def test_value_setting </td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname"><em>self</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Keys can be set properly. </p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>high_level_api.py</li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by  <a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.5
+</small></address>
+</body>
+</html>
diff --git a/html/classhigh__level__api_1_1_test_grib_file.html b/html/classhigh__level__api_1_1_test_grib_file.html
new file mode 100644
index 0000000..aa98519
--- /dev/null
+++ b/html/classhigh__level__api_1_1_test_grib_file.html
@@ -0,0 +1,237 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.5"/>
+<title>eccodes: TestGribFile Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+  $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">eccodes
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.5 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="modules.html"><span>C Interface</span></a></li>
+      <li><a href="classeccodes.html"><span>F90 Interface</span></a></li>
+      <li><a href="namespaces.html"><span>Python Interface</span></a></li>
+      <li>
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Data Structures</span></a></li>
+      <li><a href="functions.html"><span>Data Fields</span></a></li>
+    </ul>
+  </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectIt [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><b>high_level_api</b></li><li class="navelem"><a class="el" href="classhigh__level__api_1_1_test_grib_file.html">TestGribFile</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#pub-methods">Public Member Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">TestGribFile Class Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Test GribFile functionality.  
+ <a href="classhigh__level__api_1_1_test_grib_file.html#details">More...</a></p>
+
+<p>Inherits TestCase.</p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a4794a05e5b1eb5d444652bae54f04128"><td class="memItemLeft" align="right" valign="top">def </td><td class="memItemRight" valign="bottom"><a class="el" href="classhigh__level__api_1_1_test_grib_file.html#a4794a05e5b1eb5d444652bae54f04128">test_memory_management</a></td></tr>
+<tr class="memdesc:a4794a05e5b1eb5d444652bae54f04128"><td class="mdescLeft"> </td><td class="mdescRight">Messages in GribFile can be opened and closed properly.  <a href="#a4794a05e5b1eb5d444652bae54f04128">More...</a><br/></td></tr>
+<tr class="separator:a4794a05e5b1eb5d444652bae54f04128"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a400f7c3570e6aac8231fb9e7e55a16a2"><td class="memItemLeft" align="right" valign="top">def </td><td class="memItemRight" valign="bottom"><a class="el" href="classhigh__level__api_1_1_test_grib_file.html#a400f7c3570e6aac8231fb9e7e55a16a2">test_message_counting_works</a></td></tr>
+<tr class="memdesc:a400f7c3570e6aac8231fb9e7e55a16a2"><td class="mdescLeft"> </td><td class="mdescRight">The GribFile is aware of its messages.  <a href="#a400f7c3570e6aac8231fb9e7e55a16a2">More...</a><br/></td></tr>
+<tr class="separator:a400f7c3570e6aac8231fb9e7e55a16a2"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ac296c5581454cae229c9e926509488f4"><td class="memItemLeft" align="right" valign="top">def </td><td class="memItemRight" valign="bottom"><a class="el" href="classhigh__level__api_1_1_test_grib_file.html#ac296c5581454cae229c9e926509488f4">test_iterator_protocol</a></td></tr>
+<tr class="memdesc:ac296c5581454cae229c9e926509488f4"><td class="mdescLeft"> </td><td class="mdescRight">The GribFile allows pythonic iteration over all messages.  <a href="#ac296c5581454cae229c9e926509488f4">More...</a><br/></td></tr>
+<tr class="separator:ac296c5581454cae229c9e926509488f4"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a42d0160d68272b2d96cdffbc2db5f3f2"><td class="memItemLeft" align="right" valign="top">def </td><td class="memItemRight" valign="bottom"><a class="el" href="classhigh__level__api_1_1_test_grib_file.html#a42d0160d68272b2d96cdffbc2db5f3f2">test_read_past_last_message</a></td></tr>
+<tr class="memdesc:a42d0160d68272b2d96cdffbc2db5f3f2"><td class="mdescLeft"> </td><td class="mdescRight">Trying to open message on exhausted GRIB file raises IOError.  <a href="#a42d0160d68272b2d96cdffbc2db5f3f2">More...</a><br/></td></tr>
+<tr class="separator:a42d0160d68272b2d96cdffbc2db5f3f2"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:adf65917be1841c4717dee205457d576b"><td class="memItemLeft" align="right" valign="top">def </td><td class="memItemRight" valign="bottom"><a class="el" href="classhigh__level__api_1_1_test_grib_file.html#adf65917be1841c4717dee205457d576b">test_read_invalid_file</a></td></tr>
+<tr class="memdesc:adf65917be1841c4717dee205457d576b"><td class="mdescLeft"> </td><td class="mdescRight">Trying to open message on nonexistent GRIB file raises IOError.  <a href="#adf65917be1841c4717dee205457d576b">More...</a><br/></td></tr>
+<tr class="separator:adf65917be1841c4717dee205457d576b"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Test GribFile functionality. </p>
+</div><h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="ac296c5581454cae229c9e926509488f4"></a>
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">def test_iterator_protocol </td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname"><em>self</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>The GribFile allows pythonic iteration over all messages. </p>
+
+<p>References <a class="el" href="classhigh__level__api_1_1_test_grib_file.html#a42d0160d68272b2d96cdffbc2db5f3f2">TestGribFile.test_read_past_last_message()</a>.</p>
+
+<p>Referenced by <a class="el" href="classhigh__level__api_1_1_test_grib_file.html#a400f7c3570e6aac8231fb9e7e55a16a2">TestGribFile.test_message_counting_works()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4794a05e5b1eb5d444652bae54f04128"></a>
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">def test_memory_management </td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname"><em>self</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Messages in GribFile can be opened and closed properly. </p>
+
+<p>References <a class="el" href="classhigh__level__api_1_1_test_grib_file.html#a400f7c3570e6aac8231fb9e7e55a16a2">TestGribFile.test_message_counting_works()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a400f7c3570e6aac8231fb9e7e55a16a2"></a>
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">def test_message_counting_works </td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname"><em>self</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>The GribFile is aware of its messages. </p>
+
+<p>References <a class="el" href="classhigh__level__api_1_1_test_grib_file.html#ac296c5581454cae229c9e926509488f4">TestGribFile.test_iterator_protocol()</a>.</p>
+
+<p>Referenced by <a class="el" href="classhigh__level__api_1_1_test_grib_file.html#a4794a05e5b1eb5d444652bae54f04128">TestGribFile.test_memory_management()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="adf65917be1841c4717dee205457d576b"></a>
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">def test_read_invalid_file </td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname"><em>self</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Trying to open message on nonexistent GRIB file raises IOError. </p>
+
+<p>Referenced by <a class="el" href="classhigh__level__api_1_1_test_grib_file.html#a42d0160d68272b2d96cdffbc2db5f3f2">TestGribFile.test_read_past_last_message()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a42d0160d68272b2d96cdffbc2db5f3f2"></a>
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">def test_read_past_last_message </td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname"><em>self</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Trying to open message on exhausted GRIB file raises IOError. </p>
+
+<p>References <a class="el" href="classhigh__level__api_1_1_test_grib_file.html#adf65917be1841c4717dee205457d576b">TestGribFile.test_read_invalid_file()</a>.</p>
+
+<p>Referenced by <a class="el" href="classhigh__level__api_1_1_test_grib_file.html#ac296c5581454cae229c9e926509488f4">TestGribFile.test_iterator_protocol()</a>.</p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>high_level_api.py</li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by  <a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.5
+</small></address>
+</body>
+</html>
diff --git a/html/classhigh__level__api_1_1_test_grib_index.html b/html/classhigh__level__api_1_1_test_grib_index.html
new file mode 100644
index 0000000..df0ad23
--- /dev/null
+++ b/html/classhigh__level__api_1_1_test_grib_index.html
@@ -0,0 +1,183 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.5"/>
+<title>eccodes: TestGribIndex Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+  $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">eccodes
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.5 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="modules.html"><span>C Interface</span></a></li>
+      <li><a href="classeccodes.html"><span>F90 Interface</span></a></li>
+      <li><a href="namespaces.html"><span>Python Interface</span></a></li>
+      <li>
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Data Structures</span></a></li>
+      <li><a href="functions.html"><span>Data Fields</span></a></li>
+    </ul>
+  </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectIt [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><b>high_level_api</b></li><li class="navelem"><a class="el" href="classhigh__level__api_1_1_test_grib_index.html">TestGribIndex</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#pub-methods">Public Member Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">TestGribIndex Class Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Test GribIndex functionality.  
+ <a href="classhigh__level__api_1_1_test_grib_index.html#details">More...</a></p>
+
+<p>Inherits TestCase.</p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a4794a05e5b1eb5d444652bae54f04128"><td class="memItemLeft" align="right" valign="top">def </td><td class="memItemRight" valign="bottom"><a class="el" href="classhigh__level__api_1_1_test_grib_index.html#a4794a05e5b1eb5d444652bae54f04128">test_memory_management</a></td></tr>
+<tr class="memdesc:a4794a05e5b1eb5d444652bae54f04128"><td class="mdescLeft"> </td><td class="mdescRight">GribIndex closes GribMessages properly.  <a href="#a4794a05e5b1eb5d444652bae54f04128">More...</a><br/></td></tr>
+<tr class="separator:a4794a05e5b1eb5d444652bae54f04128"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a66286a9b57f5493b5f366cda130d4c32"><td class="memItemLeft" align="right" valign="top">def </td><td class="memItemRight" valign="bottom"><a class="el" href="classhigh__level__api_1_1_test_grib_index.html#a66286a9b57f5493b5f366cda130d4c32">test_create_and_serialize_index</a></td></tr>
+<tr class="memdesc:a66286a9b57f5493b5f366cda130d4c32"><td class="mdescLeft"> </td><td class="mdescRight">GribIndex can be saved to file, file can be added to index.  <a href="#a66286a9b57f5493b5f366cda130d4c32">More...</a><br/></td></tr>
+<tr class="separator:a66286a9b57f5493b5f366cda130d4c32"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a3a4f65d7dfe52f1248010fe1cdae2f01"><td class="memItemLeft" align="right" valign="top">def </td><td class="memItemRight" valign="bottom"><a class="el" href="classhigh__level__api_1_1_test_grib_index.html#a3a4f65d7dfe52f1248010fe1cdae2f01">test_index_comprehension</a></td></tr>
+<tr class="memdesc:a3a4f65d7dfe52f1248010fe1cdae2f01"><td class="mdescLeft"> </td><td class="mdescRight">GribIndex understands underlying GRIB index properly.  <a href="#a3a4f65d7dfe52f1248010fe1cdae2f01">More...</a><br/></td></tr>
+<tr class="separator:a3a4f65d7dfe52f1248010fe1cdae2f01"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Test GribIndex functionality. </p>
+</div><h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="a66286a9b57f5493b5f366cda130d4c32"></a>
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">def test_create_and_serialize_index </td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname"><em>self</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>GribIndex can be saved to file, file can be added to index. </p>
+
+</div>
+</div>
+<a class="anchor" id="a3a4f65d7dfe52f1248010fe1cdae2f01"></a>
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">def test_index_comprehension </td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname"><em>self</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>GribIndex understands underlying GRIB index properly. </p>
+
+<p>References <a class="el" href="classhigh__level__api_1_1_test_grib_index.html#a4794a05e5b1eb5d444652bae54f04128">TestGribIndex.test_memory_management()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4794a05e5b1eb5d444652bae54f04128"></a>
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">def test_memory_management </td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname"><em>self</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>GribIndex closes GribMessages properly. </p>
+
+<p>Referenced by <a class="el" href="classhigh__level__api_1_1_test_grib_index.html#a3a4f65d7dfe52f1248010fe1cdae2f01">TestGribIndex.test_index_comprehension()</a>.</p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>high_level_api.py</li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by  <a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.5
+</small></address>
+</body>
+</html>
diff --git a/html/classhigh__level__api_1_1_test_grib_message.html b/html/classhigh__level__api_1_1_test_grib_message.html
new file mode 100644
index 0000000..12ec250
--- /dev/null
+++ b/html/classhigh__level__api_1_1_test_grib_message.html
@@ -0,0 +1,233 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.5"/>
+<title>eccodes: TestGribMessage Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+  $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">eccodes
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.5 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="modules.html"><span>C Interface</span></a></li>
+      <li><a href="classeccodes.html"><span>F90 Interface</span></a></li>
+      <li><a href="namespaces.html"><span>Python Interface</span></a></li>
+      <li>
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Data Structures</span></a></li>
+      <li><a href="functions.html"><span>Data Fields</span></a></li>
+    </ul>
+  </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectIt [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><b>high_level_api</b></li><li class="navelem"><a class="el" href="classhigh__level__api_1_1_test_grib_message.html">TestGribMessage</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#pub-methods">Public Member Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">TestGribMessage Class Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Test GribMessage functionality.  
+ <a href="classhigh__level__api_1_1_test_grib_message.html#details">More...</a></p>
+
+<p>Inherits TestCase.</p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a494685737e2cd151570101279bffe4c2"><td class="memItemLeft" align="right" valign="top">def </td><td class="memItemRight" valign="bottom"><a class="el" href="classhigh__level__api_1_1_test_grib_message.html#a494685737e2cd151570101279bffe4c2">test_metadata</a></td></tr>
+<tr class="memdesc:a494685737e2cd151570101279bffe4c2"><td class="mdescLeft"> </td><td class="mdescRight">Metadata is read correctly from GribMessage.  <a href="#a494685737e2cd151570101279bffe4c2">More...</a><br/></td></tr>
+<tr class="separator:a494685737e2cd151570101279bffe4c2"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a4dcbe8806395648ca284d88976042231"><td class="memItemLeft" align="right" valign="top">def </td><td class="memItemRight" valign="bottom"><a class="el" href="classhigh__level__api_1_1_test_grib_message.html#a4dcbe8806395648ca284d88976042231">test_missing_message_behaviour</a></td></tr>
+<tr class="memdesc:a4dcbe8806395648ca284d88976042231"><td class="mdescLeft"> </td><td class="mdescRight">Key with MISSING value.  <a href="#a4dcbe8806395648ca284d88976042231">More...</a><br/></td></tr>
+<tr class="separator:a4dcbe8806395648ca284d88976042231"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a9cab109486b0ae16e800b8777db052e7"><td class="memItemLeft" align="right" valign="top">def </td><td class="memItemRight" valign="bottom"><a class="el" href="classhigh__level__api_1_1_test_grib_message.html#a9cab109486b0ae16e800b8777db052e7">test_value_setting</a></td></tr>
+<tr class="memdesc:a9cab109486b0ae16e800b8777db052e7"><td class="mdescLeft"> </td><td class="mdescRight">Keys can be set properly.  <a href="#a9cab109486b0ae16e800b8777db052e7">More...</a><br/></td></tr>
+<tr class="separator:a9cab109486b0ae16e800b8777db052e7"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aa2e02e263da64ba84940736a7f00fd96"><td class="memItemLeft" align="right" valign="top">def </td><td class="memItemRight" valign="bottom"><a class="el" href="classhigh__level__api_1_1_test_grib_message.html#aa2e02e263da64ba84940736a7f00fd96">test_serialize</a></td></tr>
+<tr class="memdesc:aa2e02e263da64ba84940736a7f00fd96"><td class="mdescLeft"> </td><td class="mdescRight">Message can be serialized to file.  <a href="#aa2e02e263da64ba84940736a7f00fd96">More...</a><br/></td></tr>
+<tr class="separator:aa2e02e263da64ba84940736a7f00fd96"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ac4ad8985e15d4cb25c2907c09f76891b"><td class="memItemLeft" align="right" valign="top">def </td><td class="memItemRight" valign="bottom"><a class="el" href="classhigh__level__api_1_1_test_grib_message.html#ac4ad8985e15d4cb25c2907c09f76891b">test_clone</a></td></tr>
+<tr class="memdesc:ac4ad8985e15d4cb25c2907c09f76891b"><td class="mdescLeft"> </td><td class="mdescRight">Messages can be used to produce clone Messages.  <a href="#ac4ad8985e15d4cb25c2907c09f76891b">More...</a><br/></td></tr>
+<tr class="separator:ac4ad8985e15d4cb25c2907c09f76891b"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Test GribMessage functionality. </p>
+</div><h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="ac4ad8985e15d4cb25c2907c09f76891b"></a>
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">def test_clone </td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname"><em>self</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Messages can be used to produce clone Messages. </p>
+
+<p>Referenced by <a class="el" href="classhigh__level__api_1_1_test_grib_message.html#a9cab109486b0ae16e800b8777db052e7">TestGribMessage.test_value_setting()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a494685737e2cd151570101279bffe4c2"></a>
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">def test_metadata </td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname"><em>self</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Metadata is read correctly from GribMessage. </p>
+
+<p>References <a class="el" href="classhigh__level__api_1_1_test_grib_message.html#a9cab109486b0ae16e800b8777db052e7">TestGribMessage.test_value_setting()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4dcbe8806395648ca284d88976042231"></a>
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">def test_missing_message_behaviour </td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname"><em>self</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Key with MISSING value. </p>
+
+<p>References <a class="el" href="classhigh__level__api_1_1_test_grib_message.html#aa2e02e263da64ba84940736a7f00fd96">TestGribMessage.test_serialize()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa2e02e263da64ba84940736a7f00fd96"></a>
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">def test_serialize </td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname"><em>self</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Message can be serialized to file. </p>
+
+<p>Referenced by <a class="el" href="classhigh__level__api_1_1_test_grib_message.html#a4dcbe8806395648ca284d88976042231">TestGribMessage.test_missing_message_behaviour()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9cab109486b0ae16e800b8777db052e7"></a>
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">def test_value_setting </td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname"><em>self</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Keys can be set properly. </p>
+
+<p>References <a class="el" href="classhigh__level__api_1_1_test_grib_message.html#ac4ad8985e15d4cb25c2907c09f76891b">TestGribMessage.test_clone()</a>.</p>
+
+<p>Referenced by <a class="el" href="classhigh__level__api_1_1_test_grib_message.html#a494685737e2cd151570101279bffe4c2">TestGribMessage.test_metadata()</a>.</p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>high_level_api.py</li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by  <a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.5
+</small></address>
+</body>
+</html>
diff --git a/html/dir_d050070cc3e4bbd91d897ff8856046e0.html b/html/dir_d050070cc3e4bbd91d897ff8856046e0.html
index a91cbb7..bd8b2f1 100644
--- a/html/dir_d050070cc3e4bbd91d897ff8856046e0.html
+++ b/html/dir_d050070cc3e4bbd91d897ff8856046e0.html
@@ -91,6 +91,8 @@ Files</h2></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:bufr__clone_8py"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>bufr_clone.py</b></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:bufr__copy__data_8py"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>bufr_copy_data.py</b></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:bufr__encode__flight_8py"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>bufr_encode_flight.py</b></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:bufr__expanded_8py"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>bufr_expanded.py</b></td></tr>
@@ -139,6 +141,8 @@ Files</h2></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:grib__keys__iterator_8py"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>grib_keys_iterator.py</b></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:grib__ls___j_s_o_n_8py"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>grib_ls_JSON.py</b></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:grib__multi__write_8py"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>grib_multi_write.py</b></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:grib__nearest_8py"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>grib_nearest.py</b></td></tr>
@@ -159,6 +163,8 @@ Files</h2></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:gts__get__keys_8py"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>gts_get_keys.py</b></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:high__level__api_8py"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>high_level_api.py</b></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:keys__iterator__bufr_8py"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>keys_iterator_bufr.py</b></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:keys__iterator__gts_8py"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>keys_iterator_gts.py</b></td></tr>
diff --git a/html/dir_da7ee69c60c6cc261c862ec60d8c4bc7.html b/html/dir_da7ee69c60c6cc261c862ec60d8c4bc7.html
index a363a64..4eed1ca 100644
--- a/html/dir_da7ee69c60c6cc261c862ec60d8c4bc7.html
+++ b/html/dir_da7ee69c60c6cc261c862ec60d8c4bc7.html
@@ -91,6 +91,8 @@ Files</h2></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:bufr__clone_8c"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>bufr_clone.c</b></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:bufr__copy__data_8c"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>bufr_copy_data.c</b></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:bufr__expanded_8c"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>bufr_expanded.c</b></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:bufr__get__keys_8c"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>bufr_get_keys.c</b></td></tr>
@@ -99,6 +101,8 @@ Files</h2></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:bufr__missing_8c"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>bufr_missing.c</b></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:bufr__pthreads_8c"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>bufr_pthreads.c</b></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:bufr__read__header_8c"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>bufr_read_header.c</b></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:bufr__read__scatterometer_8c"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>bufr_read_scatterometer.c</b></td></tr>
diff --git a/html/eccodes_8h.html b/html/eccodes_8h.html
index c79fc88..49c83ef 100644
--- a/html/eccodes_8h.html
+++ b/html/eccodes_8h.html
@@ -109,6 +109,8 @@ Macros</h2></td></tr>
 <tr class="separator:ga532be495f6cd54a852288a88bd0a439f"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:ga441c09493c38e1ab2fc7f296eb12516f"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__keys__iterator.html#ga441c09493c38e1ab2fc7f296eb12516f">CODES_KEYS_ITERATOR_SKIP_FUNCTION</a>   (1<<6)</td></tr>
 <tr class="separator:ga441c09493c38e1ab2fc7f296eb12516f"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gabbc4e63f0a52df1a3dab96610fca4f18"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__keys__iterator.html#gabbc4e63f0a52df1a3dab96610fca4f18">CODES_KEYS_ITERATOR_DUMP_ONLY</a>   (1<<7)</td></tr>
+<tr class="separator:gabbc4e63f0a52df1a3dab96610fca4f18"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:ga62529e45321708e65678dfc155f1c842"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__errors.html#ga62529e45321708e65678dfc155f1c842">CODES_SUCCESS</a>   0</td></tr>
 <tr class="memdesc:ga62529e45321708e65678dfc155f1c842"><td class="mdescLeft"> </td><td class="mdescRight">No error.  <a href="group__errors.html#ga62529e45321708e65678dfc155f1c842">More...</a><br/></td></tr>
 <tr class="separator:ga62529e45321708e65678dfc155f1c842"><td class="memSeparator" colspan="2"> </td></tr>
@@ -161,7 +163,7 @@ Macros</h2></td></tr>
 <tr class="memdesc:ga6bcc67f9220042cb4781bad71fd59f35"><td class="mdescLeft"> </td><td class="mdescRight">Problem with calculation of geographic attributes.  <a href="group__errors.html#ga6bcc67f9220042cb4781bad71fd59f35">More...</a><br/></td></tr>
 <tr class="separator:ga6bcc67f9220042cb4781bad71fd59f35"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:gaca540f40b9e09270265636b3689d8c2e"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__errors.html#gaca540f40b9e09270265636b3689d8c2e">CODES_OUT_OF_MEMORY</a>   -17</td></tr>
-<tr class="memdesc:gaca540f40b9e09270265636b3689d8c2e"><td class="mdescLeft"> </td><td class="mdescRight">Out of memory.  <a href="group__errors.html#gaca540f40b9e09270265636b3689d8c2e">More...</a><br/></td></tr>
+<tr class="memdesc:gaca540f40b9e09270265636b3689d8c2e"><td class="mdescLeft"> </td><td class="mdescRight">Memory allocation error.  <a href="group__errors.html#gaca540f40b9e09270265636b3689d8c2e">More...</a><br/></td></tr>
 <tr class="separator:gaca540f40b9e09270265636b3689d8c2e"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:gab1809244c05808791f318e1e060592d3"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__errors.html#gab1809244c05808791f318e1e060592d3">CODES_READ_ONLY</a>   -18</td></tr>
 <tr class="memdesc:gab1809244c05808791f318e1e060592d3"><td class="mdescLeft"> </td><td class="mdescRight">Value is read only.  <a href="group__errors.html#gab1809244c05808791f318e1e060592d3">More...</a><br/></td></tr>
@@ -364,9 +366,9 @@ Functions</h2></td></tr>
 <tr class="memitem:gac82dbaba240ebf6e76cdbcf2007a6bee"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__codes__handle.html#gac82dbaba240ebf6e76cdbcf2007a6bee">codes_write_message</a> (<a class="el" href="structcodes__handle.html">codes_handle</a> *h, const char *file, const char *mode)</td></tr>
 <tr class="memdesc:gac82dbaba240ebf6e76cdbcf2007a6bee"><td class="mdescLeft"> </td><td class="mdescRight">Write a coded message to a file.  <a href="group__codes__handle.html#gac82dbaba240ebf6e76cdbcf2007a6bee">More...</a><br/></td></tr>
 <tr class="separator:gac82dbaba240ebf6e76cdbcf2007a6bee"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:gaece49330c864391261cd6a0c10a18dc2"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structcodes__handle.html">codes_handle</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__codes__handle.html#gaece49330c864391261cd6a0c10a18dc2">codes_handle_new_from_message</a> (<a class="el" href="structcodes__context.html">codes_context</a> *c, void *data, size_t data_len)</td></tr>
-<tr class="memdesc:gaece49330c864391261cd6a0c10a18dc2"><td class="mdescLeft"> </td><td class="mdescRight">Create a handle from a user message in memory.  <a href="group__codes__handle.html#gaece49330c864391261cd6a0c10a18dc2">More...</a><br/></td></tr>
-<tr class="separator:gaece49330c864391261cd6a0c10a18dc2"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga095447ed85ff2142dbda2867ee3b4c8d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structcodes__handle.html">codes_handle</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__codes__handle.html#ga095447ed85ff2142dbda2867ee3b4c8d">codes_handle_new_from_message</a> (<a class="el" href="structcodes__context.html">codes_context</a> *c, const void *data, size_t data_len)</td></tr>
+<tr class="memdesc:ga095447ed85ff2142dbda2867ee3b4c8d"><td class="mdescLeft"> </td><td class="mdescRight">Create a handle from a user message in memory.  <a href="group__codes__handle.html#ga095447ed85ff2142dbda2867ee3b4c8d">More...</a><br/></td></tr>
+<tr class="separator:ga095447ed85ff2142dbda2867ee3b4c8d"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:ga385864d5f06e1de0e8ee13388ca4117c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structcodes__handle.html">codes_handle</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__codes__handle.html#ga385864d5f06e1de0e8ee13388ca4117c">codes_grib_handle_new_from_multi_message</a> (<a class="el" href="structcodes__context.html">codes_context</a> *c, void **data, size_t *data_len, int *error)</td></tr>
 <tr class="memdesc:ga385864d5f06e1de0e8ee13388ca4117c"><td class="mdescLeft"> </td><td class="mdescRight">Create a handle from a user message in memory.  <a href="group__codes__handle.html#ga385864d5f06e1de0e8ee13388ca4117c">More...</a><br/></td></tr>
 <tr class="separator:ga385864d5f06e1de0e8ee13388ca4117c"><td class="memSeparator" colspan="2"> </td></tr>
@@ -544,6 +546,9 @@ Functions</h2></td></tr>
 <tr class="memitem:a82249b16ee12f2e574397f8cccaafb7a"><td class="memItemLeft" align="right" valign="top">const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="eccodes_8h.html#a82249b16ee12f2e574397f8cccaafb7a">codes_get_git_sha1</a> (void)</td></tr>
 <tr class="memdesc:a82249b16ee12f2e574397f8cccaafb7a"><td class="mdescLeft"> </td><td class="mdescRight">Get the Git version control SHA1 identifier.  <a href="#a82249b16ee12f2e574397f8cccaafb7a">More...</a><br/></td></tr>
 <tr class="separator:a82249b16ee12f2e574397f8cccaafb7a"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ac263f88377b19e546fd259dbd2e92fa8"><td class="memItemLeft" align="right" valign="top">const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="eccodes_8h.html#ac263f88377b19e546fd259dbd2e92fa8">codes_get_package_name</a> (void)</td></tr>
+<tr class="memdesc:ac263f88377b19e546fd259dbd2e92fa8"><td class="mdescLeft"> </td><td class="mdescRight">Get the package name.  <a href="#ac263f88377b19e546fd259dbd2e92fa8">More...</a><br/></td></tr>
+<tr class="separator:ac263f88377b19e546fd259dbd2e92fa8"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:a8be52d40a8fb51642720d0b8adf6cdce"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="eccodes_8h.html#a8be52d40a8fb51642720d0b8adf6cdce">codes_print_api_version</a> (FILE *out)</td></tr>
 <tr class="memdesc:a8be52d40a8fb51642720d0b8adf6cdce"><td class="mdescLeft"> </td><td class="mdescRight">Prints the API version.  <a href="#a8be52d40a8fb51642720d0b8adf6cdce">More...</a><br/></td></tr>
 <tr class="separator:a8be52d40a8fb51642720d0b8adf6cdce"><td class="memSeparator" colspan="2"> </td></tr>
@@ -675,7 +680,7 @@ Functions</h2></td></tr>
 <p>Get the API version.</p>
 <p>Returns the version of the api as a string in the format "major.minor.revision". </p>
 
-<p>Referenced by <a class="el" href="namespaceec_codes.html#a267636dba6361f74b330275a1f8e1ed7">ecCodes::codes_index_get()</a>, and <a class="el" href="namespaceec_codes.html#a92041c59bf04e6db88395077802dfe74">ecCodes::codes_index_select()</a>.</p>
+<p>Referenced by <a class="el" href="namespaceec_codes.html#a267636dba6361f74b330275a1f8e1ed7">ecCodes::codes_index_get()</a>.</p>
 
 </div>
 </div>
@@ -723,6 +728,25 @@ Functions</h2></td></tr>
 
 </div>
 </div>
+<a class="anchor" id="ac263f88377b19e546fd259dbd2e92fa8"></a>
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const char* codes_get_package_name </td>
+          <td>(</td>
+          <td class="paramtype">void </td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Get the package name. </p>
+<dl class="section return"><dt>Returns</dt><dd>character string with package name </dd></dl>
+
+</div>
+</div>
 <a class="anchor" id="a8be52d40a8fb51642720d0b8adf6cdce"></a>
 <div class="memitem">
 <div class="memproto">
diff --git a/html/functions.html b/html/functions.html
index 5049628..500d50b 100644
--- a/html/functions.html
+++ b/html/functions.html
@@ -72,7 +72,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
   </div>
   <div id="navrow4" class="tabs3">
     <ul class="tablist">
-      <li><a href="#index_c"><span>c</span></a></li>
+      <li class="current"><a href="functions.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
     </ul>
   </div>
 </div><!-- top -->
@@ -97,6 +98,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 <li>codes_any_new_from_file()
 : <a class="el" href="classeccodes.html#aa468943e1c669487375b2e3d46ff84b1">eccodes</a>
 </li>
+<li>codes_bufr_copy_data()
+: <a class="el" href="classeccodes.html#a030c4f01609c1206deef936ba3e0029b">eccodes</a>
+</li>
 <li>codes_bufr_new_from_file()
 : <a class="el" href="classeccodes.html#a94050d64954482cd82ea6f007fdc9ac0">eccodes</a>
 </li>
@@ -112,6 +116,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 <li>codes_close_file()
 : <a class="el" href="classeccodes.html#a436a01aabf91cdbb4c5902a5d1a2886e">eccodes</a>
 </li>
+<li>codes_copy_key()
+: <a class="el" href="classeccodes.html#a43bbbee406c2e974ae9cd4dcea41bd4d">eccodes</a>
+</li>
 <li>codes_copy_message()
 : <a class="el" href="classeccodes.html#afdd32c1a78f0a3d54992e0a6a6bfc66b">eccodes</a>
 </li>
@@ -163,12 +170,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 , <a class="el" href="classeccodes.html#ae1df5b7389172122fe2c84c4156f18d0">eccodes</a>
 </li>
 <li>codes_get_real4_element()
-: <a class="el" href="interfaceeccodes_1_1codes__get__element.html#a95426fb251262a83fbdcc5ae86968b4b">eccodes::codes_get_element</a>
-, <a class="el" href="classeccodes.html#a95426fb251262a83fbdcc5ae86968b4b">eccodes</a>
+: <a class="el" href="classeccodes.html#a9d846a6d3872e4fdb991b007b7ab1301">eccodes</a>
+, <a class="el" href="interfaceeccodes_1_1codes__get__element.html#a9d846a6d3872e4fdb991b007b7ab1301">eccodes::codes_get_element</a>
 </li>
 <li>codes_get_real4_elements()
-: <a class="el" href="classeccodes.html#a0587c719213f5eb38afbb80cb30a2b8b">eccodes</a>
-, <a class="el" href="interfaceeccodes_1_1codes__get__element.html#a0587c719213f5eb38afbb80cb30a2b8b">eccodes::codes_get_element</a>
+: <a class="el" href="interfaceeccodes_1_1codes__get__element.html#a6e52b77671af20322bd3fc72282449e3">eccodes::codes_get_element</a>
+, <a class="el" href="classeccodes.html#a6e52b77671af20322bd3fc72282449e3">eccodes</a>
 </li>
 <li>codes_get_real8()
 : <a class="el" href="interfaceeccodes_1_1codes__get.html#a2ca22327e21aca686d29f8953e235839">eccodes::codes_get</a>
@@ -179,12 +186,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 , <a class="el" href="classeccodes.html#a4b28e570e54dad5a779e0452d3ed66d4">eccodes</a>
 </li>
 <li>codes_get_real8_element()
-: <a class="el" href="interfaceeccodes_1_1codes__get__element.html#ac9ceb83558433f918eac6aeb00b620af">eccodes::codes_get_element</a>
-, <a class="el" href="classeccodes.html#ac9ceb83558433f918eac6aeb00b620af">eccodes</a>
+: <a class="el" href="interfaceeccodes_1_1codes__get__element.html#a7f8c1bc6b5c77950fe80d324c99e541a">eccodes::codes_get_element</a>
+, <a class="el" href="classeccodes.html#a7f8c1bc6b5c77950fe80d324c99e541a">eccodes</a>
 </li>
 <li>codes_get_real8_elements()
-: <a class="el" href="interfaceeccodes_1_1codes__get__element.html#a1e550ade4f5781f19718fa8bdec802f9">eccodes::codes_get_element</a>
-, <a class="el" href="classeccodes.html#a1e550ade4f5781f19718fa8bdec802f9">eccodes</a>
+: <a class="el" href="interfaceeccodes_1_1codes__get__element.html#ad2652d9dd45016f29721a60a5104867f">eccodes::codes_get_element</a>
+, <a class="el" href="classeccodes.html#ad2652d9dd45016f29721a60a5104867f">eccodes</a>
 </li>
 <li>codes_get_size_int()
 : <a class="el" href="interfaceeccodes_1_1codes__get__size.html#ac566c4909f1ea554517d256a780cf87f">eccodes::codes_get_size</a>
@@ -202,16 +209,16 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 : <a class="el" href="classeccodes.html#a731aac9d5d75917e12048573ae86e7c6">eccodes</a>
 </li>
 <li>codes_grib_find_nearest_four_single()
-: <a class="el" href="interfaceeccodes_1_1codes__grib__find__nearest.html#ad4b53c47aecc5fa5ae43c95357d2d690">eccodes::codes_grib_find_nearest</a>
-, <a class="el" href="classeccodes.html#ad4b53c47aecc5fa5ae43c95357d2d690">eccodes</a>
+: <a class="el" href="interfaceeccodes_1_1codes__grib__find__nearest.html#a2b677451802af47da342addf6624870a">eccodes::codes_grib_find_nearest</a>
+, <a class="el" href="classeccodes.html#a2b677451802af47da342addf6624870a">eccodes</a>
 </li>
 <li>codes_grib_find_nearest_multiple()
 : <a class="el" href="interfaceeccodes_1_1codes__grib__find__nearest.html#acb92b7a78966c0b2f53ee6e288bff673">eccodes::codes_grib_find_nearest</a>
 , <a class="el" href="classeccodes.html#acb92b7a78966c0b2f53ee6e288bff673">eccodes</a>
 </li>
 <li>codes_grib_find_nearest_single()
-: <a class="el" href="interfaceeccodes_1_1codes__grib__find__nearest.html#a036ae036cc766718ad224851d47d99a2">eccodes::codes_grib_find_nearest</a>
-, <a class="el" href="classeccodes.html#a036ae036cc766718ad224851d47d99a2">eccodes</a>
+: <a class="el" href="interfaceeccodes_1_1codes__grib__find__nearest.html#a96fb4afe88914ad24ac796fbecc453c4">eccodes::codes_grib_find_nearest</a>
+, <a class="el" href="classeccodes.html#a96fb4afe88914ad24ac796fbecc453c4">eccodes</a>
 </li>
 <li>codes_grib_get_data_real4()
 : <a class="el" href="interfaceeccodes_1_1codes__grib__get__data.html#a0e93200c0e6e4bdacaf1bec1e0a29ee7">eccodes::codes_grib_get_data</a>
@@ -328,12 +335,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 : <a class="el" href="classeccodes.html#a2852e5519e2ff8596e461986b99092d7">eccodes</a>
 </li>
 <li>codes_new_from_message_char()
-: <a class="el" href="interfaceeccodes_1_1codes__new__from__message.html#a9734463b78e04c3e803acb25d3314436">eccodes::codes_new_from_message</a>
-, <a class="el" href="classeccodes.html#a9734463b78e04c3e803acb25d3314436">eccodes</a>
+: <a class="el" href="classeccodes.html#a9734463b78e04c3e803acb25d3314436">eccodes</a>
+, <a class="el" href="interfaceeccodes_1_1codes__new__from__message.html#a9734463b78e04c3e803acb25d3314436">eccodes::codes_new_from_message</a>
 </li>
 <li>codes_new_from_message_int4()
-: <a class="el" href="classeccodes.html#af9d90d4940f54ecebb44acb69a59d496">eccodes</a>
-, <a class="el" href="interfaceeccodes_1_1codes__new__from__message.html#af9d90d4940f54ecebb44acb69a59d496">eccodes::codes_new_from_message</a>
+: <a class="el" href="interfaceeccodes_1_1codes__new__from__message.html#af9d90d4940f54ecebb44acb69a59d496">eccodes::codes_new_from_message</a>
+, <a class="el" href="classeccodes.html#af9d90d4940f54ecebb44acb69a59d496">eccodes</a>
 </li>
 <li>codes_open_file()
 : <a class="el" href="classeccodes.html#a28594e26f2f4b92b9c60e943dd8e1be3">eccodes</a>
@@ -375,16 +382,16 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 , <a class="el" href="classeccodes.html#ab84434f52a4a41e68bf3103c392482ae">eccodes</a>
 </li>
 <li>codes_read_from_file_char_size_t()
-: <a class="el" href="interfaceeccodes_1_1codes__read__from__file.html#a9ca8b8009071657b338508a3d6709b8d">eccodes::codes_read_from_file</a>
-, <a class="el" href="classeccodes.html#a9ca8b8009071657b338508a3d6709b8d">eccodes</a>
+: <a class="el" href="classeccodes.html#a9ca8b8009071657b338508a3d6709b8d">eccodes</a>
+, <a class="el" href="interfaceeccodes_1_1codes__read__from__file.html#a9ca8b8009071657b338508a3d6709b8d">eccodes::codes_read_from_file</a>
 </li>
 <li>codes_read_from_file_int4()
 : <a class="el" href="interfaceeccodes_1_1codes__read__from__file.html#a7b5b61cc34b32aae4c3f2deeacbc50ae">eccodes::codes_read_from_file</a>
 , <a class="el" href="classeccodes.html#a7b5b61cc34b32aae4c3f2deeacbc50ae">eccodes</a>
 </li>
 <li>codes_read_from_file_int4_size_t()
-: <a class="el" href="classeccodes.html#aa04bacd625a2a87d7e490c0361643da3">eccodes</a>
-, <a class="el" href="interfaceeccodes_1_1codes__read__from__file.html#aa04bacd625a2a87d7e490c0361643da3">eccodes::codes_read_from_file</a>
+: <a class="el" href="interfaceeccodes_1_1codes__read__from__file.html#aa04bacd625a2a87d7e490c0361643da3">eccodes::codes_read_from_file</a>
+, <a class="el" href="classeccodes.html#aa04bacd625a2a87d7e490c0361643da3">eccodes</a>
 </li>
 <li>codes_read_from_file_real4()
 : <a class="el" href="classeccodes.html#aa4182b2add068f538b335c8efd1a8d5f">eccodes</a>
@@ -402,8 +409,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 : <a class="el" href="classeccodes.html#a1c0ab28b0ae33f04d267d794a8bdd4b7">eccodes</a>
 </li>
 <li>codes_set_byte_array()
-: <a class="el" href="classeccodes.html#a292d71c0a7252bdfded6a38aea4284be">eccodes</a>
-, <a class="el" href="interfaceeccodes_1_1codes__set.html#a292d71c0a7252bdfded6a38aea4284be">eccodes::codes_set</a>
+: <a class="el" href="interfaceeccodes_1_1codes__set.html#a292d71c0a7252bdfded6a38aea4284be">eccodes::codes_set</a>
+, <a class="el" href="classeccodes.html#a292d71c0a7252bdfded6a38aea4284be">eccodes</a>
 </li>
 <li>codes_set_definitions_path()
 : <a class="el" href="classeccodes.html#a8544407e16786d6d72df0fc3cc37ff3a">eccodes</a>
@@ -413,8 +420,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 , <a class="el" href="interfaceeccodes_1_1codes__set.html#ac060bb983b9e515db8ad7edd3d91ce9a">eccodes::codes_set</a>
 </li>
 <li>codes_set_int_array()
-: <a class="el" href="classeccodes.html#a18b5890c85f15d5fefeefc2b99a09ce5">eccodes</a>
-, <a class="el" href="interfaceeccodes_1_1codes__set.html#a18b5890c85f15d5fefeefc2b99a09ce5">eccodes::codes_set</a>
+: <a class="el" href="interfaceeccodes_1_1codes__set.html#a18b5890c85f15d5fefeefc2b99a09ce5">eccodes::codes_set</a>
+, <a class="el" href="classeccodes.html#a18b5890c85f15d5fefeefc2b99a09ce5">eccodes</a>
 </li>
 <li>codes_set_long()
 : <a class="el" href="classeccodes.html#a3c9cdc65f00b3c36742206e6e3dde864">eccodes</a>
@@ -428,20 +435,20 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 : <a class="el" href="classeccodes.html#aa85273eb59a545d73f7e3a48516fd5f9">eccodes</a>
 </li>
 <li>codes_set_real4()
-: <a class="el" href="classeccodes.html#a2614a1e015c16370ed18cc360a14663e">eccodes</a>
-, <a class="el" href="interfaceeccodes_1_1codes__set.html#a2614a1e015c16370ed18cc360a14663e">eccodes::codes_set</a>
+: <a class="el" href="interfaceeccodes_1_1codes__set.html#a2614a1e015c16370ed18cc360a14663e">eccodes::codes_set</a>
+, <a class="el" href="classeccodes.html#a2614a1e015c16370ed18cc360a14663e">eccodes</a>
 </li>
 <li>codes_set_real4_array()
-: <a class="el" href="classeccodes.html#aabaefc49c8d603bcf18a627dacc38f15">eccodes</a>
-, <a class="el" href="interfaceeccodes_1_1codes__set.html#aabaefc49c8d603bcf18a627dacc38f15">eccodes::codes_set</a>
+: <a class="el" href="interfaceeccodes_1_1codes__set.html#aabaefc49c8d603bcf18a627dacc38f15">eccodes::codes_set</a>
+, <a class="el" href="classeccodes.html#aabaefc49c8d603bcf18a627dacc38f15">eccodes</a>
 </li>
 <li>codes_set_real8()
 : <a class="el" href="interfaceeccodes_1_1codes__set.html#a4b20fe82de5ba6f8355ff8a5d2725b3d">eccodes::codes_set</a>
 , <a class="el" href="classeccodes.html#a4b20fe82de5ba6f8355ff8a5d2725b3d">eccodes</a>
 </li>
 <li>codes_set_real8_array()
-: <a class="el" href="interfaceeccodes_1_1codes__set.html#a14b3bc17ea1ee83936f32dd0fced44a4">eccodes::codes_set</a>
-, <a class="el" href="classeccodes.html#a14b3bc17ea1ee83936f32dd0fced44a4">eccodes</a>
+: <a class="el" href="classeccodes.html#a14b3bc17ea1ee83936f32dd0fced44a4">eccodes</a>
+, <a class="el" href="interfaceeccodes_1_1codes__set.html#a14b3bc17ea1ee83936f32dd0fced44a4">eccodes::codes_set</a>
 </li>
 <li>codes_set_samples_path()
 : <a class="el" href="classeccodes.html#af4be467f3273e17111becbd483c25018">eccodes</a>
@@ -485,16 +492,16 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 , <a class="el" href="interfaceeccodes_1_1codes__write__bytes.html#a771149b4e451839ed7713540de92ce27">eccodes::codes_write_bytes</a>
 </li>
 <li>codes_write_bytes_real4()
-: <a class="el" href="classeccodes.html#a7f69c7e70900ace352970851a4ee5267">eccodes</a>
-, <a class="el" href="interfaceeccodes_1_1codes__write__bytes.html#a7f69c7e70900ace352970851a4ee5267">eccodes::codes_write_bytes</a>
+: <a class="el" href="interfaceeccodes_1_1codes__write__bytes.html#a7f69c7e70900ace352970851a4ee5267">eccodes::codes_write_bytes</a>
+, <a class="el" href="classeccodes.html#a7f69c7e70900ace352970851a4ee5267">eccodes</a>
 </li>
 <li>codes_write_bytes_real4_size_t()
-: <a class="el" href="classeccodes.html#a7467f8b7c399f5579bd4be244de100dc">eccodes</a>
-, <a class="el" href="interfaceeccodes_1_1codes__write__bytes.html#a7467f8b7c399f5579bd4be244de100dc">eccodes::codes_write_bytes</a>
+: <a class="el" href="interfaceeccodes_1_1codes__write__bytes.html#a7467f8b7c399f5579bd4be244de100dc">eccodes::codes_write_bytes</a>
+, <a class="el" href="classeccodes.html#a7467f8b7c399f5579bd4be244de100dc">eccodes</a>
 </li>
 <li>codes_write_bytes_real8()
-: <a class="el" href="interfaceeccodes_1_1codes__write__bytes.html#aabda087d7f8ba266b0b9f307270f876a">eccodes::codes_write_bytes</a>
-, <a class="el" href="classeccodes.html#aabda087d7f8ba266b0b9f307270f876a">eccodes</a>
+: <a class="el" href="classeccodes.html#aabda087d7f8ba266b0b9f307270f876a">eccodes</a>
+, <a class="el" href="interfaceeccodes_1_1codes__write__bytes.html#aabda087d7f8ba266b0b9f307270f876a">eccodes::codes_write_bytes</a>
 </li>
 <li>codes_write_bytes_real8_size_t()
 : <a class="el" href="classeccodes.html#a2d0be96a6b529f7e0b8079318a5376bb">eccodes</a>
diff --git a/html/functions_0x74.html b/html/functions_0x74.html
new file mode 100644
index 0000000..170aae2
--- /dev/null
+++ b/html/functions_0x74.html
@@ -0,0 +1,156 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.5"/>
+<title>eccodes: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+  $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">eccodes
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.5 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="modules.html"><span>C Interface</span></a></li>
+      <li><a href="classeccodes.html"><span>F90 Interface</span></a></li>
+      <li><a href="namespaces.html"><span>Python Interface</span></a></li>
+      <li>
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Data Structures</span></a></li>
+      <li class="current"><a href="functions.html"><span>Data Fields</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow3" class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow4" class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions.html#index_c"><span>c</span></a></li>
+      <li class="current"><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+    </ul>
+  </div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectIt [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:</div>
+
+<h3><a class="anchor" id="index_t"></a>- t -</h3><ul>
+<li>test_clone()
+: <a class="el" href="classhigh__level__api_1_1_test_grib_message.html#ac4ad8985e15d4cb25c2907c09f76891b">TestGribMessage</a>
+, <a class="el" href="classhigh__level__api_1_1_test_bufr_message.html#ac4ad8985e15d4cb25c2907c09f76891b">TestBufrMessage</a>
+</li>
+<li>test_content()
+: <a class="el" href="classhigh__level__api_1_1_test_bufr_message.html#aae0bd902ad06975ab7daff87c34aea50">TestBufrMessage</a>
+</li>
+<li>test_create_and_serialize_index()
+: <a class="el" href="classhigh__level__api_1_1_test_grib_index.html#a66286a9b57f5493b5f366cda130d4c32">TestGribIndex</a>
+</li>
+<li>test_index_comprehension()
+: <a class="el" href="classhigh__level__api_1_1_test_grib_index.html#a3a4f65d7dfe52f1248010fe1cdae2f01">TestGribIndex</a>
+</li>
+<li>test_iterator_protocol()
+: <a class="el" href="classhigh__level__api_1_1_test_grib_file.html#ac296c5581454cae229c9e926509488f4">TestGribFile</a>
+, <a class="el" href="classhigh__level__api_1_1_test_bufr_file.html#ac296c5581454cae229c9e926509488f4">TestBufrFile</a>
+</li>
+<li>test_memory_management()
+: <a class="el" href="classhigh__level__api_1_1_test_grib_file.html#a4794a05e5b1eb5d444652bae54f04128">TestGribFile</a>
+, <a class="el" href="classhigh__level__api_1_1_test_grib_index.html#a4794a05e5b1eb5d444652bae54f04128">TestGribIndex</a>
+, <a class="el" href="classhigh__level__api_1_1_test_bufr_file.html#a4794a05e5b1eb5d444652bae54f04128">TestBufrFile</a>
+</li>
+<li>test_message_counting_works()
+: <a class="el" href="classhigh__level__api_1_1_test_grib_file.html#a400f7c3570e6aac8231fb9e7e55a16a2">TestGribFile</a>
+, <a class="el" href="classhigh__level__api_1_1_test_bufr_file.html#a400f7c3570e6aac8231fb9e7e55a16a2">TestBufrFile</a>
+</li>
+<li>test_metadata()
+: <a class="el" href="classhigh__level__api_1_1_test_grib_message.html#a494685737e2cd151570101279bffe4c2">TestGribMessage</a>
+, <a class="el" href="classhigh__level__api_1_1_test_bufr_message.html#a494685737e2cd151570101279bffe4c2">TestBufrMessage</a>
+</li>
+<li>test_missing_message_behaviour()
+: <a class="el" href="classhigh__level__api_1_1_test_grib_message.html#a4dcbe8806395648ca284d88976042231">TestGribMessage</a>
+</li>
+<li>test_read_invalid_file()
+: <a class="el" href="classhigh__level__api_1_1_test_bufr_file.html#adf65917be1841c4717dee205457d576b">TestBufrFile</a>
+, <a class="el" href="classhigh__level__api_1_1_test_grib_file.html#adf65917be1841c4717dee205457d576b">TestGribFile</a>
+</li>
+<li>test_read_past_last_message()
+: <a class="el" href="classhigh__level__api_1_1_test_grib_file.html#a42d0160d68272b2d96cdffbc2db5f3f2">TestGribFile</a>
+, <a class="el" href="classhigh__level__api_1_1_test_bufr_file.html#a42d0160d68272b2d96cdffbc2db5f3f2">TestBufrFile</a>
+</li>
+<li>test_serialize()
+: <a class="el" href="classhigh__level__api_1_1_test_bufr_message.html#aa2e02e263da64ba84940736a7f00fd96">TestBufrMessage</a>
+, <a class="el" href="classhigh__level__api_1_1_test_grib_message.html#aa2e02e263da64ba84940736a7f00fd96">TestGribMessage</a>
+</li>
+<li>test_value_setting()
+: <a class="el" href="classhigh__level__api_1_1_test_bufr_message.html#a9cab109486b0ae16e800b8777db052e7">TestBufrMessage</a>
+, <a class="el" href="classhigh__level__api_1_1_test_grib_message.html#a9cab109486b0ae16e800b8777db052e7">TestGribMessage</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by  <a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.5
+</small></address>
+</body>
+</html>
diff --git a/html/functions_func.html b/html/functions_func.html
index 91dfe71..bfd2b78 100644
--- a/html/functions_func.html
+++ b/html/functions_func.html
@@ -72,7 +72,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
   </div>
   <div id="navrow4" class="tabs3">
     <ul class="tablist">
-      <li><a href="#index_c"><span>c</span></a></li>
+      <li class="current"><a href="functions_func.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
     </ul>
   </div>
 </div><!-- top -->
@@ -97,6 +98,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 <li>codes_any_new_from_file()
 : <a class="el" href="classeccodes.html#aa468943e1c669487375b2e3d46ff84b1">eccodes</a>
 </li>
+<li>codes_bufr_copy_data()
+: <a class="el" href="classeccodes.html#a030c4f01609c1206deef936ba3e0029b">eccodes</a>
+</li>
 <li>codes_bufr_new_from_file()
 : <a class="el" href="classeccodes.html#a94050d64954482cd82ea6f007fdc9ac0">eccodes</a>
 </li>
@@ -112,6 +116,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 <li>codes_close_file()
 : <a class="el" href="classeccodes.html#a436a01aabf91cdbb4c5902a5d1a2886e">eccodes</a>
 </li>
+<li>codes_copy_key()
+: <a class="el" href="classeccodes.html#a43bbbee406c2e974ae9cd4dcea41bd4d">eccodes</a>
+</li>
 <li>codes_copy_message()
 : <a class="el" href="classeccodes.html#afdd32c1a78f0a3d54992e0a6a6bfc66b">eccodes</a>
 </li>
@@ -163,12 +170,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 , <a class="el" href="classeccodes.html#ae1df5b7389172122fe2c84c4156f18d0">eccodes</a>
 </li>
 <li>codes_get_real4_element()
-: <a class="el" href="interfaceeccodes_1_1codes__get__element.html#a95426fb251262a83fbdcc5ae86968b4b">eccodes::codes_get_element</a>
-, <a class="el" href="classeccodes.html#a95426fb251262a83fbdcc5ae86968b4b">eccodes</a>
+: <a class="el" href="classeccodes.html#a9d846a6d3872e4fdb991b007b7ab1301">eccodes</a>
+, <a class="el" href="interfaceeccodes_1_1codes__get__element.html#a9d846a6d3872e4fdb991b007b7ab1301">eccodes::codes_get_element</a>
 </li>
 <li>codes_get_real4_elements()
-: <a class="el" href="classeccodes.html#a0587c719213f5eb38afbb80cb30a2b8b">eccodes</a>
-, <a class="el" href="interfaceeccodes_1_1codes__get__element.html#a0587c719213f5eb38afbb80cb30a2b8b">eccodes::codes_get_element</a>
+: <a class="el" href="interfaceeccodes_1_1codes__get__element.html#a6e52b77671af20322bd3fc72282449e3">eccodes::codes_get_element</a>
+, <a class="el" href="classeccodes.html#a6e52b77671af20322bd3fc72282449e3">eccodes</a>
 </li>
 <li>codes_get_real8()
 : <a class="el" href="interfaceeccodes_1_1codes__get.html#a2ca22327e21aca686d29f8953e235839">eccodes::codes_get</a>
@@ -179,12 +186,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 , <a class="el" href="classeccodes.html#a4b28e570e54dad5a779e0452d3ed66d4">eccodes</a>
 </li>
 <li>codes_get_real8_element()
-: <a class="el" href="interfaceeccodes_1_1codes__get__element.html#ac9ceb83558433f918eac6aeb00b620af">eccodes::codes_get_element</a>
-, <a class="el" href="classeccodes.html#ac9ceb83558433f918eac6aeb00b620af">eccodes</a>
+: <a class="el" href="interfaceeccodes_1_1codes__get__element.html#a7f8c1bc6b5c77950fe80d324c99e541a">eccodes::codes_get_element</a>
+, <a class="el" href="classeccodes.html#a7f8c1bc6b5c77950fe80d324c99e541a">eccodes</a>
 </li>
 <li>codes_get_real8_elements()
-: <a class="el" href="interfaceeccodes_1_1codes__get__element.html#a1e550ade4f5781f19718fa8bdec802f9">eccodes::codes_get_element</a>
-, <a class="el" href="classeccodes.html#a1e550ade4f5781f19718fa8bdec802f9">eccodes</a>
+: <a class="el" href="interfaceeccodes_1_1codes__get__element.html#ad2652d9dd45016f29721a60a5104867f">eccodes::codes_get_element</a>
+, <a class="el" href="classeccodes.html#ad2652d9dd45016f29721a60a5104867f">eccodes</a>
 </li>
 <li>codes_get_size_int()
 : <a class="el" href="interfaceeccodes_1_1codes__get__size.html#ac566c4909f1ea554517d256a780cf87f">eccodes::codes_get_size</a>
@@ -202,16 +209,16 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 : <a class="el" href="classeccodes.html#a731aac9d5d75917e12048573ae86e7c6">eccodes</a>
 </li>
 <li>codes_grib_find_nearest_four_single()
-: <a class="el" href="interfaceeccodes_1_1codes__grib__find__nearest.html#ad4b53c47aecc5fa5ae43c95357d2d690">eccodes::codes_grib_find_nearest</a>
-, <a class="el" href="classeccodes.html#ad4b53c47aecc5fa5ae43c95357d2d690">eccodes</a>
+: <a class="el" href="interfaceeccodes_1_1codes__grib__find__nearest.html#a2b677451802af47da342addf6624870a">eccodes::codes_grib_find_nearest</a>
+, <a class="el" href="classeccodes.html#a2b677451802af47da342addf6624870a">eccodes</a>
 </li>
 <li>codes_grib_find_nearest_multiple()
 : <a class="el" href="interfaceeccodes_1_1codes__grib__find__nearest.html#acb92b7a78966c0b2f53ee6e288bff673">eccodes::codes_grib_find_nearest</a>
 , <a class="el" href="classeccodes.html#acb92b7a78966c0b2f53ee6e288bff673">eccodes</a>
 </li>
 <li>codes_grib_find_nearest_single()
-: <a class="el" href="interfaceeccodes_1_1codes__grib__find__nearest.html#a036ae036cc766718ad224851d47d99a2">eccodes::codes_grib_find_nearest</a>
-, <a class="el" href="classeccodes.html#a036ae036cc766718ad224851d47d99a2">eccodes</a>
+: <a class="el" href="interfaceeccodes_1_1codes__grib__find__nearest.html#a96fb4afe88914ad24ac796fbecc453c4">eccodes::codes_grib_find_nearest</a>
+, <a class="el" href="classeccodes.html#a96fb4afe88914ad24ac796fbecc453c4">eccodes</a>
 </li>
 <li>codes_grib_get_data_real4()
 : <a class="el" href="interfaceeccodes_1_1codes__grib__get__data.html#a0e93200c0e6e4bdacaf1bec1e0a29ee7">eccodes::codes_grib_get_data</a>
@@ -328,12 +335,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 : <a class="el" href="classeccodes.html#a2852e5519e2ff8596e461986b99092d7">eccodes</a>
 </li>
 <li>codes_new_from_message_char()
-: <a class="el" href="interfaceeccodes_1_1codes__new__from__message.html#a9734463b78e04c3e803acb25d3314436">eccodes::codes_new_from_message</a>
-, <a class="el" href="classeccodes.html#a9734463b78e04c3e803acb25d3314436">eccodes</a>
+: <a class="el" href="classeccodes.html#a9734463b78e04c3e803acb25d3314436">eccodes</a>
+, <a class="el" href="interfaceeccodes_1_1codes__new__from__message.html#a9734463b78e04c3e803acb25d3314436">eccodes::codes_new_from_message</a>
 </li>
 <li>codes_new_from_message_int4()
-: <a class="el" href="classeccodes.html#af9d90d4940f54ecebb44acb69a59d496">eccodes</a>
-, <a class="el" href="interfaceeccodes_1_1codes__new__from__message.html#af9d90d4940f54ecebb44acb69a59d496">eccodes::codes_new_from_message</a>
+: <a class="el" href="interfaceeccodes_1_1codes__new__from__message.html#af9d90d4940f54ecebb44acb69a59d496">eccodes::codes_new_from_message</a>
+, <a class="el" href="classeccodes.html#af9d90d4940f54ecebb44acb69a59d496">eccodes</a>
 </li>
 <li>codes_open_file()
 : <a class="el" href="classeccodes.html#a28594e26f2f4b92b9c60e943dd8e1be3">eccodes</a>
@@ -375,16 +382,16 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 , <a class="el" href="classeccodes.html#ab84434f52a4a41e68bf3103c392482ae">eccodes</a>
 </li>
 <li>codes_read_from_file_char_size_t()
-: <a class="el" href="interfaceeccodes_1_1codes__read__from__file.html#a9ca8b8009071657b338508a3d6709b8d">eccodes::codes_read_from_file</a>
-, <a class="el" href="classeccodes.html#a9ca8b8009071657b338508a3d6709b8d">eccodes</a>
+: <a class="el" href="classeccodes.html#a9ca8b8009071657b338508a3d6709b8d">eccodes</a>
+, <a class="el" href="interfaceeccodes_1_1codes__read__from__file.html#a9ca8b8009071657b338508a3d6709b8d">eccodes::codes_read_from_file</a>
 </li>
 <li>codes_read_from_file_int4()
 : <a class="el" href="interfaceeccodes_1_1codes__read__from__file.html#a7b5b61cc34b32aae4c3f2deeacbc50ae">eccodes::codes_read_from_file</a>
 , <a class="el" href="classeccodes.html#a7b5b61cc34b32aae4c3f2deeacbc50ae">eccodes</a>
 </li>
 <li>codes_read_from_file_int4_size_t()
-: <a class="el" href="classeccodes.html#aa04bacd625a2a87d7e490c0361643da3">eccodes</a>
-, <a class="el" href="interfaceeccodes_1_1codes__read__from__file.html#aa04bacd625a2a87d7e490c0361643da3">eccodes::codes_read_from_file</a>
+: <a class="el" href="interfaceeccodes_1_1codes__read__from__file.html#aa04bacd625a2a87d7e490c0361643da3">eccodes::codes_read_from_file</a>
+, <a class="el" href="classeccodes.html#aa04bacd625a2a87d7e490c0361643da3">eccodes</a>
 </li>
 <li>codes_read_from_file_real4()
 : <a class="el" href="classeccodes.html#aa4182b2add068f538b335c8efd1a8d5f">eccodes</a>
@@ -402,8 +409,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 : <a class="el" href="classeccodes.html#a1c0ab28b0ae33f04d267d794a8bdd4b7">eccodes</a>
 </li>
 <li>codes_set_byte_array()
-: <a class="el" href="classeccodes.html#a292d71c0a7252bdfded6a38aea4284be">eccodes</a>
-, <a class="el" href="interfaceeccodes_1_1codes__set.html#a292d71c0a7252bdfded6a38aea4284be">eccodes::codes_set</a>
+: <a class="el" href="interfaceeccodes_1_1codes__set.html#a292d71c0a7252bdfded6a38aea4284be">eccodes::codes_set</a>
+, <a class="el" href="classeccodes.html#a292d71c0a7252bdfded6a38aea4284be">eccodes</a>
 </li>
 <li>codes_set_definitions_path()
 : <a class="el" href="classeccodes.html#a8544407e16786d6d72df0fc3cc37ff3a">eccodes</a>
@@ -413,8 +420,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 , <a class="el" href="interfaceeccodes_1_1codes__set.html#ac060bb983b9e515db8ad7edd3d91ce9a">eccodes::codes_set</a>
 </li>
 <li>codes_set_int_array()
-: <a class="el" href="classeccodes.html#a18b5890c85f15d5fefeefc2b99a09ce5">eccodes</a>
-, <a class="el" href="interfaceeccodes_1_1codes__set.html#a18b5890c85f15d5fefeefc2b99a09ce5">eccodes::codes_set</a>
+: <a class="el" href="interfaceeccodes_1_1codes__set.html#a18b5890c85f15d5fefeefc2b99a09ce5">eccodes::codes_set</a>
+, <a class="el" href="classeccodes.html#a18b5890c85f15d5fefeefc2b99a09ce5">eccodes</a>
 </li>
 <li>codes_set_long()
 : <a class="el" href="classeccodes.html#a3c9cdc65f00b3c36742206e6e3dde864">eccodes</a>
@@ -428,20 +435,20 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 : <a class="el" href="classeccodes.html#aa85273eb59a545d73f7e3a48516fd5f9">eccodes</a>
 </li>
 <li>codes_set_real4()
-: <a class="el" href="classeccodes.html#a2614a1e015c16370ed18cc360a14663e">eccodes</a>
-, <a class="el" href="interfaceeccodes_1_1codes__set.html#a2614a1e015c16370ed18cc360a14663e">eccodes::codes_set</a>
+: <a class="el" href="interfaceeccodes_1_1codes__set.html#a2614a1e015c16370ed18cc360a14663e">eccodes::codes_set</a>
+, <a class="el" href="classeccodes.html#a2614a1e015c16370ed18cc360a14663e">eccodes</a>
 </li>
 <li>codes_set_real4_array()
-: <a class="el" href="classeccodes.html#aabaefc49c8d603bcf18a627dacc38f15">eccodes</a>
-, <a class="el" href="interfaceeccodes_1_1codes__set.html#aabaefc49c8d603bcf18a627dacc38f15">eccodes::codes_set</a>
+: <a class="el" href="interfaceeccodes_1_1codes__set.html#aabaefc49c8d603bcf18a627dacc38f15">eccodes::codes_set</a>
+, <a class="el" href="classeccodes.html#aabaefc49c8d603bcf18a627dacc38f15">eccodes</a>
 </li>
 <li>codes_set_real8()
 : <a class="el" href="interfaceeccodes_1_1codes__set.html#a4b20fe82de5ba6f8355ff8a5d2725b3d">eccodes::codes_set</a>
 , <a class="el" href="classeccodes.html#a4b20fe82de5ba6f8355ff8a5d2725b3d">eccodes</a>
 </li>
 <li>codes_set_real8_array()
-: <a class="el" href="interfaceeccodes_1_1codes__set.html#a14b3bc17ea1ee83936f32dd0fced44a4">eccodes::codes_set</a>
-, <a class="el" href="classeccodes.html#a14b3bc17ea1ee83936f32dd0fced44a4">eccodes</a>
+: <a class="el" href="classeccodes.html#a14b3bc17ea1ee83936f32dd0fced44a4">eccodes</a>
+, <a class="el" href="interfaceeccodes_1_1codes__set.html#a14b3bc17ea1ee83936f32dd0fced44a4">eccodes::codes_set</a>
 </li>
 <li>codes_set_samples_path()
 : <a class="el" href="classeccodes.html#af4be467f3273e17111becbd483c25018">eccodes</a>
@@ -485,16 +492,16 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 , <a class="el" href="interfaceeccodes_1_1codes__write__bytes.html#a771149b4e451839ed7713540de92ce27">eccodes::codes_write_bytes</a>
 </li>
 <li>codes_write_bytes_real4()
-: <a class="el" href="classeccodes.html#a7f69c7e70900ace352970851a4ee5267">eccodes</a>
-, <a class="el" href="interfaceeccodes_1_1codes__write__bytes.html#a7f69c7e70900ace352970851a4ee5267">eccodes::codes_write_bytes</a>
+: <a class="el" href="interfaceeccodes_1_1codes__write__bytes.html#a7f69c7e70900ace352970851a4ee5267">eccodes::codes_write_bytes</a>
+, <a class="el" href="classeccodes.html#a7f69c7e70900ace352970851a4ee5267">eccodes</a>
 </li>
 <li>codes_write_bytes_real4_size_t()
-: <a class="el" href="classeccodes.html#a7467f8b7c399f5579bd4be244de100dc">eccodes</a>
-, <a class="el" href="interfaceeccodes_1_1codes__write__bytes.html#a7467f8b7c399f5579bd4be244de100dc">eccodes::codes_write_bytes</a>
+: <a class="el" href="interfaceeccodes_1_1codes__write__bytes.html#a7467f8b7c399f5579bd4be244de100dc">eccodes::codes_write_bytes</a>
+, <a class="el" href="classeccodes.html#a7467f8b7c399f5579bd4be244de100dc">eccodes</a>
 </li>
 <li>codes_write_bytes_real8()
-: <a class="el" href="interfaceeccodes_1_1codes__write__bytes.html#aabda087d7f8ba266b0b9f307270f876a">eccodes::codes_write_bytes</a>
-, <a class="el" href="classeccodes.html#aabda087d7f8ba266b0b9f307270f876a">eccodes</a>
+: <a class="el" href="classeccodes.html#aabda087d7f8ba266b0b9f307270f876a">eccodes</a>
+, <a class="el" href="interfaceeccodes_1_1codes__write__bytes.html#aabda087d7f8ba266b0b9f307270f876a">eccodes::codes_write_bytes</a>
 </li>
 <li>codes_write_bytes_real8_size_t()
 : <a class="el" href="classeccodes.html#a2d0be96a6b529f7e0b8079318a5376bb">eccodes</a>
diff --git a/html/functions_func_0x74.html b/html/functions_func_0x74.html
new file mode 100644
index 0000000..70266c6
--- /dev/null
+++ b/html/functions_func_0x74.html
@@ -0,0 +1,156 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.5"/>
+<title>eccodes: Data Fields - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+  $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">eccodes
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.5 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="modules.html"><span>C Interface</span></a></li>
+      <li><a href="classeccodes.html"><span>F90 Interface</span></a></li>
+      <li><a href="namespaces.html"><span>Python Interface</span></a></li>
+      <li>
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Data Structures</span></a></li>
+      <li class="current"><a href="functions.html"><span>Data Fields</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow3" class="tabs2">
+    <ul class="tablist">
+      <li><a href="functions.html"><span>All</span></a></li>
+      <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow4" class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions_func.html#index_c"><span>c</span></a></li>
+      <li class="current"><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+    </ul>
+  </div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectIt [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+ 
+
+<h3><a class="anchor" id="index_t"></a>- t -</h3><ul>
+<li>test_clone()
+: <a class="el" href="classhigh__level__api_1_1_test_grib_message.html#ac4ad8985e15d4cb25c2907c09f76891b">TestGribMessage</a>
+, <a class="el" href="classhigh__level__api_1_1_test_bufr_message.html#ac4ad8985e15d4cb25c2907c09f76891b">TestBufrMessage</a>
+</li>
+<li>test_content()
+: <a class="el" href="classhigh__level__api_1_1_test_bufr_message.html#aae0bd902ad06975ab7daff87c34aea50">TestBufrMessage</a>
+</li>
+<li>test_create_and_serialize_index()
+: <a class="el" href="classhigh__level__api_1_1_test_grib_index.html#a66286a9b57f5493b5f366cda130d4c32">TestGribIndex</a>
+</li>
+<li>test_index_comprehension()
+: <a class="el" href="classhigh__level__api_1_1_test_grib_index.html#a3a4f65d7dfe52f1248010fe1cdae2f01">TestGribIndex</a>
+</li>
+<li>test_iterator_protocol()
+: <a class="el" href="classhigh__level__api_1_1_test_grib_file.html#ac296c5581454cae229c9e926509488f4">TestGribFile</a>
+, <a class="el" href="classhigh__level__api_1_1_test_bufr_file.html#ac296c5581454cae229c9e926509488f4">TestBufrFile</a>
+</li>
+<li>test_memory_management()
+: <a class="el" href="classhigh__level__api_1_1_test_grib_file.html#a4794a05e5b1eb5d444652bae54f04128">TestGribFile</a>
+, <a class="el" href="classhigh__level__api_1_1_test_grib_index.html#a4794a05e5b1eb5d444652bae54f04128">TestGribIndex</a>
+, <a class="el" href="classhigh__level__api_1_1_test_bufr_file.html#a4794a05e5b1eb5d444652bae54f04128">TestBufrFile</a>
+</li>
+<li>test_message_counting_works()
+: <a class="el" href="classhigh__level__api_1_1_test_grib_file.html#a400f7c3570e6aac8231fb9e7e55a16a2">TestGribFile</a>
+, <a class="el" href="classhigh__level__api_1_1_test_bufr_file.html#a400f7c3570e6aac8231fb9e7e55a16a2">TestBufrFile</a>
+</li>
+<li>test_metadata()
+: <a class="el" href="classhigh__level__api_1_1_test_grib_message.html#a494685737e2cd151570101279bffe4c2">TestGribMessage</a>
+, <a class="el" href="classhigh__level__api_1_1_test_bufr_message.html#a494685737e2cd151570101279bffe4c2">TestBufrMessage</a>
+</li>
+<li>test_missing_message_behaviour()
+: <a class="el" href="classhigh__level__api_1_1_test_grib_message.html#a4dcbe8806395648ca284d88976042231">TestGribMessage</a>
+</li>
+<li>test_read_invalid_file()
+: <a class="el" href="classhigh__level__api_1_1_test_bufr_file.html#adf65917be1841c4717dee205457d576b">TestBufrFile</a>
+, <a class="el" href="classhigh__level__api_1_1_test_grib_file.html#adf65917be1841c4717dee205457d576b">TestGribFile</a>
+</li>
+<li>test_read_past_last_message()
+: <a class="el" href="classhigh__level__api_1_1_test_grib_file.html#a42d0160d68272b2d96cdffbc2db5f3f2">TestGribFile</a>
+, <a class="el" href="classhigh__level__api_1_1_test_bufr_file.html#a42d0160d68272b2d96cdffbc2db5f3f2">TestBufrFile</a>
+</li>
+<li>test_serialize()
+: <a class="el" href="classhigh__level__api_1_1_test_bufr_message.html#aa2e02e263da64ba84940736a7f00fd96">TestBufrMessage</a>
+, <a class="el" href="classhigh__level__api_1_1_test_grib_message.html#aa2e02e263da64ba84940736a7f00fd96">TestGribMessage</a>
+</li>
+<li>test_value_setting()
+: <a class="el" href="classhigh__level__api_1_1_test_bufr_message.html#a9cab109486b0ae16e800b8777db052e7">TestBufrMessage</a>
+, <a class="el" href="classhigh__level__api_1_1_test_grib_message.html#a9cab109486b0ae16e800b8777db052e7">TestGribMessage</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by  <a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.5
+</small></address>
+</body>
+</html>
diff --git a/html/globals.html b/html/globals.html
index 745a406..8611050 100644
--- a/html/globals.html
+++ b/html/globals.html
@@ -221,6 +221,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 <li>codes_get_offset()
 : <a class="el" href="group__get__set.html#gaefda2b7765e1b737bcd05a825d231a1d">eccodes.h</a>
 </li>
+<li>codes_get_package_name()
+: <a class="el" href="eccodes_8h.html#ac263f88377b19e546fd259dbd2e92fa8">eccodes.h</a>
+</li>
 <li>codes_get_size()
 : <a class="el" href="group__get__set.html#ga614d4f7a6c789a4fe60ea976b6644343">eccodes.h</a>
 </li>
@@ -315,7 +318,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 : <a class="el" href="group__codes__index.html#gae1947cf7225ca1809c5491aa671d6b91">eccodes.h</a>
 </li>
 <li>codes_handle_new_from_message()
-: <a class="el" href="group__codes__handle.html#gaece49330c864391261cd6a0c10a18dc2">eccodes.h</a>
+: <a class="el" href="group__codes__handle.html#ga095447ed85ff2142dbda2867ee3b4c8d">eccodes.h</a>
 </li>
 <li>codes_handle_new_from_message_copy()
 : <a class="el" href="group__codes__handle.html#ga079df0c709e381812ae13af08c354032">eccodes.h</a>
@@ -410,6 +413,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 <li>codes_keys_iterator_delete()
 : <a class="el" href="group__keys__iterator.html#gafdafe484a0e5a82732ddcbaec1e272a5">eccodes.h</a>
 </li>
+<li>CODES_KEYS_ITERATOR_DUMP_ONLY
+: <a class="el" href="group__keys__iterator.html#gabbc4e63f0a52df1a3dab96610fca4f18">eccodes.h</a>
+</li>
 <li>codes_keys_iterator_get_name()
 : <a class="el" href="group__keys__iterator.html#ga1049604cb5a47359f9c7f7a42571a48b">eccodes.h</a>
 </li>
diff --git a/html/globals_defs.html b/html/globals_defs.html
index c527f20..b66e328 100644
--- a/html/globals_defs.html
+++ b/html/globals_defs.html
@@ -200,6 +200,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 <li>CODES_KEYS_ITERATOR_ALL_KEYS
 : <a class="el" href="group__keys__iterator.html#gaa0b60d176497f5d4bc34564c31e76cf1">eccodes.h</a>
 </li>
+<li>CODES_KEYS_ITERATOR_DUMP_ONLY
+: <a class="el" href="group__keys__iterator.html#gabbc4e63f0a52df1a3dab96610fca4f18">eccodes.h</a>
+</li>
 <li>CODES_KEYS_ITERATOR_SKIP_CODED
 : <a class="el" href="group__keys__iterator.html#gae3286f2212339d42d43938d9c5c6255c">eccodes.h</a>
 </li>
diff --git a/html/globals_func.html b/html/globals_func.html
index f3b4373..b2f10e4 100644
--- a/html/globals_func.html
+++ b/html/globals_func.html
@@ -170,6 +170,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 <li>codes_get_offset()
 : <a class="el" href="group__get__set.html#gaefda2b7765e1b737bcd05a825d231a1d">eccodes.h</a>
 </li>
+<li>codes_get_package_name()
+: <a class="el" href="eccodes_8h.html#ac263f88377b19e546fd259dbd2e92fa8">eccodes.h</a>
+</li>
 <li>codes_get_size()
 : <a class="el" href="group__get__set.html#ga614d4f7a6c789a4fe60ea976b6644343">eccodes.h</a>
 </li>
@@ -264,7 +267,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 : <a class="el" href="group__codes__index.html#gae1947cf7225ca1809c5491aa671d6b91">eccodes.h</a>
 </li>
 <li>codes_handle_new_from_message()
-: <a class="el" href="group__codes__handle.html#gaece49330c864391261cd6a0c10a18dc2">eccodes.h</a>
+: <a class="el" href="group__codes__handle.html#ga095447ed85ff2142dbda2867ee3b4c8d">eccodes.h</a>
 </li>
 <li>codes_handle_new_from_message_copy()
 : <a class="el" href="group__codes__handle.html#ga079df0c709e381812ae13af08c354032">eccodes.h</a>
diff --git a/html/group__codes__handle.html b/html/group__codes__handle.html
index 7de41f1..022e734 100644
--- a/html/group__codes__handle.html
+++ b/html/group__codes__handle.html
@@ -106,9 +106,9 @@ Functions</h2></td></tr>
 <tr class="memitem:gac82dbaba240ebf6e76cdbcf2007a6bee"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__codes__handle.html#gac82dbaba240ebf6e76cdbcf2007a6bee">codes_write_message</a> (<a class="el" href="structcodes__handle.html">codes_handle</a> *h, const char *file, const char *mode)</td></tr>
 <tr class="memdesc:gac82dbaba240ebf6e76cdbcf2007a6bee"><td class="mdescLeft"> </td><td class="mdescRight">Write a coded message to a file.  <a href="#gac82dbaba240ebf6e76cdbcf2007a6bee">More...</a><br/></td></tr>
 <tr class="separator:gac82dbaba240ebf6e76cdbcf2007a6bee"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:gaece49330c864391261cd6a0c10a18dc2"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structcodes__handle.html">codes_handle</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__codes__handle.html#gaece49330c864391261cd6a0c10a18dc2">codes_handle_new_from_message</a> (<a class="el" href="structcodes__context.html">codes_context</a> *c, void *data, size_t data_len)</td></tr>
-<tr class="memdesc:gaece49330c864391261cd6a0c10a18dc2"><td class="mdescLeft"> </td><td class="mdescRight">Create a handle from a user message in memory.  <a href="#gaece49330c864391261cd6a0c10a18dc2">More...</a><br/></td></tr>
-<tr class="separator:gaece49330c864391261cd6a0c10a18dc2"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga095447ed85ff2142dbda2867ee3b4c8d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structcodes__handle.html">codes_handle</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__codes__handle.html#ga095447ed85ff2142dbda2867ee3b4c8d">codes_handle_new_from_message</a> (<a class="el" href="structcodes__context.html">codes_context</a> *c, const void *data, size_t data_len)</td></tr>
+<tr class="memdesc:ga095447ed85ff2142dbda2867ee3b4c8d"><td class="mdescLeft"> </td><td class="mdescRight">Create a handle from a user message in memory.  <a href="#ga095447ed85ff2142dbda2867ee3b4c8d">More...</a><br/></td></tr>
+<tr class="separator:ga095447ed85ff2142dbda2867ee3b4c8d"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:ga385864d5f06e1de0e8ee13388ca4117c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structcodes__handle.html">codes_handle</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__codes__handle.html#ga385864d5f06e1de0e8ee13388ca4117c">codes_grib_handle_new_from_multi_message</a> (<a class="el" href="structcodes__context.html">codes_context</a> *c, void **data, size_t *data_len, int *error)</td></tr>
 <tr class="memdesc:ga385864d5f06e1de0e8ee13388ca4117c"><td class="mdescLeft"> </td><td class="mdescRight">Create a handle from a user message in memory.  <a href="#ga385864d5f06e1de0e8ee13388ca4117c">More...</a><br/></td></tr>
 <tr class="separator:ga385864d5f06e1de0e8ee13388ca4117c"><td class="memSeparator" colspan="2"> </td></tr>
@@ -570,7 +570,7 @@ Functions</h2></td></tr>
 </div><div class="memdoc">
 
 <p>Frees a handle, also frees the message if it is not a user message. </p>
-<dl class="section see"><dt>See Also</dt><dd><a class="el" href="group__codes__handle.html#gaece49330c864391261cd6a0c10a18dc2" title="Create a handle from a user message in memory. ">codes_handle_new_from_message</a> </dd></dl>
+<dl class="section see"><dt>See Also</dt><dd><a class="el" href="group__codes__handle.html#ga095447ed85ff2142dbda2867ee3b4c8d" title="Create a handle from a user message in memory. ">codes_handle_new_from_message</a> </dd></dl>
 <dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramname">h</td><td>: The handle to be deleted </td></tr>
@@ -632,7 +632,7 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="gaece49330c864391261cd6a0c10a18dc2"></a>
+<a class="anchor" id="ga095447ed85ff2142dbda2867ee3b4c8d"></a>
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -645,7 +645,7 @@ Functions</h2></td></tr>
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">void * </td>
+          <td class="paramtype">const void * </td>
           <td class="paramname"><em>data</em>, </td>
         </tr>
         <tr>
diff --git a/html/group__errors.html b/html/group__errors.html
index 41f2cc5..4f3ab6f 100644
--- a/html/group__errors.html
+++ b/html/group__errors.html
@@ -135,7 +135,7 @@ Macros</h2></td></tr>
 <tr class="memdesc:ga6bcc67f9220042cb4781bad71fd59f35"><td class="mdescLeft"> </td><td class="mdescRight">Problem with calculation of geographic attributes.  <a href="#ga6bcc67f9220042cb4781bad71fd59f35">More...</a><br/></td></tr>
 <tr class="separator:ga6bcc67f9220042cb4781bad71fd59f35"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:gaca540f40b9e09270265636b3689d8c2e"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__errors.html#gaca540f40b9e09270265636b3689d8c2e">CODES_OUT_OF_MEMORY</a>   -17</td></tr>
-<tr class="memdesc:gaca540f40b9e09270265636b3689d8c2e"><td class="mdescLeft"> </td><td class="mdescRight">Out of memory.  <a href="#gaca540f40b9e09270265636b3689d8c2e">More...</a><br/></td></tr>
+<tr class="memdesc:gaca540f40b9e09270265636b3689d8c2e"><td class="mdescLeft"> </td><td class="mdescRight">Memory allocation error.  <a href="#gaca540f40b9e09270265636b3689d8c2e">More...</a><br/></td></tr>
 <tr class="separator:gaca540f40b9e09270265636b3689d8c2e"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:gab1809244c05808791f318e1e060592d3"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__errors.html#gab1809244c05808791f318e1e060592d3">CODES_READ_ONLY</a>   -18</td></tr>
 <tr class="memdesc:gab1809244c05808791f318e1e060592d3"><td class="mdescLeft"> </td><td class="mdescRight">Value is read only.  <a href="#gab1809244c05808791f318e1e060592d3">More...</a><br/></td></tr>
@@ -956,7 +956,7 @@ Macros</h2></td></tr>
       </table>
 </div><div class="memdoc">
 
-<p>Out of memory. </p>
+<p>Memory allocation error. </p>
 
 </div>
 </div>
diff --git a/html/group__get__set.html b/html/group__get__set.html
index 1ead2fa..ad4541d 100644
--- a/html/group__get__set.html
+++ b/html/group__get__set.html
@@ -378,7 +378,7 @@ Functions</h2></td></tr>
   <table class="params">
     <tr><td class="paramname">h</td><td>: the handle to get the data from </td></tr>
     <tr><td class="paramname">key</td><td>: the key to be searched </td></tr>
-    <tr><td class="paramname">i</td><td>: zero based index </td></tr>
+    <tr><td class="paramname">i</td><td>: zero-based index </td></tr>
     <tr><td class="paramname">value</td><td>: the address of a double where the data will be retrieved </td></tr>
   </table>
   </dd>
@@ -434,9 +434,9 @@ Functions</h2></td></tr>
   <table class="params">
     <tr><td class="paramname">h</td><td>: the handle to get the data from </td></tr>
     <tr><td class="paramname">key</td><td>: the key to be searched </td></tr>
-    <tr><td class="paramname">i</td><td>: zero based array of indexes </td></tr>
+    <tr><td class="paramname">i</td><td>: zero-based array of indexes </td></tr>
     <tr><td class="paramname">size</td><td>: size of the i and value arrays </td></tr>
-    <tr><td class="paramname">value</td><td>: the address of a double where the data will be retrieved </td></tr>
+    <tr><td class="paramname">value</td><td>: the double array for the data values </td></tr>
   </table>
   </dd>
 </dl>
diff --git a/html/group__keys__iterator.html b/html/group__keys__iterator.html
index 1eb625c..9719f85 100644
--- a/html/group__keys__iterator.html
+++ b/html/group__keys__iterator.html
@@ -106,6 +106,8 @@ Macros</h2></td></tr>
 <tr class="separator:ga532be495f6cd54a852288a88bd0a439f"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:ga441c09493c38e1ab2fc7f296eb12516f"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__keys__iterator.html#ga441c09493c38e1ab2fc7f296eb12516f">CODES_KEYS_ITERATOR_SKIP_FUNCTION</a>   (1<<6)</td></tr>
 <tr class="separator:ga441c09493c38e1ab2fc7f296eb12516f"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gabbc4e63f0a52df1a3dab96610fca4f18"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__keys__iterator.html#gabbc4e63f0a52df1a3dab96610fca4f18">CODES_KEYS_ITERATOR_DUMP_ONLY</a>   (1<<7)</td></tr>
+<tr class="separator:gabbc4e63f0a52df1a3dab96610fca4f18"><td class="memSeparator" colspan="2"> </td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
 Functions</h2></td></tr>
@@ -137,6 +139,20 @@ Functions</h2></td></tr>
 
 </div>
 </div>
+<a class="anchor" id="gabbc4e63f0a52df1a3dab96610fca4f18"></a>
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define CODES_KEYS_ITERATOR_DUMP_ONLY   (1<<7)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<pre class="fragment"> only keys present in the dump
+</pre><dl class="section see"><dt>See Also</dt><dd><a class="el" href="group__keys__iterator.html#gad3394316cf1f3c779648fe81428adb8f">codes_keys_iterator_new</a> </dd></dl>
+
+</div>
+</div>
 <a class="anchor" id="gae3286f2212339d42d43938d9c5c6255c"></a>
 <div class="memitem">
 <div class="memproto">
diff --git a/html/interfaceeccodes_1_1codes__get__element.html b/html/interfaceeccodes_1_1codes__get__element.html
index dc96686..eec0ca2 100644
--- a/html/interfaceeccodes_1_1codes__get__element.html
+++ b/html/interfaceeccodes_1_1codes__get__element.html
@@ -96,18 +96,18 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
 Public Member Functions</h2></td></tr>
-<tr class="memitem:a95426fb251262a83fbdcc5ae86968b4b"><td class="memItemLeft" align="right" valign="top">subroutine </td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceeccodes_1_1codes__get__element.html#a95426fb251262a83fbdcc5ae86968b4b">codes_get_real4_element</a> (msgid, key, index, value, status)</td></tr>
-<tr class="memdesc:a95426fb251262a83fbdcc5ae86968b4b"><td class="mdescLeft"> </td><td class="mdescRight">Get a real(4) value of specified index from an array key.  <a href="#a95426fb251262a83fbdcc5ae86968b4b">More...</a><br/></td></tr>
-<tr class="separator:a95426fb251262a83fbdcc5ae86968b4b"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ac9ceb83558433f918eac6aeb00b620af"><td class="memItemLeft" align="right" valign="top">subroutine </td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceeccodes_1_1codes__get__element.html#ac9ceb83558433f918eac6aeb00b620af">codes_get_real8_element</a> (msgid, key, index, value, status)</td></tr>
-<tr class="memdesc:ac9ceb83558433f918eac6aeb00b620af"><td class="mdescLeft"> </td><td class="mdescRight">Get a real(8) value of specified index from an array key.  <a href="#ac9ceb83558433f918eac6aeb00b620af">More...</a><br/></td></tr>
-<tr class="separator:ac9ceb83558433f918eac6aeb00b620af"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a0587c719213f5eb38afbb80cb30a2b8b"><td class="memItemLeft" align="right" valign="top">subroutine </td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceeccodes_1_1codes__get__element.html#a0587c719213f5eb38afbb80cb30a2b8b">codes_get_real4_elements</a> (msgid, key, index, value, status)</td></tr>
-<tr class="memdesc:a0587c719213f5eb38afbb80cb30a2b8b"><td class="mdescLeft"> </td><td class="mdescRight">Get the real(4) values whose indexes are stored in the array "index" from an array key.  <a href="#a0587c719213f5eb38afbb80cb30a2b8b">More...</a><br/></td></tr>
-<tr class="separator:a0587c719213f5eb38afbb80cb30a2b8b"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a1e550ade4f5781f19718fa8bdec802f9"><td class="memItemLeft" align="right" valign="top">subroutine </td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceeccodes_1_1codes__get__element.html#a1e550ade4f5781f19718fa8bdec802f9">codes_get_real8_elements</a> (msgid, key, index, value, status)</td></tr>
-<tr class="memdesc:a1e550ade4f5781f19718fa8bdec802f9"><td class="mdescLeft"> </td><td class="mdescRight">Get the real(8) values whose indexes are stored in the array "index" from an array key.  <a href="#a1e550ade4f5781f19718fa8bdec802f9">More...</a><br/></td></tr>
-<tr class="separator:a1e550ade4f5781f19718fa8bdec802f9"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a9d846a6d3872e4fdb991b007b7ab1301"><td class="memItemLeft" align="right" valign="top">subroutine </td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceeccodes_1_1codes__get__element.html#a9d846a6d3872e4fdb991b007b7ab1301">codes_get_real4_element</a> (msgid, key, kindex, value, status)</td></tr>
+<tr class="memdesc:a9d846a6d3872e4fdb991b007b7ab1301"><td class="mdescLeft"> </td><td class="mdescRight">Get a real(4) value of specified index from an array key.  <a href="#a9d846a6d3872e4fdb991b007b7ab1301">More...</a><br/></td></tr>
+<tr class="separator:a9d846a6d3872e4fdb991b007b7ab1301"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a7f8c1bc6b5c77950fe80d324c99e541a"><td class="memItemLeft" align="right" valign="top">subroutine </td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceeccodes_1_1codes__get__element.html#a7f8c1bc6b5c77950fe80d324c99e541a">codes_get_real8_element</a> (msgid, key, kindex, value, status)</td></tr>
+<tr class="memdesc:a7f8c1bc6b5c77950fe80d324c99e541a"><td class="mdescLeft"> </td><td class="mdescRight">Get a real(8) value of specified index from an array key.  <a href="#a7f8c1bc6b5c77950fe80d324c99e541a">More...</a><br/></td></tr>
+<tr class="separator:a7f8c1bc6b5c77950fe80d324c99e541a"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a6e52b77671af20322bd3fc72282449e3"><td class="memItemLeft" align="right" valign="top">subroutine </td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceeccodes_1_1codes__get__element.html#a6e52b77671af20322bd3fc72282449e3">codes_get_real4_elements</a> (msgid, key, kindex, value, status)</td></tr>
+<tr class="memdesc:a6e52b77671af20322bd3fc72282449e3"><td class="mdescLeft"> </td><td class="mdescRight">Get the real(4) values whose indexes are stored in the array "index" from an array key.  <a href="#a6e52b77671af20322bd3fc72282449e3">More...</a><br/></td></tr>
+<tr class="separator:a6e52b77671af20322bd3fc72282449e3"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ad2652d9dd45016f29721a60a5104867f"><td class="memItemLeft" align="right" valign="top">subroutine </td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceeccodes_1_1codes__get__element.html#ad2652d9dd45016f29721a60a5104867f">codes_get_real8_elements</a> (msgid, key, kindex, value, status)</td></tr>
+<tr class="memdesc:ad2652d9dd45016f29721a60a5104867f"><td class="mdescLeft"> </td><td class="mdescRight">Get the real(8) values whose indexes are stored in the array "index" from an array key.  <a href="#ad2652d9dd45016f29721a60a5104867f">More...</a><br/></td></tr>
+<tr class="separator:ad2652d9dd45016f29721a60a5104867f"><td class="memSeparator" colspan="2"> </td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>Get a value of specified index from an array key. </p>
@@ -127,7 +127,7 @@ Public Member Functions</h2></td></tr>
   </dd>
 </dl>
 </div><h2 class="groupheader">Member Function/Subroutine Documentation</h2>
-<a class="anchor" id="a95426fb251262a83fbdcc5ae86968b4b"></a>
+<a class="anchor" id="a9d846a6d3872e4fdb991b007b7ab1301"></a>
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -147,7 +147,7 @@ Public Member Functions</h2></td></tr>
           <td class="paramkey"></td>
           <td></td>
           <td class="paramtype">integer(kind=kindofint), intent(in) </td>
-          <td class="paramname"><em>index</em>, </td>
+          <td class="paramname"><em>kindex</em>, </td>
         </tr>
         <tr>
           <td class="paramkey"></td>
@@ -176,7 +176,7 @@ Public Member Functions</h2></td></tr>
   <table class="params">
     <tr><td class="paramname">msgid</td><td>id of the grib loaded in memory </td></tr>
     <tr><td class="paramname">key</td><td>key name </td></tr>
-    <tr><td class="paramname">index</td><td>integer(4) index </td></tr>
+    <tr><td class="paramname">kindex</td><td>integer(4) index </td></tr>
     <tr><td class="paramname">value</td><td>real(4) value </td></tr>
     <tr><td class="paramname">status</td><td>CODES_SUCCESS if OK, integer value on error </td></tr>
   </table>
@@ -185,7 +185,7 @@ Public Member Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a0587c719213f5eb38afbb80cb30a2b8b"></a>
+<a class="anchor" id="a6e52b77671af20322bd3fc72282449e3"></a>
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -205,7 +205,7 @@ Public Member Functions</h2></td></tr>
           <td class="paramkey"></td>
           <td></td>
           <td class="paramtype">integer(kind=kindofint), dimension(:), intent(in) </td>
-          <td class="paramname"><em>index</em>, </td>
+          <td class="paramname"><em>kindex</em>, </td>
         </tr>
         <tr>
           <td class="paramkey"></td>
@@ -234,7 +234,7 @@ Public Member Functions</h2></td></tr>
   <table class="params">
     <tr><td class="paramname">msgid</td><td>id of the grib loaded in memory </td></tr>
     <tr><td class="paramname">key</td><td>key name </td></tr>
-    <tr><td class="paramname">index</td><td>integer(4) array indexes </td></tr>
+    <tr><td class="paramname">kindex</td><td>integer(4) array indexes </td></tr>
     <tr><td class="paramname">value</td><td>real(4) array value </td></tr>
     <tr><td class="paramname">status</td><td>CODES_SUCCESS if OK, integer value on error </td></tr>
   </table>
@@ -243,7 +243,7 @@ Public Member Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="ac9ceb83558433f918eac6aeb00b620af"></a>
+<a class="anchor" id="a7f8c1bc6b5c77950fe80d324c99e541a"></a>
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -263,7 +263,7 @@ Public Member Functions</h2></td></tr>
           <td class="paramkey"></td>
           <td></td>
           <td class="paramtype">integer(kind=kindofint), intent(in) </td>
-          <td class="paramname"><em>index</em>, </td>
+          <td class="paramname"><em>kindex</em>, </td>
         </tr>
         <tr>
           <td class="paramkey"></td>
@@ -292,7 +292,7 @@ Public Member Functions</h2></td></tr>
   <table class="params">
     <tr><td class="paramname">msgid</td><td>id of the grib loaded in memory </td></tr>
     <tr><td class="paramname">key</td><td>key name </td></tr>
-    <tr><td class="paramname">index</td><td>integer(4) index </td></tr>
+    <tr><td class="paramname">kindex</td><td>integer(4) index </td></tr>
     <tr><td class="paramname">value</td><td>real(8) value </td></tr>
     <tr><td class="paramname">status</td><td>CODES_SUCCESS if OK, integer value on error </td></tr>
   </table>
@@ -301,7 +301,7 @@ Public Member Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a1e550ade4f5781f19718fa8bdec802f9"></a>
+<a class="anchor" id="ad2652d9dd45016f29721a60a5104867f"></a>
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -321,7 +321,7 @@ Public Member Functions</h2></td></tr>
           <td class="paramkey"></td>
           <td></td>
           <td class="paramtype">integer(kind=kindofint), dimension(:), intent(in) </td>
-          <td class="paramname"><em>index</em>, </td>
+          <td class="paramname"><em>kindex</em>, </td>
         </tr>
         <tr>
           <td class="paramkey"></td>
@@ -350,7 +350,7 @@ Public Member Functions</h2></td></tr>
   <table class="params">
     <tr><td class="paramname">msgid</td><td>id of the grib loaded in memory </td></tr>
     <tr><td class="paramname">key</td><td>key name </td></tr>
-    <tr><td class="paramname">index</td><td>integer(4) array index </td></tr>
+    <tr><td class="paramname">kindex</td><td>integer(4) array index </td></tr>
     <tr><td class="paramname">value</td><td>real(8) array value </td></tr>
     <tr><td class="paramname">status</td><td>CODES_SUCCESS if OK, integer value on error </td></tr>
   </table>
diff --git a/html/interfaceeccodes_1_1codes__grib__find__nearest.html b/html/interfaceeccodes_1_1codes__grib__find__nearest.html
index 7ef37af..313cbab 100644
--- a/html/interfaceeccodes_1_1codes__grib__find__nearest.html
+++ b/html/interfaceeccodes_1_1codes__grib__find__nearest.html
@@ -96,12 +96,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
 Public Member Functions</h2></td></tr>
-<tr class="memitem:a036ae036cc766718ad224851d47d99a2"><td class="memItemLeft" align="right" valign="top">subroutine </td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceeccodes_1_1codes__grib__find__nearest.html#a036ae036cc766718ad224851d47d99a2">codes_grib_find_nearest_single</a> (gribid, is_lsm, inlat, inlon, outlat, outlon, value, distance, index, status)</td></tr>
-<tr class="memdesc:a036ae036cc766718ad224851d47d99a2"><td class="mdescLeft"> </td><td class="mdescRight">Find the nearest point of a given latitude/longitude point.  <a href="#a036ae036cc766718ad224851d47d99a2">More...</a><br/></td></tr>
-<tr class="separator:a036ae036cc766718ad224851d47d99a2"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ad4b53c47aecc5fa5ae43c95357d2d690"><td class="memItemLeft" align="right" valign="top">subroutine </td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceeccodes_1_1codes__grib__find__nearest.html#ad4b53c47aecc5fa5ae43c95357d2d690">codes_grib_find_nearest_four_single</a> (gribid, is_lsm, inlat, inlon, outlat, outlon, value, distance, index, status)</td></tr>
-<tr class="memdesc:ad4b53c47aecc5fa5ae43c95357d2d690"><td class="mdescLeft"> </td><td class="mdescRight">Find the 4 nearest points of a latitude longitude point.  <a href="#ad4b53c47aecc5fa5ae43c95357d2d690">More...</a><br/></td></tr>
-<tr class="separator:ad4b53c47aecc5fa5ae43c95357d2d690"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a96fb4afe88914ad24ac796fbecc453c4"><td class="memItemLeft" align="right" valign="top">subroutine </td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceeccodes_1_1codes__grib__find__nearest.html#a96fb4afe88914ad24ac796fbecc453c4">codes_grib_find_nearest_single</a> (gribid, is_lsm, inlat, inlon, outlat, outlon, value, distance, kindex, status)</td></tr>
+<tr class="memdesc:a96fb4afe88914ad24ac796fbecc453c4"><td class="mdescLeft"> </td><td class="mdescRight">Find the nearest point of a given latitude/longitude point.  <a href="#a96fb4afe88914ad24ac796fbecc453c4">More...</a><br/></td></tr>
+<tr class="separator:a96fb4afe88914ad24ac796fbecc453c4"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a2b677451802af47da342addf6624870a"><td class="memItemLeft" align="right" valign="top">subroutine </td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceeccodes_1_1codes__grib__find__nearest.html#a2b677451802af47da342addf6624870a">codes_grib_find_nearest_four_single</a> (gribid, is_lsm, inlat, inlon, outlat, outlon, value, distance, kindex, status)</td></tr>
+<tr class="memdesc:a2b677451802af47da342addf6624870a"><td class="mdescLeft"> </td><td class="mdescRight">Find the 4 nearest points of a latitude longitude point.  <a href="#a2b677451802af47da342addf6624870a">More...</a><br/></td></tr>
+<tr class="separator:a2b677451802af47da342addf6624870a"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:acb92b7a78966c0b2f53ee6e288bff673"><td class="memItemLeft" align="right" valign="top">subroutine </td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceeccodes_1_1codes__grib__find__nearest.html#acb92b7a78966c0b2f53ee6e288bff673">codes_grib_find_nearest_multiple</a> (gribid, is_lsm, inlats, inlons, outlats, outlons, values, distances, indexes, status)</td></tr>
 <tr class="memdesc:acb92b7a78966c0b2f53ee6e288bff673"><td class="mdescLeft"> </td><td class="mdescRight">Find the nearest point of a set of points whose latitudes and longitudes are given in the inlats, inlons arrays respectively.  <a href="#acb92b7a78966c0b2f53ee6e288bff673">More...</a><br/></td></tr>
 <tr class="separator:acb92b7a78966c0b2f53ee6e288bff673"><td class="memSeparator" colspan="2"> </td></tr>
@@ -136,7 +136,7 @@ Public Member Functions</h2></td></tr>
   </dd>
 </dl>
 </div><h2 class="groupheader">Member Function/Subroutine Documentation</h2>
-<a class="anchor" id="ad4b53c47aecc5fa5ae43c95357d2d690"></a>
+<a class="anchor" id="a2b677451802af47da342addf6624870a"></a>
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -192,7 +192,7 @@ Public Member Functions</h2></td></tr>
           <td class="paramkey"></td>
           <td></td>
           <td class="paramtype">integer(kind = kindofint), dimension(4), intent(out) </td>
-          <td class="paramname"><em>index</em>, </td>
+          <td class="paramname"><em>kindex</em>, </td>
         </tr>
         <tr>
           <td class="paramkey"></td>
@@ -220,7 +220,7 @@ Public Member Functions</h2></td></tr>
     <tr><td class="paramname">outlat</td><td>latitude of the nearest point </td></tr>
     <tr><td class="paramname">outlon</td><td>longitude of the nearest point </td></tr>
     <tr><td class="paramname">distance</td><td>distance between the given point and its nearest </td></tr>
-    <tr><td class="paramname">index</td><td>zero based index </td></tr>
+    <tr><td class="paramname">kindex</td><td>zero based index </td></tr>
     <tr><td class="paramname">value</td><td>value of the field in the nearest point </td></tr>
     <tr><td class="paramname">status</td><td>CODES_SUCCESS if OK, integer value on error </td></tr>
   </table>
@@ -322,7 +322,7 @@ Public Member Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a036ae036cc766718ad224851d47d99a2"></a>
+<a class="anchor" id="a96fb4afe88914ad24ac796fbecc453c4"></a>
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -378,7 +378,7 @@ Public Member Functions</h2></td></tr>
           <td class="paramkey"></td>
           <td></td>
           <td class="paramtype">integer(kind = kindofint), intent(out) </td>
-          <td class="paramname"><em>index</em>, </td>
+          <td class="paramname"><em>kindex</em>, </td>
         </tr>
         <tr>
           <td class="paramkey"></td>
@@ -406,7 +406,7 @@ Public Member Functions</h2></td></tr>
     <tr><td class="paramname">outlat</td><td>latitude of the nearest point </td></tr>
     <tr><td class="paramname">outlon</td><td>longitude of the nearest point </td></tr>
     <tr><td class="paramname">distance</td><td>distance between the given point and its nearest </td></tr>
-    <tr><td class="paramname">index</td><td>zero based index </td></tr>
+    <tr><td class="paramname">kindex</td><td>zero based index </td></tr>
     <tr><td class="paramname">value</td><td>value of the field in the nearest point </td></tr>
     <tr><td class="paramname">status</td><td>CODES_SUCCESS if OK, integer value on error </td></tr>
   </table>
diff --git a/html/interfaceeccodes_1_1codes__set.html b/html/interfaceeccodes_1_1codes__set.html
index 92569cd..6dcf4b9 100644
--- a/html/interfaceeccodes_1_1codes__set.html
+++ b/html/interfaceeccodes_1_1codes__set.html
@@ -109,7 +109,7 @@ Public Member Functions</h2></td></tr>
 <tr class="memdesc:a4b20fe82de5ba6f8355ff8a5d2725b3d"><td class="mdescLeft"> </td><td class="mdescRight">Set the real(8) value for a key in a message.  <a href="#a4b20fe82de5ba6f8355ff8a5d2725b3d">More...</a><br/></td></tr>
 <tr class="separator:a4b20fe82de5ba6f8355ff8a5d2725b3d"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:a50acfd20f8dff8b4e547135057ef119a"><td class="memItemLeft" align="right" valign="top">subroutine </td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceeccodes_1_1codes__set.html#a50acfd20f8dff8b4e547135057ef119a">codes_set_string</a> (msgid, key, value, status)</td></tr>
-<tr class="memdesc:a50acfd20f8dff8b4e547135057ef119a"><td class="mdescLeft"> </td><td class="mdescRight">Set the character value for a string key in a message.<a href="#a50acfd20f8dff8b4e547135057ef119a">More...</a><br/></td></tr>
+<tr class="memdesc:a50acfd20f8dff8b4e547135057ef119a"><td class="mdescLeft"> </td><td class="mdescRight">*/  <a href="#a50acfd20f8dff8b4e547135057ef119a">More...</a><br/></td></tr>
 <tr class="separator:a50acfd20f8dff8b4e547135057ef119a"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:a18b5890c85f15d5fefeefc2b99a09ce5"><td class="memItemLeft" align="right" valign="top">subroutine </td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceeccodes_1_1codes__set.html#a18b5890c85f15d5fefeefc2b99a09ce5">codes_set_int_array</a> (msgid, key, value, status)</td></tr>
 <tr class="memdesc:a18b5890c85f15d5fefeefc2b99a09ce5"><td class="mdescLeft"> </td><td class="mdescRight">Set the integers values for an array key in a message.  <a href="#a18b5890c85f15d5fefeefc2b99a09ce5">More...</a><br/></td></tr>
@@ -647,6 +647,7 @@ Public Member Functions</h2></td></tr>
       </table>
 </div><div class="memdoc">
 
+<p>*/ </p>
 <p>Set the character value for a string key in a message.</p>
 <p>In case of error, if the status parameter (optional) is not given, the program will exit with an error message.<br/>
  Otherwise the error message can be gathered with <a class="el" href="classeccodes.html#a835de867b8ad79cc43f127e7048712f3">codes_get_error_string</a>.</p>
diff --git a/html/namespaceec_codes.html b/html/namespaceec_codes.html
index 6721a7e..0d4f9b6 100644
--- a/html/namespaceec_codes.html
+++ b/html/namespaceec_codes.html
@@ -81,7 +81,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 </div><!-- top -->
 <div class="header">
   <div class="summary">
-<a href="#nested-classes">Data Structures</a> |
 <a href="#func-members">Functions</a>  </div>
   <div class="headertitle">
 <div class="title">ecCodes Namespace Reference</div>  </div>
@@ -91,12 +90,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 <p>This package is the <b>Python</b> interface to <a class="el" href="namespaceec_codes.html" title="This package is the Python interface to ecCodes. ">ecCodes</a>.  
 <a href="#details">More...</a></p>
 <table class="memberdecls">
-<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
-Data Structures</h2></td></tr>
-<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classec_codes_1_1_codes_internal_error.html">CodesInternalError</a></td></tr>
-<tr class="memdesc:"><td class="mdescLeft"> </td><td class="mdescRight">Wrap errors coming from the C API in a Python exception object.  <a href="classec_codes_1_1_codes_internal_error.html#details">More...</a><br/></td></tr>
-<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
-</table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
 Functions</h2></td></tr>
 <tr class="memitem:ab06cc33b116103a54fadb4e2735e579a"><td class="memItemLeft" align="right" valign="top">def </td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceec_codes.html#ab06cc33b116103a54fadb4e2735e579a">codes_gts_new_from_file</a></td></tr>
@@ -211,11 +204,17 @@ Functions</h2></td></tr>
 <tr class="memdesc:aa619f32357c9107b5b6f96ad1fee4232"><td class="mdescLeft"> </td><td class="mdescRight">Set the double value for a key in a grib message.  <a href="#aa619f32357c9107b5b6f96ad1fee4232">More...</a><br/></td></tr>
 <tr class="separator:aa619f32357c9107b5b6f96ad1fee4232"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:a643c58a9acad239c081794c74a5b86d9"><td class="memItemLeft" align="right" valign="top">def </td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceec_codes.html#a643c58a9acad239c081794c74a5b86d9">codes_new_from_samples</a></td></tr>
-<tr class="memdesc:a643c58a9acad239c081794c74a5b86d9"><td class="mdescLeft"> </td><td class="mdescRight">Create a new valid GRIB message from a sample.  <a href="#a643c58a9acad239c081794c74a5b86d9">More...</a><br/></td></tr>
+<tr class="memdesc:a643c58a9acad239c081794c74a5b86d9"><td class="mdescLeft"> </td><td class="mdescRight">Create a new valid message from a sample for a given product.  <a href="#a643c58a9acad239c081794c74a5b86d9">More...</a><br/></td></tr>
 <tr class="separator:a643c58a9acad239c081794c74a5b86d9"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a1c476c5e2dfefa3693df1065e9bf1665"><td class="memItemLeft" align="right" valign="top">def </td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceec_codes.html#a1c476c5e2dfefa3693df1065e9bf1665">codes_grib_new_from_samples</a></td></tr>
+<tr class="memdesc:a1c476c5e2dfefa3693df1065e9bf1665"><td class="mdescLeft"> </td><td class="mdescRight">Create a new valid GRIB message from a sample.  <a href="#a1c476c5e2dfefa3693df1065e9bf1665">More...</a><br/></td></tr>
+<tr class="separator:a1c476c5e2dfefa3693df1065e9bf1665"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:ae042f8fe1cc86718ce658f3b992c87a2"><td class="memItemLeft" align="right" valign="top">def </td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceec_codes.html#ae042f8fe1cc86718ce658f3b992c87a2">codes_bufr_new_from_samples</a></td></tr>
 <tr class="memdesc:ae042f8fe1cc86718ce658f3b992c87a2"><td class="mdescLeft"> </td><td class="mdescRight">Create a new valid BUFR message from a sample.  <a href="#ae042f8fe1cc86718ce658f3b992c87a2">More...</a><br/></td></tr>
 <tr class="separator:ae042f8fe1cc86718ce658f3b992c87a2"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a3ba2700ed57b0a155f7dd76f6b1d8ab9"><td class="memItemLeft" align="right" valign="top">def </td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceec_codes.html#a3ba2700ed57b0a155f7dd76f6b1d8ab9">codes_bufr_copy_data</a></td></tr>
+<tr class="memdesc:a3ba2700ed57b0a155f7dd76f6b1d8ab9"><td class="mdescLeft"> </td><td class="mdescRight">Copy data values from a BUFR message msgid_src to another message msgid_dst.  <a href="#a3ba2700ed57b0a155f7dd76f6b1d8ab9">More...</a><br/></td></tr>
+<tr class="separator:a3ba2700ed57b0a155f7dd76f6b1d8ab9"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:ab49cb36625cd87b9d898844b1df32516"><td class="memItemLeft" align="right" valign="top">def </td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceec_codes.html#ab49cb36625cd87b9d898844b1df32516">codes_clone</a></td></tr>
 <tr class="memdesc:ab49cb36625cd87b9d898844b1df32516"><td class="mdescLeft"> </td><td class="mdescRight">Create a copy of a message.  <a href="#ab49cb36625cd87b9d898844b1df32516">More...</a><br/></td></tr>
 <tr class="separator:ab49cb36625cd87b9d898844b1df32516"><td class="memSeparator" colspan="2"> </td></tr>
@@ -225,12 +224,12 @@ Functions</h2></td></tr>
 <tr class="memitem:a441ff456dc9990951bf242f4d542713a"><td class="memItemLeft" align="right" valign="top">def </td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceec_codes.html#a441ff456dc9990951bf242f4d542713a">codes_get_double_array</a></td></tr>
 <tr class="memdesc:a441ff456dc9990951bf242f4d542713a"><td class="mdescLeft"> </td><td class="mdescRight">Get the value of the key as a NumPy array of doubles.  <a href="#a441ff456dc9990951bf242f4d542713a">More...</a><br/></td></tr>
 <tr class="separator:a441ff456dc9990951bf242f4d542713a"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a86388748f15624cd8fd2ec89d066295a"><td class="memItemLeft" align="right" valign="top">def </td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceec_codes.html#a86388748f15624cd8fd2ec89d066295a">grib_get_string_array</a></td></tr>
-<tr class="memdesc:a86388748f15624cd8fd2ec89d066295a"><td class="mdescLeft"> </td><td class="mdescRight">Get the value of the key as a list of strings.  <a href="#a86388748f15624cd8fd2ec89d066295a">More...</a><br/></td></tr>
-<tr class="separator:a86388748f15624cd8fd2ec89d066295a"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a2353707d7e586ce4255e3a93bc0f39d4"><td class="memItemLeft" align="right" valign="top">def </td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceec_codes.html#a2353707d7e586ce4255e3a93bc0f39d4">grib_set_string_array</a></td></tr>
-<tr class="memdesc:a2353707d7e586ce4255e3a93bc0f39d4"><td class="mdescLeft"> </td><td class="mdescRight">Set the value of the key to a string array.  <a href="#a2353707d7e586ce4255e3a93bc0f39d4">More...</a><br/></td></tr>
-<tr class="separator:a2353707d7e586ce4255e3a93bc0f39d4"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a5c08a280c84117684dfe5705dfad29f5"><td class="memItemLeft" align="right" valign="top">def </td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceec_codes.html#a5c08a280c84117684dfe5705dfad29f5">codes_get_string_array</a></td></tr>
+<tr class="memdesc:a5c08a280c84117684dfe5705dfad29f5"><td class="mdescLeft"> </td><td class="mdescRight">Get the value of the key as a list of strings.  <a href="#a5c08a280c84117684dfe5705dfad29f5">More...</a><br/></td></tr>
+<tr class="separator:a5c08a280c84117684dfe5705dfad29f5"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a54b35eededa62b2cb3a32b90060c0f2c"><td class="memItemLeft" align="right" valign="top">def </td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceec_codes.html#a54b35eededa62b2cb3a32b90060c0f2c">codes_set_string_array</a></td></tr>
+<tr class="memdesc:a54b35eededa62b2cb3a32b90060c0f2c"><td class="mdescLeft"> </td><td class="mdescRight">Set the value of the key to a string array.  <a href="#a54b35eededa62b2cb3a32b90060c0f2c">More...</a><br/></td></tr>
+<tr class="separator:a54b35eededa62b2cb3a32b90060c0f2c"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:a59e415f83b7f26b4575a5700ece65c14"><td class="memItemLeft" align="right" valign="top">def </td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceec_codes.html#a59e415f83b7f26b4575a5700ece65c14">codes_set_long_array</a></td></tr>
 <tr class="memdesc:a59e415f83b7f26b4575a5700ece65c14"><td class="mdescLeft"> </td><td class="mdescRight">Set the value of the key to an integer array.  <a href="#a59e415f83b7f26b4575a5700ece65c14">More...</a><br/></td></tr>
 <tr class="separator:a59e415f83b7f26b4575a5700ece65c14"><td class="memSeparator" colspan="2"> </td></tr>
@@ -415,7 +414,7 @@ Functions</h2></td></tr>
 <dl class="section return"><dt>Returns</dt><dd>id of the message loaded in memory </dd></dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -426,6 +425,53 @@ Functions</h2></td></tr>
 
 </div>
 </div>
+<a class="anchor" id="a3ba2700ed57b0a155f7dd76f6b1d8ab9"></a>
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">def ecCodes.codes_bufr_copy_data </td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname"><em>msgid_src</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"> </td>
+          <td class="paramname"><em>msgid_dst</em> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Copy data values from a BUFR message msgid_src to another message msgid_dst. </p>
+<p>Copies all the values in the data section that are present in the same position in the data tree and with the same number of values to the output handle.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">msgid_src</td><td>id of the message from which the data are copied </td></tr>
+    <tr><td class="paramname">msgid_dst</td><td>id of the message to which the data are copied </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>id of new message </dd></dl>
+<dl class="exception"><dt>Exceptions</dt><dd>
+  <table class="exception">
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>References <a class="el" href="namespaceec_codes.html#a441ff456dc9990951bf242f4d542713a">codes_get_double_array()</a>, <a class="el" href="namespaceec_codes.html#ab07293de06d6ef6c5810ea3f01723884">codes_get_size()</a>, and <a class="el" href="namespaceec_codes.html#a5c08a280c84117684dfe5705dfad29f5">codes_get_string_array()</a>.</p>
+
+<p>Referenced by <a class="el" href="namespaceec_codes.html#a643c58a9acad239c081794c74a5b86d9">codes_new_from_samples()</a>.</p>
+
+</div>
+</div>
 <a class="anchor" id="a44c10386781390c16f1a567590b33c11"></a>
 <div class="memitem">
 <div class="memproto">
@@ -464,7 +510,7 @@ Functions</h2></td></tr>
 <dl class="section return"><dt>Returns</dt><dd>id of the BUFR loaded in memory </dd></dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -491,7 +537,7 @@ Functions</h2></td></tr>
 
 <p>Create a new valid BUFR message from a sample. </p>
 <p>The available samples are picked up from the directory pointed to by the environment variable ECCODES_SAMPLES_PATH. To know where the samples directory is run the codes_info tool.<br/>
- <b>Examples:</b> <a href="https://software.ecmwf.int/wiki/display/ECC/grib_samples" target="_blank">grib_samples.py</a></p>
+ <b>Examples:</b> bufr_copy_data.py</p>
 <dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramname">samplename</td><td>name of the BUFR sample to be used </td></tr>
@@ -501,14 +547,14 @@ Functions</h2></td></tr>
 <dl class="section return"><dt>Returns</dt><dd>id of the message loaded in memory </dd></dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
 
-<p>References <a class="el" href="namespaceec_codes.html#a441ff456dc9990951bf242f4d542713a">codes_get_double_array()</a>, and <a class="el" href="namespaceec_codes.html#ab07293de06d6ef6c5810ea3f01723884">codes_get_size()</a>.</p>
+<p>References <a class="el" href="namespaceec_codes.html#ac18c28cc7bd146dad986e03511fb7340">codes_set_double_array()</a>.</p>
 
-<p>Referenced by <a class="el" href="namespaceec_codes.html#ae623fa09d65a3f699026a86d0e4864da">codes_set_long()</a>.</p>
+<p>Referenced by <a class="el" href="namespaceec_codes.html#aa619f32357c9107b5b6f96ad1fee4232">codes_set_double()</a>, and <a class="el" href="namespaceec_codes.html#ae623fa09d65a3f699026a86d0e4864da">codes_set_long()</a>.</p>
 
 </div>
 </div>
@@ -538,14 +584,14 @@ Functions</h2></td></tr>
 <dl class="section return"><dt>Returns</dt><dd>id of clone </dd></dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
 
-<p>References <a class="el" href="namespaceec_codes.html#ab07293de06d6ef6c5810ea3f01723884">codes_get_size()</a>, and <a class="el" href="namespaceec_codes.html#a86388748f15624cd8fd2ec89d066295a">grib_get_string_array()</a>.</p>
+<p>References <a class="el" href="namespaceec_codes.html#ab07293de06d6ef6c5810ea3f01723884">codes_get_size()</a>.</p>
 
-<p>Referenced by <a class="el" href="namespaceec_codes.html#aa619f32357c9107b5b6f96ad1fee4232">codes_set_double()</a>.</p>
+<p>Referenced by <a class="el" href="namespaceec_codes.html#a1c476c5e2dfefa3693df1065e9bf1665">codes_grib_new_from_samples()</a>.</p>
 
 </div>
 </div>
@@ -590,12 +636,14 @@ Functions</h2></td></tr>
 </dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
 
-<p>Referenced by <a class="el" href="namespaceec_codes.html#a2353707d7e586ce4255e3a93bc0f39d4">grib_set_string_array()</a>.</p>
+<p>References <a class="el" href="namespaceec_codes.html#aeaf2ac58b4a90bd09595986d49228d7c">codes_index_get_long()</a>.</p>
+
+<p>Referenced by <a class="el" href="namespaceec_codes.html#a54b35eededa62b2cb3a32b90060c0f2c">codes_set_string_array()</a>.</p>
 
 </div>
 </div>
@@ -624,7 +672,7 @@ Functions</h2></td></tr>
 <dl class="section return"><dt>Returns</dt><dd>number of messages in the file </dd></dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -681,7 +729,7 @@ Functions</h2></td></tr>
 <dl class="section return"><dt>Returns</dt><dd>scalar value of key as int, float or str </dd></dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -710,7 +758,7 @@ Functions</h2></td></tr>
 <p>Get the API version.</p>
 <p>Returns the version of the api as a string in the format "major.minor.revision". </p>
 
-<p>Referenced by <a class="el" href="namespaceec_codes.html#a267636dba6361f74b330275a1f8e1ed7">codes_index_get()</a>, and <a class="el" href="namespaceec_codes.html#a92041c59bf04e6db88395077802dfe74">codes_index_select()</a>.</p>
+<p>Referenced by <a class="el" href="namespaceec_codes.html#a267636dba6361f74b330275a1f8e1ed7">codes_index_get()</a>.</p>
 
 </div>
 </div>
@@ -757,7 +805,7 @@ Functions</h2></td></tr>
 <dl class="section return"><dt>Returns</dt><dd>numpy.ndarray </dd></dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -803,7 +851,7 @@ Functions</h2></td></tr>
 <dl class="section return"><dt>Returns</dt><dd>value of key as float </dd></dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -849,14 +897,14 @@ Functions</h2></td></tr>
 <dl class="section return"><dt>Returns</dt><dd>numpy.ndarray </dd></dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
 
 <p>References <a class="el" href="namespaceec_codes.html#a59e415f83b7f26b4575a5700ece65c14">codes_set_long_array()</a>.</p>
 
-<p>Referenced by <a class="el" href="namespaceec_codes.html#ae042f8fe1cc86718ce658f3b992c87a2">codes_bufr_new_from_samples()</a>, <a class="el" href="namespaceec_codes.html#a1250285cb0770393bf6078f3ee3340a2">codes_get_native_type()</a>, and <a class="el" href="namespaceec_codes.html#a134bac0edaf47f29051ad905a30fb63e">codes_grib_find_nearest()</a>.</p>
+<p>Referenced by <a class="el" href="namespaceec_codes.html#a3ba2700ed57b0a155f7dd76f6b1d8ab9">codes_bufr_copy_data()</a>, <a class="el" href="namespaceec_codes.html#a1250285cb0770393bf6078f3ee3340a2">codes_get_native_type()</a>, and <a class="el" href="namespaceec_codes.html#a134bac0edaf47f29051ad905a30fb63e">codes_grib_find_nearest()</a>.</p>
 
 </div>
 </div>
@@ -902,7 +950,7 @@ Functions</h2></td></tr>
 <dl class="section return"><dt>Returns</dt><dd>value </dd></dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -953,11 +1001,13 @@ Functions</h2></td></tr>
 <dl class="section return"><dt>Returns</dt><dd>numpy.ndarray </dd></dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
 
+<p>References <a class="el" href="namespaceec_codes.html#a2dd162c68a1326619a34b45e56fdb46c">codes_is_missing()</a>.</p>
+
 <p>Referenced by <a class="el" href="namespaceec_codes.html#af9fa4123658007a2362baa9afd055063">codes_index_select_string()</a>.</p>
 
 </div>
@@ -1004,12 +1054,12 @@ Functions</h2></td></tr>
 <dl class="section return"><dt>Returns</dt><dd>numpy.ndarray containing the values of key for the given indexes </dd></dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
 
-<p>References <a class="el" href="namespaceec_codes.html#adbc403f07e0bcc151d8b0fb1365492ff">codes_is_defined()</a>, and <a class="el" href="namespaceec_codes.html#a2dd162c68a1326619a34b45e56fdb46c">codes_is_missing()</a>.</p>
+<p>References <a class="el" href="namespaceec_codes.html#adbc403f07e0bcc151d8b0fb1365492ff">codes_is_defined()</a>.</p>
 
 <p>Referenced by <a class="el" href="namespaceec_codes.html#a6fc3995f61a5f34933afd0aeb6427bf6">codes_new_from_index()</a>.</p>
 
@@ -1050,7 +1100,7 @@ Functions</h2></td></tr>
 <dl class="section return"><dt>Returns</dt><dd>value of key as int </dd></dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -1096,12 +1146,12 @@ Functions</h2></td></tr>
 <dl class="section return"><dt>Returns</dt><dd>numpy.ndarray </dd></dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
 
-<p>Referenced by <a class="el" href="namespaceec_codes.html#a134bac0edaf47f29051ad905a30fb63e">codes_grib_find_nearest()</a>, and <a class="el" href="namespaceec_codes.html#a86388748f15624cd8fd2ec89d066295a">grib_get_string_array()</a>.</p>
+<p>Referenced by <a class="el" href="namespaceec_codes.html#a5c08a280c84117684dfe5705dfad29f5">codes_get_string_array()</a>, and <a class="el" href="namespaceec_codes.html#a134bac0edaf47f29051ad905a30fb63e">codes_grib_find_nearest()</a>.</p>
 
 </div>
 </div>
@@ -1131,7 +1181,7 @@ Functions</h2></td></tr>
 <dl class="section return"><dt>Returns</dt><dd>binary string message associated with msgid </dd></dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -1164,7 +1214,7 @@ Functions</h2></td></tr>
 <dl class="section return"><dt>Returns</dt><dd>offset in bytes of the message </dd></dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -1199,7 +1249,7 @@ Functions</h2></td></tr>
 <dl class="section return"><dt>Returns</dt><dd>size in bytes of the message </dd></dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -1246,12 +1296,12 @@ Functions</h2></td></tr>
 <dl class="section return"><dt>Returns</dt><dd>type of key given as input or None if not determined </dd></dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
 
-<p>References <a class="el" href="namespaceec_codes.html#a441ff456dc9990951bf242f4d542713a">codes_get_double_array()</a>, <a class="el" href="namespaceec_codes.html#a0af74e12fba25379db678363f5bdafb3">codes_get_values()</a>, and <a class="el" href="namespaceec_codes.html#abc699d0bb7a7dded968ee0111342ffd0">codes_set_values()</a>.</p>
+<p>References <a class="el" href="namespaceec_codes.html#a441ff456dc9990951bf242f4d542713a">codes_get_double_array()</a>, and <a class="el" href="namespaceec_codes.html#abc699d0bb7a7dded968ee0111342ffd0">codes_set_values()</a>.</p>
 
 <p>Referenced by <a class="el" href="namespaceec_codes.html#a134bac0edaf47f29051ad905a30fb63e">codes_grib_find_nearest()</a>, and <a class="el" href="namespaceec_codes.html#a997587cb4079552273d224fd3434463b">codes_set_key_vals()</a>.</p>
 
@@ -1292,12 +1342,14 @@ Functions</h2></td></tr>
 </dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
 
-<p>Referenced by <a class="el" href="namespaceec_codes.html#ae042f8fe1cc86718ce658f3b992c87a2">codes_bufr_new_from_samples()</a>, <a class="el" href="namespaceec_codes.html#ab49cb36625cd87b9d898844b1df32516">codes_clone()</a>, <a class="el" href="namespaceec_codes.html#ac70e34af931428ba9a4874e0ebf75928">codes_grib_multi_write()</a>, and <a class="el" href="namespaceec_codes.html#a86388748f15624cd8fd2ec89d066295a">grib_get_string_array()</a>.</p>
+<p>References <a class="el" href="namespaceec_codes.html#a587af29aac21a816f8ffd327a1fce779">codes_skip_computed()</a>.</p>
+
+<p>Referenced by <a class="el" href="namespaceec_codes.html#a3ba2700ed57b0a155f7dd76f6b1d8ab9">codes_bufr_copy_data()</a>, <a class="el" href="namespaceec_codes.html#ab49cb36625cd87b9d898844b1df32516">codes_clone()</a>, <a class="el" href="namespaceec_codes.html#a5c08a280c84117684dfe5705dfad29f5">codes_get_string_array()</a>, and <a class="el" href="namespaceec_codes.html#ac70e34af931428ba9a4874e0ebf75928">codes_grib_multi_write()</a>.</p>
 
 </div>
 </div>
@@ -1336,7 +1388,7 @@ Functions</h2></td></tr>
 <dl class="section return"><dt>Returns</dt><dd>string value of key </dd></dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -1347,6 +1399,52 @@ Functions</h2></td></tr>
 
 </div>
 </div>
+<a class="anchor" id="a5c08a280c84117684dfe5705dfad29f5"></a>
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">def ecCodes.codes_get_string_array </td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname"><em>msgid</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"> </td>
+          <td class="paramname"><em>key</em> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Get the value of the key as a list of strings. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">msgid</td><td>id of the message loaded in memory </td></tr>
+    <tr><td class="paramname">key</td><td>key name </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>list </dd></dl>
+<dl class="exception"><dt>Exceptions</dt><dd>
+  <table class="exception">
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>References <a class="el" href="namespaceec_codes.html#a680c8ecbf2104d69083c68ea6184192d">codes_get_long_array()</a>, <a class="el" href="namespaceec_codes.html#ab07293de06d6ef6c5810ea3f01723884">codes_get_size()</a>, and <a class="el" href="namespaceec_codes.html#a0b1fb93a9f550c971a7e08ca16bb5100">codes_grib_multi_new()</a>.</p>
+
+<p>Referenced by <a class="el" href="namespaceec_codes.html#a3ba2700ed57b0a155f7dd76f6b1d8ab9">codes_bufr_copy_data()</a>, and <a class="el" href="namespaceec_codes.html#a134bac0edaf47f29051ad905a30fb63e">codes_grib_find_nearest()</a>.</p>
+
+</div>
+</div>
 <a class="anchor" id="adc7361072916fe6ec52e9cf53f066839"></a>
 <div class="memitem">
 <div class="memproto">
@@ -1381,7 +1479,7 @@ Functions</h2></td></tr>
 </dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -1418,14 +1516,14 @@ Functions</h2></td></tr>
 <dl class="section return"><dt>Returns</dt><dd>numpy.ndarray </dd></dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
 
-<p>References <a class="el" href="namespaceec_codes.html#a267636dba6361f74b330275a1f8e1ed7">codes_index_get()</a>, <a class="el" href="namespaceec_codes.html#ac18c28cc7bd146dad986e03511fb7340">codes_set_double_array()</a>, <a class="el" href="namespaceec_codes.html#a59e415f83b7f26b4575a5700ece65c14">codes_set_long_array()</a>, and <a class="el" href="namespaceec_codes.html#a2353707d7e586ce4255e3a93bc0f39d4">grib_set_string_array()</a>.</p>
+<p>References <a class="el" href="namespaceec_codes.html#a267636dba6361f74b330275a1f8e1ed7">codes_index_get()</a>, <a class="el" href="namespaceec_codes.html#ac18c28cc7bd146dad986e03511fb7340">codes_set_double_array()</a>, <a class="el" href="namespaceec_codes.html#a59e415f83b7f26b4575a5700ece65c14">codes_set_long_array()</a>, and <a class="el" href="namespaceec_codes.html#a54b35eededa62b2cb3a32b90060c0f2c">codes_set_string_array()</a>.</p>
 
-<p>Referenced by <a class="el" href="namespaceec_codes.html#a1250285cb0770393bf6078f3ee3340a2">codes_get_native_type()</a>.</p>
+<p>Referenced by <a class="el" href="namespaceec_codes.html#a134bac0edaf47f29051ad905a30fb63e">codes_grib_find_nearest()</a>.</p>
 
 </div>
 </div>
@@ -1487,12 +1585,12 @@ Functions</h2></td></tr>
 <dl class="section return"><dt>Returns</dt><dd>(npoints*(outlat,outlon,value,dist,index)) </dd></dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
 
-<p>References <a class="el" href="namespaceec_codes.html#a648bae4beadb6a82698da40e08323be9">codes_get_array()</a>, <a class="el" href="namespaceec_codes.html#a22a427ff4355e63b2c16c491572ea6b5">codes_get_double()</a>, <a class="el" href="namespaceec_codes.html#a441ff456dc9990951bf242f4d542713a">codes_get_double_array()</a>, <a class="el" href="namespaceec_codes.html#a88f2a86c370e490dae8e684c957022fd">codes_get_long()</a>, <a class="el" href="namespaceec_codes.html#a680c8ecbf2104d69083c68e [...]
+<p>References <a class="el" href="namespaceec_codes.html#a648bae4beadb6a82698da40e08323be9">codes_get_array()</a>, <a class="el" href="namespaceec_codes.html#a22a427ff4355e63b2c16c491572ea6b5">codes_get_double()</a>, <a class="el" href="namespaceec_codes.html#a441ff456dc9990951bf242f4d542713a">codes_get_double_array()</a>, <a class="el" href="namespaceec_codes.html#a88f2a86c370e490dae8e684c957022fd">codes_get_long()</a>, <a class="el" href="namespaceec_codes.html#a680c8ecbf2104d69083c68e [...]
 
 <p>Referenced by <a class="el" href="namespaceec_codes.html#affddd8311b1127306fa02ce26023d89e">codes_set_missing()</a>.</p>
 
@@ -1522,7 +1620,7 @@ Functions</h2></td></tr>
 </dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -1598,7 +1696,7 @@ Functions</h2></td></tr>
 <dl class="section return"><dt>Returns</dt><dd>tuple with the latitude, longitude and value </dd></dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -1652,12 +1750,12 @@ Functions</h2></td></tr>
 </dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
 
-<p>References <a class="el" href="namespaceec_codes.html#adc7361072916fe6ec52e9cf53f066839">codes_get_string_length()</a>, and <a class="el" href="namespaceec_codes.html#a587af29aac21a816f8ffd327a1fce779">codes_skip_computed()</a>.</p>
+<p>References <a class="el" href="namespaceec_codes.html#adc7361072916fe6ec52e9cf53f066839">codes_get_string_length()</a>.</p>
 
 <p>Referenced by <a class="el" href="namespaceec_codes.html#af13b3e69c2b5ad0ea6b7fd07ac37e367">codes_write()</a>.</p>
 
@@ -1681,14 +1779,14 @@ Functions</h2></td></tr>
 <dl class="section return"><dt>Returns</dt><dd>id of the multi field </dd></dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
 
 <p>References <a class="el" href="namespaceec_codes.html#a1c18ea67e5ce00500824676691b4bc4a">codes_index_add_file()</a>.</p>
 
-<p>Referenced by <a class="el" href="namespaceec_codes.html#a86388748f15624cd8fd2ec89d066295a">grib_get_string_array()</a>.</p>
+<p>Referenced by <a class="el" href="namespaceec_codes.html#a5c08a280c84117684dfe5705dfad29f5">codes_get_string_array()</a>.</p>
 
 </div>
 </div>
@@ -1716,14 +1814,14 @@ Functions</h2></td></tr>
 </dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
 
 <p>References <a class="el" href="namespaceec_codes.html#ab9369968f436ad85084ec1d48e9324c7">codes_index_get_size()</a>, and <a class="el" href="namespaceec_codes.html#ae5a40e31f81dd4cdddf8ddc71e833395">codes_index_release()</a>.</p>
 
-<p>Referenced by <a class="el" href="namespaceec_codes.html#a2353707d7e586ce4255e3a93bc0f39d4">grib_set_string_array()</a>.</p>
+<p>Referenced by <a class="el" href="namespaceec_codes.html#a54b35eededa62b2cb3a32b90060c0f2c">codes_set_string_array()</a>.</p>
 
 </div>
 </div>
@@ -1743,7 +1841,7 @@ Functions</h2></td></tr>
 <p>Turn off the support for multiple fields in a single message. </p>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -1770,7 +1868,7 @@ Functions</h2></td></tr>
 <p>Turn on the support for multiple fields in a single message. </p>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -1816,7 +1914,7 @@ Functions</h2></td></tr>
 </dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -1866,7 +1964,7 @@ Functions</h2></td></tr>
 <dl class="section return"><dt>Returns</dt><dd>id of the grib loaded in memory </dd></dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -1877,6 +1975,43 @@ Functions</h2></td></tr>
 
 </div>
 </div>
+<a class="anchor" id="a1c476c5e2dfefa3693df1065e9bf1665"></a>
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">def ecCodes.codes_grib_new_from_samples </td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname"><em>samplename</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Create a new valid GRIB message from a sample. </p>
+<p>The available samples are picked up from the directory pointed to by the environment variable ECCODES_SAMPLES_PATH. To know where the samples directory is run the codes_info tool.<br/>
+ <b>Examples:</b> <a href="https://software.ecmwf.int/wiki/display/ECC/grib_samples" target="_blank">grib_samples.py</a></p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">samplename</td><td>name of the sample to be used </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>id of the message loaded in memory </dd></dl>
+<dl class="exception"><dt>Exceptions</dt><dd>
+  <table class="exception">
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>References <a class="el" href="namespaceec_codes.html#ab49cb36625cd87b9d898844b1df32516">codes_clone()</a>.</p>
+
+<p>Referenced by <a class="el" href="namespaceec_codes.html#ae623fa09d65a3f699026a86d0e4864da">codes_set_long()</a>.</p>
+
+</div>
+</div>
 <a class="anchor" id="a4c5256c7e609cf3eedf7d695a4b58a45"></a>
 <div class="memitem">
 <div class="memproto">
@@ -1893,7 +2028,7 @@ Functions</h2></td></tr>
 <p>Turn off the compatibility mode with gribex. </p>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -1920,7 +2055,7 @@ Functions</h2></td></tr>
 <p>Turn on the compatibility mode with gribex. </p>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -1993,7 +2128,7 @@ Functions</h2></td></tr>
 <dl class="section return"><dt>Returns</dt><dd>id of the GTS loaded in memory </dd></dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -2039,7 +2174,7 @@ Functions</h2></td></tr>
 </dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -2094,7 +2229,7 @@ Functions</h2></td></tr>
 <dl class="section return"><dt>Returns</dt><dd>array of values </dd></dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -2143,7 +2278,7 @@ Functions</h2></td></tr>
 <dl class="section return"><dt>Returns</dt><dd>tuple with values of key in index </dd></dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -2192,14 +2327,14 @@ Functions</h2></td></tr>
 <dl class="section return"><dt>Returns</dt><dd>tuple with values of key in index </dd></dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
 
 <p>References <a class="el" href="namespaceec_codes.html#ab9369968f436ad85084ec1d48e9324c7">codes_index_get_size()</a>, and <a class="el" href="namespaceec_codes.html#ada63dc27281c249035da5b54e6ec0966">codes_index_select_long()</a>.</p>
 
-<p>Referenced by <a class="el" href="namespaceec_codes.html#ae89dc44888bfbba102e6c9332839fc51">codes_index_new_from_file()</a>, and <a class="el" href="namespaceec_codes.html#abc699d0bb7a7dded968ee0111342ffd0">codes_set_values()</a>.</p>
+<p>Referenced by <a class="el" href="namespaceec_codes.html#a6c83d2b9572083c7a83c9c5d39010b14">codes_copy_namespace()</a>, and <a class="el" href="namespaceec_codes.html#abc699d0bb7a7dded968ee0111342ffd0">codes_set_values()</a>.</p>
 
 </div>
 </div>
@@ -2240,7 +2375,7 @@ Functions</h2></td></tr>
 <dl class="section return"><dt>Returns</dt><dd>number of distinct values for key in index </dd></dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -2289,7 +2424,7 @@ Functions</h2></td></tr>
 <dl class="section return"><dt>Returns</dt><dd>tuple with values of key in index </dd></dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -2336,12 +2471,12 @@ Functions</h2></td></tr>
 <dl class="section return"><dt>Returns</dt><dd>index id </dd></dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
 
-<p>References <a class="el" href="namespaceec_codes.html#aeaf2ac58b4a90bd09595986d49228d7c">codes_index_get_long()</a>, and <a class="el" href="namespaceec_codes.html#ab9369968f436ad85084ec1d48e9324c7">codes_index_get_size()</a>.</p>
+<p>References <a class="el" href="namespaceec_codes.html#ab9369968f436ad85084ec1d48e9324c7">codes_index_get_size()</a>.</p>
 
 <p>Referenced by <a class="el" href="namespaceec_codes.html#a59e415f83b7f26b4575a5700ece65c14">codes_set_long_array()</a>.</p>
 
@@ -2372,7 +2507,7 @@ Functions</h2></td></tr>
 <dl class="section return"><dt>Returns</dt><dd>id of the loaded index </dd></dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -2407,7 +2542,7 @@ Functions</h2></td></tr>
 </dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -2460,12 +2595,12 @@ Functions</h2></td></tr>
 </dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
 
-<p>References <a class="el" href="namespaceec_codes.html#add6a557c085ea401fc9529ed140025ef">codes_get_api_version()</a>, <a class="el" href="namespaceec_codes.html#a0f446397a9956ed5518ff6461fcc17f0">codes_get_message()</a>, and <a class="el" href="namespaceec_codes.html#a8b42a0c20ab81efa5a214dacc0b75d58">codes_new_from_message()</a>.</p>
+<p>References <a class="el" href="namespaceec_codes.html#a0f446397a9956ed5518ff6461fcc17f0">codes_get_message()</a>, and <a class="el" href="namespaceec_codes.html#a8b42a0c20ab81efa5a214dacc0b75d58">codes_new_from_message()</a>.</p>
 
 <p>Referenced by <a class="el" href="namespaceec_codes.html#abb5cff8e4911614c8b04032fb014ea07">codes_set()</a>.</p>
 
@@ -2515,7 +2650,7 @@ Functions</h2></td></tr>
 </dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -2570,7 +2705,7 @@ Functions</h2></td></tr>
 </dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -2625,7 +2760,7 @@ Functions</h2></td></tr>
 </dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -2672,7 +2807,7 @@ Functions</h2></td></tr>
 </dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -2716,7 +2851,7 @@ Functions</h2></td></tr>
 <dl class="section return"><dt>Returns</dt><dd>0->not defined, 1->defined </dd></dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -2763,12 +2898,12 @@ Functions</h2></td></tr>
 <dl class="section return"><dt>Returns</dt><dd>0->not missing, 1->missing </dd></dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
 
-<p>Referenced by <a class="el" href="namespaceec_codes.html#a8558de4f563b57fe8104d024eb90e7d2">codes_get_elements()</a>.</p>
+<p>Referenced by <a class="el" href="namespaceec_codes.html#af0708f169680a9b753789a3d61f7f9ef">codes_get_double_elements()</a>.</p>
 
 </div>
 </div>
@@ -2796,7 +2931,7 @@ Functions</h2></td></tr>
 </dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -2832,7 +2967,7 @@ Functions</h2></td></tr>
 <dl class="section return"><dt>Returns</dt><dd>key name to be retrieved </dd></dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -2880,7 +3015,7 @@ Functions</h2></td></tr>
 <dl class="section return"><dt>Returns</dt><dd>keys iterator id to be used in the keys iterator functions </dd></dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -2915,7 +3050,7 @@ Functions</h2></td></tr>
 </dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -2949,7 +3084,7 @@ Functions</h2></td></tr>
 </dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -2996,14 +3131,14 @@ Functions</h2></td></tr>
 <dl class="section return"><dt>Returns</dt><dd>id of the METAR loaded in memory </dd></dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
 
 <p>References <a class="el" href="namespaceec_codes.html#a44c10386781390c16f1a567590b33c11">codes_bufr_new_from_file()</a>, <a class="el" href="namespaceec_codes.html#a80246f356012448955e2e75572a8d210">codes_grib_new_from_file()</a>, and <a class="el" href="namespaceec_codes.html#ab1788f3653df85dd90ac99f40daf98c4">codes_new_from_file()</a>.</p>
 
-<p>Referenced by <a class="el" href="namespaceec_codes.html#ab06cc33b116103a54fadb4e2735e579a">codes_gts_new_from_file()</a>.</p>
+<p>Referenced by <a class="el" href="namespaceec_codes.html#ab06cc33b116103a54fadb4e2735e579a">codes_gts_new_from_file()</a>, and <a class="el" href="namespaceec_codes.html#ab1788f3653df85dd90ac99f40daf98c4">codes_new_from_file()</a>.</p>
 
 </div>
 </div>
@@ -3052,12 +3187,12 @@ Functions</h2></td></tr>
 <dl class="section return"><dt>Returns</dt><dd>id of the message loaded in memory </dd></dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
 
-<p>References <a class="el" href="namespaceec_codes.html#af4a4c95465d2026ad549920b07150bab">codes_any_new_from_file()</a>, and <a class="el" href="namespaceec_codes.html#ab06cc33b116103a54fadb4e2735e579a">codes_gts_new_from_file()</a>.</p>
+<p>References <a class="el" href="namespaceec_codes.html#af4a4c95465d2026ad549920b07150bab">codes_any_new_from_file()</a>, <a class="el" href="namespaceec_codes.html#ab06cc33b116103a54fadb4e2735e579a">codes_gts_new_from_file()</a>, and <a class="el" href="namespaceec_codes.html#aabd87fd89cfac4d21ec014b838174e3c">codes_metar_new_from_file()</a>.</p>
 
 <p>Referenced by <a class="el" href="namespaceec_codes.html#aabd87fd89cfac4d21ec014b838174e3c">codes_metar_new_from_file()</a>.</p>
 
@@ -3090,7 +3225,7 @@ Functions</h2></td></tr>
 <dl class="section return"><dt>Returns</dt><dd>id of the message loaded in memory or None if end of index </dd></dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -3127,7 +3262,7 @@ Functions</h2></td></tr>
 <dl class="section return"><dt>Returns</dt><dd>msgid of the newly created grib message </dd></dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -3144,30 +3279,41 @@ Functions</h2></td></tr>
           <td class="memname">def ecCodes.codes_new_from_samples </td>
           <td>(</td>
           <td class="paramtype"> </td>
-          <td class="paramname"><em>samplename</em></td><td>)</td>
+          <td class="paramname"><em>samplename</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
           <td></td>
+          <td class="paramtype"> </td>
+          <td class="paramname"><em>product_kind</em> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
         </tr>
       </table>
 </div><div class="memdoc">
 
-<p>Create a new valid GRIB message from a sample. </p>
+<p>Create a new valid message from a sample for a given product. </p>
 <p>The available samples are picked up from the directory pointed to by the environment variable ECCODES_SAMPLES_PATH. To know where the samples directory is run the codes_info tool.<br/>
  <b>Examples:</b> <a href="https://software.ecmwf.int/wiki/display/ECC/grib_samples" target="_blank">grib_samples.py</a></p>
 <dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramname">samplename</td><td>name of the sample to be used </td></tr>
+    <tr><td class="paramname">product_kind</td><td>CODES_PRODUCT_GRIB or CODES_PRODUCT_BUFR </td></tr>
   </table>
   </dd>
 </dl>
 <dl class="section return"><dt>Returns</dt><dd>id of the message loaded in memory </dd></dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
 
-<p>References <a class="el" href="namespaceec_codes.html#ac18c28cc7bd146dad986e03511fb7340">codes_set_double_array()</a>.</p>
+<p>References <a class="el" href="namespaceec_codes.html#a3ba2700ed57b0a155f7dd76f6b1d8ab9">codes_bufr_copy_data()</a>.</p>
 
 <p>Referenced by <a class="el" href="namespaceec_codes.html#a22a427ff4355e63b2c16c491572ea6b5">codes_get_double()</a>.</p>
 
@@ -3223,7 +3369,7 @@ Functions</h2></td></tr>
 </dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -3278,7 +3424,7 @@ Functions</h2></td></tr>
 </dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -3333,7 +3479,7 @@ Functions</h2></td></tr>
 </dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -3412,12 +3558,12 @@ Functions</h2></td></tr>
 </dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a>,TypeError</td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError,TypeError</td><td></td></tr>
   </table>
   </dd>
 </dl>
 
-<p>References <a class="el" href="namespaceec_codes.html#ab49cb36625cd87b9d898844b1df32516">codes_clone()</a>.</p>
+<p>References <a class="el" href="namespaceec_codes.html#ae042f8fe1cc86718ce658f3b992c87a2">codes_bufr_new_from_samples()</a>.</p>
 
 <p>Referenced by <a class="el" href="namespaceec_codes.html#a1ba4d3b6473499af0581cf52eb4cad0b">codes_get()</a>, and <a class="el" href="namespaceec_codes.html#a88f2a86c370e490dae8e684c957022fd">codes_get_long()</a>.</p>
 
@@ -3467,14 +3613,14 @@ Functions</h2></td></tr>
 </dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
 
-<p>References <a class="el" href="namespaceec_codes.html#a2353707d7e586ce4255e3a93bc0f39d4">grib_set_string_array()</a>.</p>
+<p>References <a class="el" href="namespaceec_codes.html#a54b35eededa62b2cb3a32b90060c0f2c">codes_set_string_array()</a>.</p>
 
-<p>Referenced by <a class="el" href="namespaceec_codes.html#a1ba4d3b6473499af0581cf52eb4cad0b">codes_get()</a>, <a class="el" href="namespaceec_codes.html#a0af74e12fba25379db678363f5bdafb3">codes_get_values()</a>, and <a class="el" href="namespaceec_codes.html#a643c58a9acad239c081794c74a5b86d9">codes_new_from_samples()</a>.</p>
+<p>Referenced by <a class="el" href="namespaceec_codes.html#ae042f8fe1cc86718ce658f3b992c87a2">codes_bufr_new_from_samples()</a>, <a class="el" href="namespaceec_codes.html#a1ba4d3b6473499af0581cf52eb4cad0b">codes_get()</a>, and <a class="el" href="namespaceec_codes.html#a0af74e12fba25379db678363f5bdafb3">codes_get_values()</a>.</p>
 
 </div>
 </div>
@@ -3512,7 +3658,7 @@ Functions</h2></td></tr>
 </dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -3565,12 +3711,12 @@ Functions</h2></td></tr>
 </dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a>,TypeError</td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError,TypeError</td><td></td></tr>
   </table>
   </dd>
 </dl>
 
-<p>References <a class="el" href="namespaceec_codes.html#ae042f8fe1cc86718ce658f3b992c87a2">codes_bufr_new_from_samples()</a>.</p>
+<p>References <a class="el" href="namespaceec_codes.html#ae042f8fe1cc86718ce658f3b992c87a2">codes_bufr_new_from_samples()</a>, and <a class="el" href="namespaceec_codes.html#a1c476c5e2dfefa3693df1065e9bf1665">codes_grib_new_from_samples()</a>.</p>
 
 <p>Referenced by <a class="el" href="namespaceec_codes.html#a1ba4d3b6473499af0581cf52eb4cad0b">codes_get()</a>, and <a class="el" href="namespaceec_codes.html#aec91e405c936c335c00267eb221c9f91">codes_keys_iterator_get_name()</a>.</p>
 
@@ -3620,7 +3766,7 @@ Functions</h2></td></tr>
 </dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -3667,7 +3813,7 @@ Functions</h2></td></tr>
 </dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -3745,7 +3891,7 @@ Functions</h2></td></tr>
 </dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -3756,6 +3902,61 @@ Functions</h2></td></tr>
 
 </div>
 </div>
+<a class="anchor" id="a54b35eededa62b2cb3a32b90060c0f2c"></a>
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">def ecCodes.codes_set_string_array </td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname"><em>msgid</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"> </td>
+          <td class="paramname"><em>key</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"> </td>
+          <td class="paramname"><em>inarray</em> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Set the value of the key to a string array. </p>
+<p>The input array can be a python sequence like tuple, list, array, ...</p>
+<p>The wrapper will internally try to convert the input to a NumPy array before extracting its data and length. This is possible as NumPy allows the construction of arrays from arbitrary python sequences.</p>
+<p>The elements of the input sequence need to be convertible to a double.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">msgid</td><td>id of the message loaded in memory </td></tr>
+    <tr><td class="paramname">key</td><td>key name </td></tr>
+    <tr><td class="paramname">inarray</td><td>tuple,list,array </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="exception"><dt>Exceptions</dt><dd>
+  <table class="exception">
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>References <a class="el" href="namespaceec_codes.html#a6c83d2b9572083c7a83c9c5d39010b14">codes_copy_namespace()</a>, and <a class="el" href="namespaceec_codes.html#a1e9477394be21ac60be3d6841660c137">codes_grib_multi_release()</a>.</p>
+
+<p>Referenced by <a class="el" href="namespaceec_codes.html#a0af74e12fba25379db678363f5bdafb3">codes_get_values()</a>, and <a class="el" href="namespaceec_codes.html#ac18c28cc7bd146dad986e03511fb7340">codes_set_double_array()</a>.</p>
+
+</div>
+</div>
 <a class="anchor" id="abc699d0bb7a7dded968ee0111342ffd0"></a>
 <div class="memitem">
 <div class="memproto">
@@ -3824,7 +4025,7 @@ Functions</h2></td></tr>
 </dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -3860,14 +4061,14 @@ Functions</h2></td></tr>
 </dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
 
 <p>References <a class="el" href="namespaceec_codes.html#a57f7a5a0f6975e1357e5aa1dc4715e0c">codes_skip_duplicates()</a>.</p>
 
-<p>Referenced by <a class="el" href="namespaceec_codes.html#a956a6f84f7b418551cd6c4976c970140">codes_grib_multi_append()</a>.</p>
+<p>Referenced by <a class="el" href="namespaceec_codes.html#ab07293de06d6ef6c5810ea3f01723884">codes_get_size()</a>.</p>
 
 </div>
 </div>
@@ -3895,7 +4096,7 @@ Functions</h2></td></tr>
 </dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -3930,7 +4131,7 @@ Functions</h2></td></tr>
 </dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -3965,7 +4166,7 @@ Functions</h2></td></tr>
 </dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -4001,7 +4202,7 @@ Functions</h2></td></tr>
 </dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -4047,7 +4248,7 @@ Functions</h2></td></tr>
 </dl>
 <dl class="exception"><dt>Exceptions</dt><dd>
   <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
+    <tr><td class="paramname">CodesInternalError</td><td></td></tr>
   </table>
   </dd>
 </dl>
@@ -4058,107 +4259,6 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a86388748f15624cd8fd2ec89d066295a"></a>
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">def ecCodes.grib_get_string_array </td>
-          <td>(</td>
-          <td class="paramtype"> </td>
-          <td class="paramname"><em>msgid</em>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype"> </td>
-          <td class="paramname"><em>key</em> </td>
-        </tr>
-        <tr>
-          <td></td>
-          <td>)</td>
-          <td></td><td></td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-
-<p>Get the value of the key as a list of strings. </p>
-<dl class="params"><dt>Parameters</dt><dd>
-  <table class="params">
-    <tr><td class="paramname">msgid</td><td>id of the message loaded in memory </td></tr>
-    <tr><td class="paramname">key</td><td>key name </td></tr>
-  </table>
-  </dd>
-</dl>
-<dl class="section return"><dt>Returns</dt><dd>list </dd></dl>
-<dl class="exception"><dt>Exceptions</dt><dd>
-  <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
-  </table>
-  </dd>
-</dl>
-
-<p>References <a class="el" href="namespaceec_codes.html#a680c8ecbf2104d69083c68ea6184192d">codes_get_long_array()</a>, <a class="el" href="namespaceec_codes.html#ab07293de06d6ef6c5810ea3f01723884">codes_get_size()</a>, and <a class="el" href="namespaceec_codes.html#a0b1fb93a9f550c971a7e08ca16bb5100">codes_grib_multi_new()</a>.</p>
-
-<p>Referenced by <a class="el" href="namespaceec_codes.html#ab49cb36625cd87b9d898844b1df32516">codes_clone()</a>, and <a class="el" href="namespaceec_codes.html#a134bac0edaf47f29051ad905a30fb63e">codes_grib_find_nearest()</a>.</p>
-
-</div>
-</div>
-<a class="anchor" id="a2353707d7e586ce4255e3a93bc0f39d4"></a>
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">def ecCodes.grib_set_string_array </td>
-          <td>(</td>
-          <td class="paramtype"> </td>
-          <td class="paramname"><em>msgid</em>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype"> </td>
-          <td class="paramname"><em>key</em>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype"> </td>
-          <td class="paramname"><em>inarray</em> </td>
-        </tr>
-        <tr>
-          <td></td>
-          <td>)</td>
-          <td></td><td></td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-
-<p>Set the value of the key to a string array. </p>
-<p>The input array can be a python sequence like tuple, list, array, ...</p>
-<p>The wrapper will internally try to convert the input to a NumPy array before extracting its data and length. This is possible as NumPy allows the construction of arrays from arbitrary python sequences.</p>
-<p>The elements of the input sequence need to be convertible to a double.</p>
-<dl class="params"><dt>Parameters</dt><dd>
-  <table class="params">
-    <tr><td class="paramname">msgid</td><td>id of the message loaded in memory </td></tr>
-    <tr><td class="paramname">key</td><td>key name </td></tr>
-    <tr><td class="paramname">inarray</td><td>tuple,list,array </td></tr>
-  </table>
-  </dd>
-</dl>
-<dl class="exception"><dt>Exceptions</dt><dd>
-  <table class="exception">
-    <tr><td class="paramname"><a class="el" href="classec_codes_1_1_codes_internal_error.html" title="Wrap errors coming from the C API in a Python exception object. ">CodesInternalError</a></td><td></td></tr>
-  </table>
-  </dd>
-</dl>
-
-<p>References <a class="el" href="namespaceec_codes.html#a6c83d2b9572083c7a83c9c5d39010b14">codes_copy_namespace()</a>, and <a class="el" href="namespaceec_codes.html#a1e9477394be21ac60be3d6841660c137">codes_grib_multi_release()</a>.</p>
-
-<p>Referenced by <a class="el" href="namespaceec_codes.html#a0af74e12fba25379db678363f5bdafb3">codes_get_values()</a>, and <a class="el" href="namespaceec_codes.html#ac18c28cc7bd146dad986e03511fb7340">codes_set_double_array()</a>.</p>
-
-</div>
-</div>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
diff --git a/html/namespacemembers.html b/html/namespacemembers.html
index 4933ba9..0df23a9 100644
--- a/html/namespacemembers.html
+++ b/html/namespacemembers.html
@@ -73,7 +73,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
   <div id="navrow4" class="tabs3">
     <ul class="tablist">
       <li><a href="#index_c"><span>c</span></a></li>
-      <li><a href="#index_g"><span>g</span></a></li>
     </ul>
   </div>
 </div><!-- top -->
@@ -98,6 +97,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 <li>codes_any_new_from_file()
 : <a class="el" href="namespaceec_codes.html#af4a4c95465d2026ad549920b07150bab">ecCodes</a>
 </li>
+<li>codes_bufr_copy_data()
+: <a class="el" href="namespaceec_codes.html#a3ba2700ed57b0a155f7dd76f6b1d8ab9">ecCodes</a>
+</li>
 <li>codes_bufr_new_from_file()
 : <a class="el" href="namespaceec_codes.html#a44c10386781390c16f1a567590b33c11">ecCodes</a>
 </li>
@@ -161,6 +163,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 <li>codes_get_string()
 : <a class="el" href="namespaceec_codes.html#a37ff4cf406f9b0b0cd6ede563c1d5ab1">ecCodes</a>
 </li>
+<li>codes_get_string_array()
+: <a class="el" href="namespaceec_codes.html#a5c08a280c84117684dfe5705dfad29f5">ecCodes</a>
+</li>
 <li>codes_get_string_length()
 : <a class="el" href="namespaceec_codes.html#adc7361072916fe6ec52e9cf53f066839">ecCodes</a>
 </li>
@@ -200,6 +205,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 <li>codes_grib_new_from_file()
 : <a class="el" href="namespaceec_codes.html#a80246f356012448955e2e75572a8d210">ecCodes</a>
 </li>
+<li>codes_grib_new_from_samples()
+: <a class="el" href="namespaceec_codes.html#a1c476c5e2dfefa3693df1065e9bf1665">ecCodes</a>
+</li>
 <li>codes_gribex_mode_off()
 : <a class="el" href="namespaceec_codes.html#a4c5256c7e609cf3eedf7d695a4b58a45">ecCodes</a>
 </li>
@@ -329,6 +337,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 <li>codes_set_string()
 : <a class="el" href="namespaceec_codes.html#acbb0d241a917a3e726792157c1f5d973">ecCodes</a>
 </li>
+<li>codes_set_string_array()
+: <a class="el" href="namespaceec_codes.html#a54b35eededa62b2cb3a32b90060c0f2c">ecCodes</a>
+</li>
 <li>codes_set_values()
 : <a class="el" href="namespaceec_codes.html#abc699d0bb7a7dded968ee0111342ffd0">ecCodes</a>
 </li>
@@ -354,16 +365,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 : <a class="el" href="namespaceec_codes.html#af13b3e69c2b5ad0ea6b7fd07ac37e367">ecCodes</a>
 </li>
 </ul>
-
-
-<h3><a class="anchor" id="index_g"></a>- g -</h3><ul>
-<li>grib_get_string_array()
-: <a class="el" href="namespaceec_codes.html#a86388748f15624cd8fd2ec89d066295a">ecCodes</a>
-</li>
-<li>grib_set_string_array()
-: <a class="el" href="namespaceec_codes.html#a2353707d7e586ce4255e3a93bc0f39d4">ecCodes</a>
-</li>
-</ul>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
diff --git a/html/namespacemembers_func.html b/html/namespacemembers_func.html
index 69de8fa..a83ccf4 100644
--- a/html/namespacemembers_func.html
+++ b/html/namespacemembers_func.html
@@ -73,7 +73,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
   <div id="navrow4" class="tabs3">
     <ul class="tablist">
       <li><a href="#index_c"><span>c</span></a></li>
-      <li><a href="#index_g"><span>g</span></a></li>
     </ul>
   </div>
 </div><!-- top -->
@@ -98,6 +97,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 <li>codes_any_new_from_file()
 : <a class="el" href="namespaceec_codes.html#af4a4c95465d2026ad549920b07150bab">ecCodes</a>
 </li>
+<li>codes_bufr_copy_data()
+: <a class="el" href="namespaceec_codes.html#a3ba2700ed57b0a155f7dd76f6b1d8ab9">ecCodes</a>
+</li>
 <li>codes_bufr_new_from_file()
 : <a class="el" href="namespaceec_codes.html#a44c10386781390c16f1a567590b33c11">ecCodes</a>
 </li>
@@ -161,6 +163,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 <li>codes_get_string()
 : <a class="el" href="namespaceec_codes.html#a37ff4cf406f9b0b0cd6ede563c1d5ab1">ecCodes</a>
 </li>
+<li>codes_get_string_array()
+: <a class="el" href="namespaceec_codes.html#a5c08a280c84117684dfe5705dfad29f5">ecCodes</a>
+</li>
 <li>codes_get_string_length()
 : <a class="el" href="namespaceec_codes.html#adc7361072916fe6ec52e9cf53f066839">ecCodes</a>
 </li>
@@ -200,6 +205,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 <li>codes_grib_new_from_file()
 : <a class="el" href="namespaceec_codes.html#a80246f356012448955e2e75572a8d210">ecCodes</a>
 </li>
+<li>codes_grib_new_from_samples()
+: <a class="el" href="namespaceec_codes.html#a1c476c5e2dfefa3693df1065e9bf1665">ecCodes</a>
+</li>
 <li>codes_gribex_mode_off()
 : <a class="el" href="namespaceec_codes.html#a4c5256c7e609cf3eedf7d695a4b58a45">ecCodes</a>
 </li>
@@ -329,6 +337,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 <li>codes_set_string()
 : <a class="el" href="namespaceec_codes.html#acbb0d241a917a3e726792157c1f5d973">ecCodes</a>
 </li>
+<li>codes_set_string_array()
+: <a class="el" href="namespaceec_codes.html#a54b35eededa62b2cb3a32b90060c0f2c">ecCodes</a>
+</li>
 <li>codes_set_values()
 : <a class="el" href="namespaceec_codes.html#abc699d0bb7a7dded968ee0111342ffd0">ecCodes</a>
 </li>
@@ -354,16 +365,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 : <a class="el" href="namespaceec_codes.html#af13b3e69c2b5ad0ea6b7fd07ac37e367">ecCodes</a>
 </li>
 </ul>
-
-
-<h3><a class="anchor" id="index_g"></a>- g -</h3><ul>
-<li>grib_get_string_array()
-: <a class="el" href="namespaceec_codes.html#a86388748f15624cd8fd2ec89d066295a">ecCodes</a>
-</li>
-<li>grib_set_string_array()
-: <a class="el" href="namespaceec_codes.html#a2353707d7e586ce4255e3a93bc0f39d4">ecCodes</a>
-</li>
-</ul>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
diff --git a/html/search/all_63.js b/html/search/all_63.js
index 560d735..bacad0e 100644
--- a/html/search/all_63.js
+++ b/html/search/all_63.js
@@ -6,6 +6,7 @@ var searchData=
   ['codes_5fattribute_5fclash',['CODES_ATTRIBUTE_CLASH',['../group__errors.html#gab925e86850f2cb23159bf5f349680985',1,'eccodes.h']]],
   ['codes_5fattribute_5fnot_5ffound',['CODES_ATTRIBUTE_NOT_FOUND',['../group__errors.html#ga020cc6141e2618059f63b5aa2a8385f7',1,'eccodes.h']]],
   ['codes_5fbuffer_5ftoo_5fsmall',['CODES_BUFFER_TOO_SMALL',['../group__errors.html#ga28ecc7f18250c721544c587f21acc61f',1,'eccodes.h']]],
+  ['codes_5fbufr_5fcopy_5fdata',['codes_bufr_copy_data',['../classeccodes.html#a030c4f01609c1206deef936ba3e0029b',1,'eccodes::codes_bufr_copy_data()'],['../namespaceec_codes.html#a3ba2700ed57b0a155f7dd76f6b1d8ab9',1,'ecCodes.codes_bufr_copy_data()']]],
   ['codes_5fbufr_5fhandle_5fnew_5ffrom_5ffile',['codes_bufr_handle_new_from_file',['../group__codes__handle.html#ga6958c3cd7e4059af5c26898a872262ff',1,'eccodes.h']]],
   ['codes_5fbufr_5fhandle_5fnew_5ffrom_5fsamples',['codes_bufr_handle_new_from_samples',['../group__codes__handle.html#ga56d0f831e520ec7bc4a0ca334c63f557',1,'eccodes.h']]],
   ['codes_5fbufr_5fnew_5ffrom_5ffile',['codes_bufr_new_from_file',['../classeccodes.html#a94050d64954482cd82ea6f007fdc9ac0',1,'eccodes::codes_bufr_new_from_file()'],['../namespaceec_codes.html#a44c10386781390c16f1a567590b33c11',1,'ecCodes.codes_bufr_new_from_file()']]],
@@ -21,6 +22,7 @@ var searchData=
   ['codes_5fcontext_5fget_5fdefault',['codes_context_get_default',['../group__context.html#ga3c1086a1abccc58db01609611c3e706d',1,'eccodes.h']]],
   ['codes_5fcontext_5fset_5fdefinitions_5fpath',['codes_context_set_definitions_path',['../group__context.html#ga8abf0ff0f52f1e808edf092f2e7c1147',1,'eccodes.h']]],
   ['codes_5fcontext_5fset_5fsamples_5fpath',['codes_context_set_samples_path',['../group__context.html#ga4f2f808f560a3b744b4c904b3d1a1c48',1,'eccodes.h']]],
+  ['codes_5fcopy_5fkey',['codes_copy_key',['../classeccodes.html#a43bbbee406c2e974ae9cd4dcea41bd4d',1,'eccodes']]],
   ['codes_5fcopy_5fmessage',['codes_copy_message',['../classeccodes.html#afdd32c1a78f0a3d54992e0a6a6bfc66b',1,'eccodes']]],
   ['codes_5fcopy_5fnamespace',['codes_copy_namespace',['../classeccodes.html#a8bba3684a289b1e8c6bcea0b67c45b5d',1,'eccodes::codes_copy_namespace()'],['../group__get__set.html#gaecd9fa4b22117df7569320ddaa2431e1',1,'codes_copy_namespace(): eccodes.h'],['../namespaceec_codes.html#a6c83d2b9572083c7a83c9c5d39010b14',1,'ecCodes.codes_copy_namespace()']]],
   ['codes_5fcorrupted_5findex',['CODES_CORRUPTED_INDEX',['../group__errors.html#ga3e4650042d448cf9ccf2f58913f6d900',1,'eccodes.h']]],
@@ -36,8 +38,8 @@ var searchData=
   ['codes_5fend_5fof_5findex',['CODES_END_OF_INDEX',['../group__errors.html#ga0280b694f20120aef691e13288bf2b30',1,'eccodes.h']]],
   ['codes_5ffile_5fnot_5ffound',['CODES_FILE_NOT_FOUND',['../group__errors.html#gac7c0c8beed153b8bf32601441c5ef787',1,'eccodes.h']]],
   ['codes_5fgeocalculus_5fproblem',['CODES_GEOCALCULUS_PROBLEM',['../group__errors.html#ga6bcc67f9220042cb4781bad71fd59f35',1,'eccodes.h']]],
-  ['codes_5fget',['codes_get',['../interfaceeccodes_1_1codes__get.html',1,'eccodes']]],
   ['codes_5fget',['codes_get',['../namespaceec_codes.html#a1ba4d3b6473499af0581cf52eb4cad0b',1,'ecCodes']]],
+  ['codes_5fget',['codes_get',['../interfaceeccodes_1_1codes__get.html',1,'eccodes']]],
   ['codes_5fget_5fapi_5fversion',['codes_get_api_version',['../eccodes_8h.html#aad3989fb11cbfce477ce7b42daa7b506',1,'codes_get_api_version(): ecCodes.py'],['../namespaceec_codes.html#add6a557c085ea401fc9529ed140025ef',1,'ecCodes.codes_get_api_version()']]],
   ['codes_5fget_5farray',['codes_get_array',['../namespaceec_codes.html#a648bae4beadb6a82698da40e08323be9',1,'ecCodes']]],
   ['codes_5fget_5fbyte_5farray',['codes_get_byte_array',['../interfaceeccodes_1_1codes__get.html#adee61373d840f0f6a73be5d574a47a1e',1,'eccodes::codes_get::codes_get_byte_array()'],['../classeccodes.html#adee61373d840f0f6a73be5d574a47a1e',1,'eccodes::codes_get_byte_array()']]],
@@ -66,27 +68,28 @@ var searchData=
   ['codes_5fget_5fmessage_5fsize_5fsize_5ft',['codes_get_message_size_size_t',['../interfaceeccodes_1_1codes__get__message__size.html#a032408e4f1a842a42fca23218ec85a4d',1,'eccodes::codes_get_message_size::codes_get_message_size_size_t()'],['../classeccodes.html#a032408e4f1a842a42fca23218ec85a4d',1,'eccodes::codes_get_message_size_size_t()']]],
   ['codes_5fget_5fnative_5ftype',['codes_get_native_type',['../namespaceec_codes.html#a1250285cb0770393bf6078f3ee3340a2',1,'ecCodes']]],
   ['codes_5fget_5foffset',['codes_get_offset',['../group__get__set.html#gaefda2b7765e1b737bcd05a825d231a1d',1,'eccodes.h']]],
+  ['codes_5fget_5fpackage_5fname',['codes_get_package_name',['../eccodes_8h.html#ac263f88377b19e546fd259dbd2e92fa8',1,'eccodes.h']]],
   ['codes_5fget_5freal4',['codes_get_real4',['../interfaceeccodes_1_1codes__get.html#ab6c505dfdf5a75f51c07683abed39b68',1,'eccodes::codes_get::codes_get_real4()'],['../classeccodes.html#ab6c505dfdf5a75f51c07683abed39b68',1,'eccodes::codes_get_real4()']]],
   ['codes_5fget_5freal4_5farray',['codes_get_real4_array',['../interfaceeccodes_1_1codes__get.html#ae1df5b7389172122fe2c84c4156f18d0',1,'eccodes::codes_get::codes_get_real4_array()'],['../classeccodes.html#ae1df5b7389172122fe2c84c4156f18d0',1,'eccodes::codes_get_real4_array()']]],
-  ['codes_5fget_5freal4_5felement',['codes_get_real4_element',['../interfaceeccodes_1_1codes__get__element.html#a95426fb251262a83fbdcc5ae86968b4b',1,'eccodes::codes_get_element::codes_get_real4_element()'],['../classeccodes.html#a95426fb251262a83fbdcc5ae86968b4b',1,'eccodes::codes_get_real4_element()']]],
-  ['codes_5fget_5freal4_5felements',['codes_get_real4_elements',['../interfaceeccodes_1_1codes__get__element.html#a0587c719213f5eb38afbb80cb30a2b8b',1,'eccodes::codes_get_element::codes_get_real4_elements()'],['../classeccodes.html#a0587c719213f5eb38afbb80cb30a2b8b',1,'eccodes::codes_get_real4_elements()']]],
+  ['codes_5fget_5freal4_5felement',['codes_get_real4_element',['../interfaceeccodes_1_1codes__get__element.html#a9d846a6d3872e4fdb991b007b7ab1301',1,'eccodes::codes_get_element::codes_get_real4_element()'],['../classeccodes.html#a9d846a6d3872e4fdb991b007b7ab1301',1,'eccodes::codes_get_real4_element()']]],
+  ['codes_5fget_5freal4_5felements',['codes_get_real4_elements',['../interfaceeccodes_1_1codes__get__element.html#a6e52b77671af20322bd3fc72282449e3',1,'eccodes::codes_get_element::codes_get_real4_elements()'],['../classeccodes.html#a6e52b77671af20322bd3fc72282449e3',1,'eccodes::codes_get_real4_elements()']]],
   ['codes_5fget_5freal8',['codes_get_real8',['../interfaceeccodes_1_1codes__get.html#a2ca22327e21aca686d29f8953e235839',1,'eccodes::codes_get::codes_get_real8()'],['../classeccodes.html#a2ca22327e21aca686d29f8953e235839',1,'eccodes::codes_get_real8()']]],
   ['codes_5fget_5freal8_5farray',['codes_get_real8_array',['../interfaceeccodes_1_1codes__get.html#a4b28e570e54dad5a779e0452d3ed66d4',1,'eccodes::codes_get::codes_get_real8_array()'],['../classeccodes.html#a4b28e570e54dad5a779e0452d3ed66d4',1,'eccodes::codes_get_real8_array()']]],
-  ['codes_5fget_5freal8_5felement',['codes_get_real8_element',['../interfaceeccodes_1_1codes__get__element.html#ac9ceb83558433f918eac6aeb00b620af',1,'eccodes::codes_get_element::codes_get_real8_element()'],['../classeccodes.html#ac9ceb83558433f918eac6aeb00b620af',1,'eccodes::codes_get_real8_element()']]],
-  ['codes_5fget_5freal8_5felements',['codes_get_real8_elements',['../interfaceeccodes_1_1codes__get__element.html#a1e550ade4f5781f19718fa8bdec802f9',1,'eccodes::codes_get_element::codes_get_real8_elements()'],['../classeccodes.html#a1e550ade4f5781f19718fa8bdec802f9',1,'eccodes::codes_get_real8_elements()']]],
-  ['codes_5fget_5fsize',['codes_get_size',['../interfaceeccodes_1_1codes__get__size.html',1,'eccodes']]],
+  ['codes_5fget_5freal8_5felement',['codes_get_real8_element',['../interfaceeccodes_1_1codes__get__element.html#a7f8c1bc6b5c77950fe80d324c99e541a',1,'eccodes::codes_get_element::codes_get_real8_element()'],['../classeccodes.html#a7f8c1bc6b5c77950fe80d324c99e541a',1,'eccodes::codes_get_real8_element()']]],
+  ['codes_5fget_5freal8_5felements',['codes_get_real8_elements',['../interfaceeccodes_1_1codes__get__element.html#ad2652d9dd45016f29721a60a5104867f',1,'eccodes::codes_get_element::codes_get_real8_elements()'],['../classeccodes.html#ad2652d9dd45016f29721a60a5104867f',1,'eccodes::codes_get_real8_elements()']]],
   ['codes_5fget_5fsize',['codes_get_size',['../group__get__set.html#ga614d4f7a6c789a4fe60ea976b6644343',1,'codes_get_size(): eccodes.h'],['../namespaceec_codes.html#ab07293de06d6ef6c5810ea3f01723884',1,'ecCodes.codes_get_size()']]],
+  ['codes_5fget_5fsize',['codes_get_size',['../interfaceeccodes_1_1codes__get__size.html',1,'eccodes']]],
   ['codes_5fget_5fsize_5fint',['codes_get_size_int',['../interfaceeccodes_1_1codes__get__size.html#ac566c4909f1ea554517d256a780cf87f',1,'eccodes::codes_get_size::codes_get_size_int()'],['../classeccodes.html#ac566c4909f1ea554517d256a780cf87f',1,'eccodes::codes_get_size_int()']]],
   ['codes_5fget_5fsize_5flong',['codes_get_size_long',['../interfaceeccodes_1_1codes__get__size.html#accd5b68ef585873b05a3f61d7dda3f3a',1,'eccodes::codes_get_size::codes_get_size_long()'],['../classeccodes.html#accd5b68ef585873b05a3f61d7dda3f3a',1,'eccodes::codes_get_size_long()']]],
   ['codes_5fget_5fstring',['codes_get_string',['../interfaceeccodes_1_1codes__get.html#a9b71df8830b162b7773cf4d1446b4303',1,'eccodes::codes_get::codes_get_string()'],['../classeccodes.html#a9b71df8830b162b7773cf4d1446b4303',1,'eccodes::codes_get_string()'],['../group__get__set.html#ga638d7bbe8dafd11847222a99b259f408',1,'codes_get_string(): eccodes.h'],['../namespaceec_codes.html#a37ff4cf406f9b0b0cd6ede563c1d5ab1',1,'ecCodes.codes_get_string()']]],
-  ['codes_5fget_5fstring_5farray',['codes_get_string_array',['../classeccodes.html#a731aac9d5d75917e12048573ae86e7c6',1,'eccodes']]],
+  ['codes_5fget_5fstring_5farray',['codes_get_string_array',['../classeccodes.html#a731aac9d5d75917e12048573ae86e7c6',1,'eccodes::codes_get_string_array()'],['../namespaceec_codes.html#a5c08a280c84117684dfe5705dfad29f5',1,'ecCodes.codes_get_string_array()']]],
   ['codes_5fget_5fstring_5flength',['codes_get_string_length',['../namespaceec_codes.html#adc7361072916fe6ec52e9cf53f066839',1,'ecCodes']]],
   ['codes_5fget_5fvalues',['codes_get_values',['../namespaceec_codes.html#a0af74e12fba25379db678363f5bdafb3',1,'ecCodes']]],
   ['codes_5fgrib_5ffind_5fnearest',['codes_grib_find_nearest',['../namespaceec_codes.html#a134bac0edaf47f29051ad905a30fb63e',1,'ecCodes']]],
   ['codes_5fgrib_5ffind_5fnearest',['codes_grib_find_nearest',['../interfaceeccodes_1_1codes__grib__find__nearest.html',1,'eccodes']]],
-  ['codes_5fgrib_5ffind_5fnearest_5ffour_5fsingle',['codes_grib_find_nearest_four_single',['../interfaceeccodes_1_1codes__grib__find__nearest.html#ad4b53c47aecc5fa5ae43c95357d2d690',1,'eccodes::codes_grib_find_nearest::codes_grib_find_nearest_four_single()'],['../classeccodes.html#ad4b53c47aecc5fa5ae43c95357d2d690',1,'eccodes::codes_grib_find_nearest_four_single()']]],
+  ['codes_5fgrib_5ffind_5fnearest_5ffour_5fsingle',['codes_grib_find_nearest_four_single',['../interfaceeccodes_1_1codes__grib__find__nearest.html#a2b677451802af47da342addf6624870a',1,'eccodes::codes_grib_find_nearest::codes_grib_find_nearest_four_single()'],['../classeccodes.html#a2b677451802af47da342addf6624870a',1,'eccodes::codes_grib_find_nearest_four_single()']]],
   ['codes_5fgrib_5ffind_5fnearest_5fmultiple',['codes_grib_find_nearest_multiple',['../interfaceeccodes_1_1codes__grib__find__nearest.html#acb92b7a78966c0b2f53ee6e288bff673',1,'eccodes::codes_grib_find_nearest::codes_grib_find_nearest_multiple()'],['../classeccodes.html#acb92b7a78966c0b2f53ee6e288bff673',1,'eccodes::codes_grib_find_nearest_multiple()']]],
-  ['codes_5fgrib_5ffind_5fnearest_5fsingle',['codes_grib_find_nearest_single',['../interfaceeccodes_1_1codes__grib__find__nearest.html#a036ae036cc766718ad224851d47d99a2',1,'eccodes::codes_grib_find_nearest::codes_grib_find_nearest_single()'],['../classeccodes.html#a036ae036cc766718ad224851d47d99a2',1,'eccodes::codes_grib_find_nearest_single()']]],
+  ['codes_5fgrib_5ffind_5fnearest_5fsingle',['codes_grib_find_nearest_single',['../interfaceeccodes_1_1codes__grib__find__nearest.html#a96fb4afe88914ad24ac796fbecc453c4',1,'eccodes::codes_grib_find_nearest::codes_grib_find_nearest_single()'],['../classeccodes.html#a96fb4afe88914ad24ac796fbecc453c4',1,'eccodes::codes_grib_find_nearest_single()']]],
   ['codes_5fgrib_5fget_5fdata',['codes_grib_get_data',['../group__iterators.html#ga9d8fdb87efce9d49ac54853ee5871e01',1,'eccodes.h']]],
   ['codes_5fgrib_5fget_5fdata',['codes_grib_get_data',['../interfaceeccodes_1_1codes__grib__get__data.html',1,'eccodes']]],
   ['codes_5fgrib_5fget_5fdata_5freal4',['codes_grib_get_data_real4',['../interfaceeccodes_1_1codes__grib__get__data.html#a0e93200c0e6e4bdacaf1bec1e0a29ee7',1,'eccodes::codes_grib_get_data::codes_grib_get_data_real4()'],['../classeccodes.html#a0e93200c0e6e4bdacaf1bec1e0a29ee7',1,'eccodes::codes_grib_get_data_real4()']]],
@@ -116,7 +119,7 @@ var searchData=
   ['codes_5fgrib_5fnearest_5ffind_5fmultiple',['codes_grib_nearest_find_multiple',['../group__iterators.html#ga6338ab9e3fb68c25d4fe48a8467cdbfc',1,'eccodes.h']]],
   ['codes_5fgrib_5fnearest_5fnew',['codes_grib_nearest_new',['../group__iterators.html#ga201d49e6c835f3b6ed041147d0bf4898',1,'eccodes.h']]],
   ['codes_5fgrib_5fnew_5ffrom_5ffile',['codes_grib_new_from_file',['../classeccodes.html#a7a21cb68f0d5058a63a4ba92a938fd27',1,'eccodes::codes_grib_new_from_file()'],['../namespaceec_codes.html#a80246f356012448955e2e75572a8d210',1,'ecCodes.codes_grib_new_from_file()']]],
-  ['codes_5fgrib_5fnew_5ffrom_5fsamples',['codes_grib_new_from_samples',['../classeccodes.html#acfc477ba642e007ec55c7e4ce2c31a9d',1,'eccodes']]],
+  ['codes_5fgrib_5fnew_5ffrom_5fsamples',['codes_grib_new_from_samples',['../classeccodes.html#acfc477ba642e007ec55c7e4ce2c31a9d',1,'eccodes::codes_grib_new_from_samples()'],['../namespaceec_codes.html#a1c476c5e2dfefa3693df1065e9bf1665',1,'ecCodes.codes_grib_new_from_samples()']]],
   ['codes_5fgribex_5fmode_5foff',['codes_gribex_mode_off',['../classeccodes.html#acb69eeef59ba780c62d7f600915aa986',1,'eccodes::codes_gribex_mode_off()'],['../group__context.html#ga810b375ccacfb6646e44b8cd0da5ee5b',1,'codes_gribex_mode_off(): eccodes.h'],['../namespaceec_codes.html#a4c5256c7e609cf3eedf7d695a4b58a45',1,'ecCodes.codes_gribex_mode_off()']]],
   ['codes_5fgribex_5fmode_5fon',['codes_gribex_mode_on',['../classeccodes.html#aa8e36bbbe3caddac4ad7d8bcdfa3cd28',1,'eccodes::codes_gribex_mode_on()'],['../group__context.html#ga51838183704645cc11a270e5f755c30c',1,'codes_gribex_mode_on(): eccodes.h'],['../namespaceec_codes.html#aec0c4f83da942b94d51a3d8b93ecb6c4',1,'ecCodes.codes_gribex_mode_on()']]],
   ['codes_5fgts_5fheader',['codes_gts_header',['../namespaceec_codes.html#ae71963dcd0256ccf5bd849f1f6643f38',1,'ecCodes']]],
@@ -128,7 +131,7 @@ var searchData=
   ['codes_5fhandle_5fdelete',['codes_handle_delete',['../group__codes__handle.html#ga358ea000ceed775e7367ccab581be978',1,'eccodes.h']]],
   ['codes_5fhandle_5fnew_5ffrom_5ffile',['codes_handle_new_from_file',['../group__codes__handle.html#ga6ec42bd6272b4a0f2cb2b220b86c71c8',1,'eccodes.h']]],
   ['codes_5fhandle_5fnew_5ffrom_5findex',['codes_handle_new_from_index',['../group__codes__index.html#gae1947cf7225ca1809c5491aa671d6b91',1,'eccodes.h']]],
-  ['codes_5fhandle_5fnew_5ffrom_5fmessage',['codes_handle_new_from_message',['../group__codes__handle.html#gaece49330c864391261cd6a0c10a18dc2',1,'eccodes.h']]],
+  ['codes_5fhandle_5fnew_5ffrom_5fmessage',['codes_handle_new_from_message',['../group__codes__handle.html#ga095447ed85ff2142dbda2867ee3b4c8d',1,'eccodes.h']]],
   ['codes_5fhandle_5fnew_5ffrom_5fmessage_5fcopy',['codes_handle_new_from_message_copy',['../group__codes__handle.html#ga079df0c709e381812ae13af08c354032',1,'eccodes.h']]],
   ['codes_5fhash_5farray_5fno_5fmatch',['CODES_HASH_ARRAY_NO_MATCH',['../group__errors.html#ga396e92d0fa82b59556c924e0dec759c6',1,'eccodes.h']]],
   ['codes_5findex',['codes_index',['../structcodes__index.html',1,'']]],
@@ -180,6 +183,7 @@ var searchData=
   ['codes_5fkeys_5fiterator',['codes_keys_iterator',['../structcodes__keys__iterator.html',1,'']]],
   ['codes_5fkeys_5fiterator_5fall_5fkeys',['CODES_KEYS_ITERATOR_ALL_KEYS',['../group__keys__iterator.html#gaa0b60d176497f5d4bc34564c31e76cf1',1,'eccodes.h']]],
   ['codes_5fkeys_5fiterator_5fdelete',['codes_keys_iterator_delete',['../classeccodes.html#a5d81274245d3a60ab85d657aa11512e5',1,'eccodes::codes_keys_iterator_delete()'],['../group__keys__iterator.html#gafdafe484a0e5a82732ddcbaec1e272a5',1,'codes_keys_iterator_delete(): eccodes.h'],['../namespaceec_codes.html#a83a077fb2dda1e7f1d317039fc7267d1',1,'ecCodes.codes_keys_iterator_delete()']]],
+  ['codes_5fkeys_5fiterator_5fdump_5fonly',['CODES_KEYS_ITERATOR_DUMP_ONLY',['../group__keys__iterator.html#gabbc4e63f0a52df1a3dab96610fca4f18',1,'eccodes.h']]],
   ['codes_5fkeys_5fiterator_5fget_5fname',['codes_keys_iterator_get_name',['../classeccodes.html#a695b7f3f87bfb465908447ce51024221',1,'eccodes::codes_keys_iterator_get_name()'],['../group__keys__iterator.html#ga1049604cb5a47359f9c7f7a42571a48b',1,'codes_keys_iterator_get_name(): eccodes.h'],['../namespaceec_codes.html#aec91e405c936c335c00267eb221c9f91',1,'ecCodes.codes_keys_iterator_get_name()']]],
   ['codes_5fkeys_5fiterator_5fnew',['codes_keys_iterator_new',['../classeccodes.html#ae9e9bae052da5148e4a0ca85f31c69b5',1,'eccodes::codes_keys_iterator_new()'],['../group__keys__iterator.html#gad3394316cf1f3c779648fe81428adb8f',1,'codes_keys_iterator_new(): eccodes.h'],['../namespaceec_codes.html#a199fb77e1395975be732e46f93b3e337',1,'ecCodes.codes_keys_iterator_new()']]],
   ['codes_5fkeys_5fiterator_5fnext',['codes_keys_iterator_next',['../classeccodes.html#aaaa40acb7f8e05783e106c32a541a66d',1,'eccodes::codes_keys_iterator_next()'],['../group__keys__iterator.html#ga804b63ac6be7c95aac71a9050008e409',1,'codes_keys_iterator_next(): eccodes.h'],['../namespaceec_codes.html#af2eecea5df157516fb60556cbd1283cd',1,'ecCodes.codes_keys_iterator_next()']]],
@@ -261,7 +265,7 @@ var searchData=
   ['codes_5fset_5freal8_5farray',['codes_set_real8_array',['../interfaceeccodes_1_1codes__set.html#a14b3bc17ea1ee83936f32dd0fced44a4',1,'eccodes::codes_set::codes_set_real8_array()'],['../classeccodes.html#a14b3bc17ea1ee83936f32dd0fced44a4',1,'eccodes::codes_set_real8_array()']]],
   ['codes_5fset_5fsamples_5fpath',['codes_set_samples_path',['../classeccodes.html#af4be467f3273e17111becbd483c25018',1,'eccodes::codes_set_samples_path()'],['../namespaceec_codes.html#ab7f299aaed48129491cc365a8ca289c2',1,'ecCodes.codes_set_samples_path()']]],
   ['codes_5fset_5fstring',['codes_set_string',['../interfaceeccodes_1_1codes__set.html#a50acfd20f8dff8b4e547135057ef119a',1,'eccodes::codes_set::codes_set_string()'],['../classeccodes.html#a50acfd20f8dff8b4e547135057ef119a',1,'eccodes::codes_set_string()'],['../group__get__set.html#ga6062cdd5950966bffa72e74708f85368',1,'codes_set_string(): eccodes.h'],['../namespaceec_codes.html#acbb0d241a917a3e726792157c1f5d973',1,'ecCodes.codes_set_string()']]],
-  ['codes_5fset_5fstring_5farray',['codes_set_string_array',['../classeccodes.html#aae3ccb53638a4d16daf98d937a96e8b6',1,'eccodes::codes_set_string_array()'],['../group__get__set.html#ga6840ee00df4366a431bedcef609f8ae5',1,'codes_set_string_array(): eccodes.h']]],
+  ['codes_5fset_5fstring_5farray',['codes_set_string_array',['../classeccodes.html#aae3ccb53638a4d16daf98d937a96e8b6',1,'eccodes::codes_set_string_array()'],['../group__get__set.html#ga6840ee00df4366a431bedcef609f8ae5',1,'codes_set_string_array(): eccodes.h'],['../namespaceec_codes.html#a54b35eededa62b2cb3a32b90060c0f2c',1,'ecCodes.codes_set_string_array()']]],
   ['codes_5fset_5fvalues',['codes_set_values',['../namespaceec_codes.html#abc699d0bb7a7dded968ee0111342ffd0',1,'ecCodes']]],
   ['codes_5fskip_5fcoded',['codes_skip_coded',['../classeccodes.html#a56a1567687b281d07c193ce273c0e1b2',1,'eccodes::codes_skip_coded()'],['../namespaceec_codes.html#a4b7140ca0dd81372721cffd1d964e4ad',1,'ecCodes.codes_skip_coded()']]],
   ['codes_5fskip_5fcomputed',['codes_skip_computed',['../classeccodes.html#aad63202303a1b6aaf9f5e605622a8095',1,'eccodes::codes_skip_computed()'],['../namespaceec_codes.html#a587af29aac21a816f8ffd327a1fce779',1,'ecCodes.codes_skip_computed()']]],
@@ -296,6 +300,5 @@ var searchData=
   ['codes_5fwrong_5fstep',['CODES_WRONG_STEP',['../group__errors.html#gadb8db78e83ccc396163068af7d71d32e',1,'eccodes.h']]],
   ['codes_5fwrong_5fstep_5funit',['CODES_WRONG_STEP_UNIT',['../group__errors.html#ga201ef38b0482edf51e93bf94200dca96',1,'eccodes.h']]],
   ['codes_5fwrong_5ftype',['CODES_WRONG_TYPE',['../group__errors.html#ga399f4bf77424c64dbb7e94212deffd38',1,'eccodes.h']]],
-  ['codesinternalerror',['CodesInternalError',['../classec_codes_1_1_codes_internal_error.html',1,'ecCodes']]],
   ['c_20interface',['C interface',['../modules.html',1,'']]]
 ];
diff --git a/html/search/all_67.js b/html/search/all_67.js
index cb9246d..69e45af 100644
--- a/html/search/all_67.js
+++ b/html/search/all_67.js
@@ -1,6 +1,4 @@
 var searchData=
 [
-  ['grib_5fget_5fstring_5farray',['grib_get_string_array',['../namespaceec_codes.html#a86388748f15624cd8fd2ec89d066295a',1,'ecCodes']]],
-  ['grib_5fset_5fstring_5farray',['grib_set_string_array',['../namespaceec_codes.html#a2353707d7e586ce4255e3a93bc0f39d4',1,'ecCodes']]],
   ['grib_20api_20installation',['GRIB API installation',['../installation.html',1,'']]]
 ];
diff --git a/html/search/all_74.js b/html/search/all_74.js
index 9e88231..33c0cf9 100644
--- a/html/search/all_74.js
+++ b/html/search/all_74.js
@@ -2,5 +2,23 @@ var searchData=
 [
   ['the_20message_20handle',['The message handle',['../group__codes__handle.html',1,'']]],
   ['the_20indexing_20feature',['The indexing feature',['../group__codes__index.html',1,'']]],
-  ['the_20context_20object',['The context object',['../group__context.html',1,'']]]
+  ['the_20context_20object',['The context object',['../group__context.html',1,'']]],
+  ['test_5fclone',['test_clone',['../classhigh__level__api_1_1_test_grib_message.html#ac4ad8985e15d4cb25c2907c09f76891b',1,'high_level_api.TestGribMessage.test_clone()'],['../classhigh__level__api_1_1_test_bufr_message.html#ac4ad8985e15d4cb25c2907c09f76891b',1,'high_level_api.TestBufrMessage.test_clone()']]],
+  ['test_5fcontent',['test_content',['../classhigh__level__api_1_1_test_bufr_message.html#aae0bd902ad06975ab7daff87c34aea50',1,'high_level_api::TestBufrMessage']]],
+  ['test_5fcreate_5fand_5fserialize_5findex',['test_create_and_serialize_index',['../classhigh__level__api_1_1_test_grib_index.html#a66286a9b57f5493b5f366cda130d4c32',1,'high_level_api::TestGribIndex']]],
+  ['test_5findex_5fcomprehension',['test_index_comprehension',['../classhigh__level__api_1_1_test_grib_index.html#a3a4f65d7dfe52f1248010fe1cdae2f01',1,'high_level_api::TestGribIndex']]],
+  ['test_5fiterator_5fprotocol',['test_iterator_protocol',['../classhigh__level__api_1_1_test_grib_file.html#ac296c5581454cae229c9e926509488f4',1,'high_level_api.TestGribFile.test_iterator_protocol()'],['../classhigh__level__api_1_1_test_bufr_file.html#ac296c5581454cae229c9e926509488f4',1,'high_level_api.TestBufrFile.test_iterator_protocol()']]],
+  ['test_5fmemory_5fmanagement',['test_memory_management',['../classhigh__level__api_1_1_test_grib_file.html#a4794a05e5b1eb5d444652bae54f04128',1,'high_level_api.TestGribFile.test_memory_management()'],['../classhigh__level__api_1_1_test_grib_index.html#a4794a05e5b1eb5d444652bae54f04128',1,'high_level_api.TestGribIndex.test_memory_management()'],['../classhigh__level__api_1_1_test_bufr_file.html#a4794a05e5b1eb5d444652bae54f04128',1,'high_level_api.TestBufrFile.test_memory_management()']]],
+  ['test_5fmessage_5fcounting_5fworks',['test_message_counting_works',['../classhigh__level__api_1_1_test_grib_file.html#a400f7c3570e6aac8231fb9e7e55a16a2',1,'high_level_api.TestGribFile.test_message_counting_works()'],['../classhigh__level__api_1_1_test_bufr_file.html#a400f7c3570e6aac8231fb9e7e55a16a2',1,'high_level_api.TestBufrFile.test_message_counting_works()']]],
+  ['test_5fmetadata',['test_metadata',['../classhigh__level__api_1_1_test_grib_message.html#a494685737e2cd151570101279bffe4c2',1,'high_level_api.TestGribMessage.test_metadata()'],['../classhigh__level__api_1_1_test_bufr_message.html#a494685737e2cd151570101279bffe4c2',1,'high_level_api.TestBufrMessage.test_metadata()']]],
+  ['test_5fmissing_5fmessage_5fbehaviour',['test_missing_message_behaviour',['../classhigh__level__api_1_1_test_grib_message.html#a4dcbe8806395648ca284d88976042231',1,'high_level_api::TestGribMessage']]],
+  ['test_5fread_5finvalid_5ffile',['test_read_invalid_file',['../classhigh__level__api_1_1_test_grib_file.html#adf65917be1841c4717dee205457d576b',1,'high_level_api.TestGribFile.test_read_invalid_file()'],['../classhigh__level__api_1_1_test_bufr_file.html#adf65917be1841c4717dee205457d576b',1,'high_level_api.TestBufrFile.test_read_invalid_file()']]],
+  ['test_5fread_5fpast_5flast_5fmessage',['test_read_past_last_message',['../classhigh__level__api_1_1_test_grib_file.html#a42d0160d68272b2d96cdffbc2db5f3f2',1,'high_level_api.TestGribFile.test_read_past_last_message()'],['../classhigh__level__api_1_1_test_bufr_file.html#a42d0160d68272b2d96cdffbc2db5f3f2',1,'high_level_api.TestBufrFile.test_read_past_last_message()']]],
+  ['test_5fserialize',['test_serialize',['../classhigh__level__api_1_1_test_grib_message.html#aa2e02e263da64ba84940736a7f00fd96',1,'high_level_api.TestGribMessage.test_serialize()'],['../classhigh__level__api_1_1_test_bufr_message.html#aa2e02e263da64ba84940736a7f00fd96',1,'high_level_api.TestBufrMessage.test_serialize()']]],
+  ['test_5fvalue_5fsetting',['test_value_setting',['../classhigh__level__api_1_1_test_grib_message.html#a9cab109486b0ae16e800b8777db052e7',1,'high_level_api.TestGribMessage.test_value_setting()'],['../classhigh__level__api_1_1_test_bufr_message.html#a9cab109486b0ae16e800b8777db052e7',1,'high_level_api.TestBufrMessage.test_value_setting()']]],
+  ['testbufrfile',['TestBufrFile',['../classhigh__level__api_1_1_test_bufr_file.html',1,'high_level_api']]],
+  ['testbufrmessage',['TestBufrMessage',['../classhigh__level__api_1_1_test_bufr_message.html',1,'high_level_api']]],
+  ['testgribfile',['TestGribFile',['../classhigh__level__api_1_1_test_grib_file.html',1,'high_level_api']]],
+  ['testgribindex',['TestGribIndex',['../classhigh__level__api_1_1_test_grib_index.html',1,'high_level_api']]],
+  ['testgribmessage',['TestGribMessage',['../classhigh__level__api_1_1_test_grib_message.html',1,'high_level_api']]]
 ];
diff --git a/html/search/classes_63.js b/html/search/classes_63.js
index 918e5f7..9726262 100644
--- a/html/search/classes_63.js
+++ b/html/search/classes_63.js
@@ -20,6 +20,5 @@ var searchData=
   ['codes_5fread_5fbytes',['codes_read_bytes',['../interfaceeccodes_1_1codes__read__bytes.html',1,'eccodes']]],
   ['codes_5fread_5ffrom_5ffile',['codes_read_from_file',['../interfaceeccodes_1_1codes__read__from__file.html',1,'eccodes']]],
   ['codes_5fset',['codes_set',['../interfaceeccodes_1_1codes__set.html',1,'eccodes']]],
-  ['codes_5fwrite_5fbytes',['codes_write_bytes',['../interfaceeccodes_1_1codes__write__bytes.html',1,'eccodes']]],
-  ['codesinternalerror',['CodesInternalError',['../classec_codes_1_1_codes_internal_error.html',1,'ecCodes']]]
+  ['codes_5fwrite_5fbytes',['codes_write_bytes',['../interfaceeccodes_1_1codes__write__bytes.html',1,'eccodes']]]
 ];
diff --git a/html/search/classes_74.html b/html/search/classes_74.html
new file mode 100644
index 0000000..ed66151
--- /dev/null
+++ b/html/search/classes_74.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.5">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_74.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/html/search/classes_74.js b/html/search/classes_74.js
new file mode 100644
index 0000000..9b86f10
--- /dev/null
+++ b/html/search/classes_74.js
@@ -0,0 +1,8 @@
+var searchData=
+[
+  ['testbufrfile',['TestBufrFile',['../classhigh__level__api_1_1_test_bufr_file.html',1,'high_level_api']]],
+  ['testbufrmessage',['TestBufrMessage',['../classhigh__level__api_1_1_test_bufr_message.html',1,'high_level_api']]],
+  ['testgribfile',['TestGribFile',['../classhigh__level__api_1_1_test_grib_file.html',1,'high_level_api']]],
+  ['testgribindex',['TestGribIndex',['../classhigh__level__api_1_1_test_grib_index.html',1,'high_level_api']]],
+  ['testgribmessage',['TestGribMessage',['../classhigh__level__api_1_1_test_grib_message.html',1,'high_level_api']]]
+];
diff --git a/html/search/functions_63.js b/html/search/functions_63.js
index 0858ee9..950689d 100644
--- a/html/search/functions_63.js
+++ b/html/search/functions_63.js
@@ -1,6 +1,7 @@
 var searchData=
 [
   ['codes_5fany_5fnew_5ffrom_5ffile',['codes_any_new_from_file',['../classeccodes.html#aa468943e1c669487375b2e3d46ff84b1',1,'eccodes::codes_any_new_from_file()'],['../namespaceec_codes.html#af4a4c95465d2026ad549920b07150bab',1,'ecCodes.codes_any_new_from_file()']]],
+  ['codes_5fbufr_5fcopy_5fdata',['codes_bufr_copy_data',['../classeccodes.html#a030c4f01609c1206deef936ba3e0029b',1,'eccodes::codes_bufr_copy_data()'],['../namespaceec_codes.html#a3ba2700ed57b0a155f7dd76f6b1d8ab9',1,'ecCodes.codes_bufr_copy_data()']]],
   ['codes_5fbufr_5fhandle_5fnew_5ffrom_5ffile',['codes_bufr_handle_new_from_file',['../group__codes__handle.html#ga6958c3cd7e4059af5c26898a872262ff',1,'eccodes.h']]],
   ['codes_5fbufr_5fhandle_5fnew_5ffrom_5fsamples',['codes_bufr_handle_new_from_samples',['../group__codes__handle.html#ga56d0f831e520ec7bc4a0ca334c63f557',1,'eccodes.h']]],
   ['codes_5fbufr_5fnew_5ffrom_5ffile',['codes_bufr_new_from_file',['../classeccodes.html#a94050d64954482cd82ea6f007fdc9ac0',1,'eccodes::codes_bufr_new_from_file()'],['../namespaceec_codes.html#a44c10386781390c16f1a567590b33c11',1,'ecCodes.codes_bufr_new_from_file()']]],
@@ -12,6 +13,7 @@ var searchData=
   ['codes_5fcontext_5fget_5fdefault',['codes_context_get_default',['../group__context.html#ga3c1086a1abccc58db01609611c3e706d',1,'eccodes.h']]],
   ['codes_5fcontext_5fset_5fdefinitions_5fpath',['codes_context_set_definitions_path',['../group__context.html#ga8abf0ff0f52f1e808edf092f2e7c1147',1,'eccodes.h']]],
   ['codes_5fcontext_5fset_5fsamples_5fpath',['codes_context_set_samples_path',['../group__context.html#ga4f2f808f560a3b744b4c904b3d1a1c48',1,'eccodes.h']]],
+  ['codes_5fcopy_5fkey',['codes_copy_key',['../classeccodes.html#a43bbbee406c2e974ae9cd4dcea41bd4d',1,'eccodes']]],
   ['codes_5fcopy_5fmessage',['codes_copy_message',['../classeccodes.html#afdd32c1a78f0a3d54992e0a6a6bfc66b',1,'eccodes']]],
   ['codes_5fcopy_5fnamespace',['codes_copy_namespace',['../classeccodes.html#a8bba3684a289b1e8c6bcea0b67c45b5d',1,'eccodes::codes_copy_namespace()'],['../group__get__set.html#gaecd9fa4b22117df7569320ddaa2431e1',1,'codes_copy_namespace(): eccodes.h'],['../namespaceec_codes.html#a6c83d2b9572083c7a83c9c5d39010b14',1,'ecCodes.codes_copy_namespace()']]],
   ['codes_5fcount_5fin_5ffile',['codes_count_in_file',['../classeccodes.html#a0a09420f86caf79873b2fb067e360049',1,'eccodes::codes_count_in_file()'],['../group__codes__handle.html#ga4c2203d55c2c3ca792e44e4eb26edfb5',1,'codes_count_in_file(): eccodes.h'],['../namespaceec_codes.html#a5c7a1d8a2c7802edd327a35cb35984e7',1,'ecCodes.codes_count_in_file()']]],
@@ -45,25 +47,26 @@ var searchData=
   ['codes_5fget_5fmessage_5fsize_5fsize_5ft',['codes_get_message_size_size_t',['../interfaceeccodes_1_1codes__get__message__size.html#a032408e4f1a842a42fca23218ec85a4d',1,'eccodes::codes_get_message_size::codes_get_message_size_size_t()'],['../classeccodes.html#a032408e4f1a842a42fca23218ec85a4d',1,'eccodes::codes_get_message_size_size_t()']]],
   ['codes_5fget_5fnative_5ftype',['codes_get_native_type',['../namespaceec_codes.html#a1250285cb0770393bf6078f3ee3340a2',1,'ecCodes']]],
   ['codes_5fget_5foffset',['codes_get_offset',['../group__get__set.html#gaefda2b7765e1b737bcd05a825d231a1d',1,'eccodes.h']]],
+  ['codes_5fget_5fpackage_5fname',['codes_get_package_name',['../eccodes_8h.html#ac263f88377b19e546fd259dbd2e92fa8',1,'eccodes.h']]],
   ['codes_5fget_5freal4',['codes_get_real4',['../interfaceeccodes_1_1codes__get.html#ab6c505dfdf5a75f51c07683abed39b68',1,'eccodes::codes_get::codes_get_real4()'],['../classeccodes.html#ab6c505dfdf5a75f51c07683abed39b68',1,'eccodes::codes_get_real4()']]],
   ['codes_5fget_5freal4_5farray',['codes_get_real4_array',['../interfaceeccodes_1_1codes__get.html#ae1df5b7389172122fe2c84c4156f18d0',1,'eccodes::codes_get::codes_get_real4_array()'],['../classeccodes.html#ae1df5b7389172122fe2c84c4156f18d0',1,'eccodes::codes_get_real4_array()']]],
-  ['codes_5fget_5freal4_5felement',['codes_get_real4_element',['../interfaceeccodes_1_1codes__get__element.html#a95426fb251262a83fbdcc5ae86968b4b',1,'eccodes::codes_get_element::codes_get_real4_element()'],['../classeccodes.html#a95426fb251262a83fbdcc5ae86968b4b',1,'eccodes::codes_get_real4_element()']]],
-  ['codes_5fget_5freal4_5felements',['codes_get_real4_elements',['../interfaceeccodes_1_1codes__get__element.html#a0587c719213f5eb38afbb80cb30a2b8b',1,'eccodes::codes_get_element::codes_get_real4_elements()'],['../classeccodes.html#a0587c719213f5eb38afbb80cb30a2b8b',1,'eccodes::codes_get_real4_elements()']]],
+  ['codes_5fget_5freal4_5felement',['codes_get_real4_element',['../interfaceeccodes_1_1codes__get__element.html#a9d846a6d3872e4fdb991b007b7ab1301',1,'eccodes::codes_get_element::codes_get_real4_element()'],['../classeccodes.html#a9d846a6d3872e4fdb991b007b7ab1301',1,'eccodes::codes_get_real4_element()']]],
+  ['codes_5fget_5freal4_5felements',['codes_get_real4_elements',['../interfaceeccodes_1_1codes__get__element.html#a6e52b77671af20322bd3fc72282449e3',1,'eccodes::codes_get_element::codes_get_real4_elements()'],['../classeccodes.html#a6e52b77671af20322bd3fc72282449e3',1,'eccodes::codes_get_real4_elements()']]],
   ['codes_5fget_5freal8',['codes_get_real8',['../interfaceeccodes_1_1codes__get.html#a2ca22327e21aca686d29f8953e235839',1,'eccodes::codes_get::codes_get_real8()'],['../classeccodes.html#a2ca22327e21aca686d29f8953e235839',1,'eccodes::codes_get_real8()']]],
   ['codes_5fget_5freal8_5farray',['codes_get_real8_array',['../interfaceeccodes_1_1codes__get.html#a4b28e570e54dad5a779e0452d3ed66d4',1,'eccodes::codes_get::codes_get_real8_array()'],['../classeccodes.html#a4b28e570e54dad5a779e0452d3ed66d4',1,'eccodes::codes_get_real8_array()']]],
-  ['codes_5fget_5freal8_5felement',['codes_get_real8_element',['../interfaceeccodes_1_1codes__get__element.html#ac9ceb83558433f918eac6aeb00b620af',1,'eccodes::codes_get_element::codes_get_real8_element()'],['../classeccodes.html#ac9ceb83558433f918eac6aeb00b620af',1,'eccodes::codes_get_real8_element()']]],
-  ['codes_5fget_5freal8_5felements',['codes_get_real8_elements',['../interfaceeccodes_1_1codes__get__element.html#a1e550ade4f5781f19718fa8bdec802f9',1,'eccodes::codes_get_element::codes_get_real8_elements()'],['../classeccodes.html#a1e550ade4f5781f19718fa8bdec802f9',1,'eccodes::codes_get_real8_elements()']]],
+  ['codes_5fget_5freal8_5felement',['codes_get_real8_element',['../interfaceeccodes_1_1codes__get__element.html#a7f8c1bc6b5c77950fe80d324c99e541a',1,'eccodes::codes_get_element::codes_get_real8_element()'],['../classeccodes.html#a7f8c1bc6b5c77950fe80d324c99e541a',1,'eccodes::codes_get_real8_element()']]],
+  ['codes_5fget_5freal8_5felements',['codes_get_real8_elements',['../interfaceeccodes_1_1codes__get__element.html#ad2652d9dd45016f29721a60a5104867f',1,'eccodes::codes_get_element::codes_get_real8_elements()'],['../classeccodes.html#ad2652d9dd45016f29721a60a5104867f',1,'eccodes::codes_get_real8_elements()']]],
   ['codes_5fget_5fsize',['codes_get_size',['../group__get__set.html#ga614d4f7a6c789a4fe60ea976b6644343',1,'codes_get_size(): eccodes.h'],['../namespaceec_codes.html#ab07293de06d6ef6c5810ea3f01723884',1,'ecCodes.codes_get_size()']]],
   ['codes_5fget_5fsize_5fint',['codes_get_size_int',['../interfaceeccodes_1_1codes__get__size.html#ac566c4909f1ea554517d256a780cf87f',1,'eccodes::codes_get_size::codes_get_size_int()'],['../classeccodes.html#ac566c4909f1ea554517d256a780cf87f',1,'eccodes::codes_get_size_int()']]],
   ['codes_5fget_5fsize_5flong',['codes_get_size_long',['../interfaceeccodes_1_1codes__get__size.html#accd5b68ef585873b05a3f61d7dda3f3a',1,'eccodes::codes_get_size::codes_get_size_long()'],['../classeccodes.html#accd5b68ef585873b05a3f61d7dda3f3a',1,'eccodes::codes_get_size_long()']]],
   ['codes_5fget_5fstring',['codes_get_string',['../interfaceeccodes_1_1codes__get.html#a9b71df8830b162b7773cf4d1446b4303',1,'eccodes::codes_get::codes_get_string()'],['../classeccodes.html#a9b71df8830b162b7773cf4d1446b4303',1,'eccodes::codes_get_string()'],['../group__get__set.html#ga638d7bbe8dafd11847222a99b259f408',1,'codes_get_string(): eccodes.h'],['../namespaceec_codes.html#a37ff4cf406f9b0b0cd6ede563c1d5ab1',1,'ecCodes.codes_get_string()']]],
-  ['codes_5fget_5fstring_5farray',['codes_get_string_array',['../classeccodes.html#a731aac9d5d75917e12048573ae86e7c6',1,'eccodes']]],
+  ['codes_5fget_5fstring_5farray',['codes_get_string_array',['../classeccodes.html#a731aac9d5d75917e12048573ae86e7c6',1,'eccodes::codes_get_string_array()'],['../namespaceec_codes.html#a5c08a280c84117684dfe5705dfad29f5',1,'ecCodes.codes_get_string_array()']]],
   ['codes_5fget_5fstring_5flength',['codes_get_string_length',['../namespaceec_codes.html#adc7361072916fe6ec52e9cf53f066839',1,'ecCodes']]],
   ['codes_5fget_5fvalues',['codes_get_values',['../namespaceec_codes.html#a0af74e12fba25379db678363f5bdafb3',1,'ecCodes']]],
   ['codes_5fgrib_5ffind_5fnearest',['codes_grib_find_nearest',['../namespaceec_codes.html#a134bac0edaf47f29051ad905a30fb63e',1,'ecCodes']]],
-  ['codes_5fgrib_5ffind_5fnearest_5ffour_5fsingle',['codes_grib_find_nearest_four_single',['../interfaceeccodes_1_1codes__grib__find__nearest.html#ad4b53c47aecc5fa5ae43c95357d2d690',1,'eccodes::codes_grib_find_nearest::codes_grib_find_nearest_four_single()'],['../classeccodes.html#ad4b53c47aecc5fa5ae43c95357d2d690',1,'eccodes::codes_grib_find_nearest_four_single()']]],
+  ['codes_5fgrib_5ffind_5fnearest_5ffour_5fsingle',['codes_grib_find_nearest_four_single',['../interfaceeccodes_1_1codes__grib__find__nearest.html#a2b677451802af47da342addf6624870a',1,'eccodes::codes_grib_find_nearest::codes_grib_find_nearest_four_single()'],['../classeccodes.html#a2b677451802af47da342addf6624870a',1,'eccodes::codes_grib_find_nearest_four_single()']]],
   ['codes_5fgrib_5ffind_5fnearest_5fmultiple',['codes_grib_find_nearest_multiple',['../interfaceeccodes_1_1codes__grib__find__nearest.html#acb92b7a78966c0b2f53ee6e288bff673',1,'eccodes::codes_grib_find_nearest::codes_grib_find_nearest_multiple()'],['../classeccodes.html#acb92b7a78966c0b2f53ee6e288bff673',1,'eccodes::codes_grib_find_nearest_multiple()']]],
-  ['codes_5fgrib_5ffind_5fnearest_5fsingle',['codes_grib_find_nearest_single',['../interfaceeccodes_1_1codes__grib__find__nearest.html#a036ae036cc766718ad224851d47d99a2',1,'eccodes::codes_grib_find_nearest::codes_grib_find_nearest_single()'],['../classeccodes.html#a036ae036cc766718ad224851d47d99a2',1,'eccodes::codes_grib_find_nearest_single()']]],
+  ['codes_5fgrib_5ffind_5fnearest_5fsingle',['codes_grib_find_nearest_single',['../interfaceeccodes_1_1codes__grib__find__nearest.html#a96fb4afe88914ad24ac796fbecc453c4',1,'eccodes::codes_grib_find_nearest::codes_grib_find_nearest_single()'],['../classeccodes.html#a96fb4afe88914ad24ac796fbecc453c4',1,'eccodes::codes_grib_find_nearest_single()']]],
   ['codes_5fgrib_5fget_5fdata',['codes_grib_get_data',['../group__iterators.html#ga9d8fdb87efce9d49ac54853ee5871e01',1,'eccodes.h']]],
   ['codes_5fgrib_5fget_5fdata_5freal4',['codes_grib_get_data_real4',['../interfaceeccodes_1_1codes__grib__get__data.html#a0e93200c0e6e4bdacaf1bec1e0a29ee7',1,'eccodes::codes_grib_get_data::codes_grib_get_data_real4()'],['../classeccodes.html#a0e93200c0e6e4bdacaf1bec1e0a29ee7',1,'eccodes::codes_grib_get_data_real4()']]],
   ['codes_5fgrib_5fget_5fdata_5freal8',['codes_grib_get_data_real8',['../interfaceeccodes_1_1codes__grib__get__data.html#a043bb1e696da61d06523ad35ae16fe8c',1,'eccodes::codes_grib_get_data::codes_grib_get_data_real8()'],['../classeccodes.html#a043bb1e696da61d06523ad35ae16fe8c',1,'eccodes::codes_grib_get_data_real8()']]],
@@ -92,7 +95,7 @@ var searchData=
   ['codes_5fgrib_5fnearest_5ffind_5fmultiple',['codes_grib_nearest_find_multiple',['../group__iterators.html#ga6338ab9e3fb68c25d4fe48a8467cdbfc',1,'eccodes.h']]],
   ['codes_5fgrib_5fnearest_5fnew',['codes_grib_nearest_new',['../group__iterators.html#ga201d49e6c835f3b6ed041147d0bf4898',1,'eccodes.h']]],
   ['codes_5fgrib_5fnew_5ffrom_5ffile',['codes_grib_new_from_file',['../classeccodes.html#a7a21cb68f0d5058a63a4ba92a938fd27',1,'eccodes::codes_grib_new_from_file()'],['../namespaceec_codes.html#a80246f356012448955e2e75572a8d210',1,'ecCodes.codes_grib_new_from_file()']]],
-  ['codes_5fgrib_5fnew_5ffrom_5fsamples',['codes_grib_new_from_samples',['../classeccodes.html#acfc477ba642e007ec55c7e4ce2c31a9d',1,'eccodes']]],
+  ['codes_5fgrib_5fnew_5ffrom_5fsamples',['codes_grib_new_from_samples',['../classeccodes.html#acfc477ba642e007ec55c7e4ce2c31a9d',1,'eccodes::codes_grib_new_from_samples()'],['../namespaceec_codes.html#a1c476c5e2dfefa3693df1065e9bf1665',1,'ecCodes.codes_grib_new_from_samples()']]],
   ['codes_5fgribex_5fmode_5foff',['codes_gribex_mode_off',['../classeccodes.html#acb69eeef59ba780c62d7f600915aa986',1,'eccodes::codes_gribex_mode_off()'],['../group__context.html#ga810b375ccacfb6646e44b8cd0da5ee5b',1,'codes_gribex_mode_off(): eccodes.h'],['../namespaceec_codes.html#a4c5256c7e609cf3eedf7d695a4b58a45',1,'ecCodes.codes_gribex_mode_off()']]],
   ['codes_5fgribex_5fmode_5fon',['codes_gribex_mode_on',['../classeccodes.html#aa8e36bbbe3caddac4ad7d8bcdfa3cd28',1,'eccodes::codes_gribex_mode_on()'],['../group__context.html#ga51838183704645cc11a270e5f755c30c',1,'codes_gribex_mode_on(): eccodes.h'],['../namespaceec_codes.html#aec0c4f83da942b94d51a3d8b93ecb6c4',1,'ecCodes.codes_gribex_mode_on()']]],
   ['codes_5fgts_5fheader',['codes_gts_header',['../namespaceec_codes.html#ae71963dcd0256ccf5bd849f1f6643f38',1,'ecCodes']]],
@@ -103,7 +106,7 @@ var searchData=
   ['codes_5fhandle_5fdelete',['codes_handle_delete',['../group__codes__handle.html#ga358ea000ceed775e7367ccab581be978',1,'eccodes.h']]],
   ['codes_5fhandle_5fnew_5ffrom_5ffile',['codes_handle_new_from_file',['../group__codes__handle.html#ga6ec42bd6272b4a0f2cb2b220b86c71c8',1,'eccodes.h']]],
   ['codes_5fhandle_5fnew_5ffrom_5findex',['codes_handle_new_from_index',['../group__codes__index.html#gae1947cf7225ca1809c5491aa671d6b91',1,'eccodes.h']]],
-  ['codes_5fhandle_5fnew_5ffrom_5fmessage',['codes_handle_new_from_message',['../group__codes__handle.html#gaece49330c864391261cd6a0c10a18dc2',1,'eccodes.h']]],
+  ['codes_5fhandle_5fnew_5ffrom_5fmessage',['codes_handle_new_from_message',['../group__codes__handle.html#ga095447ed85ff2142dbda2867ee3b4c8d',1,'eccodes.h']]],
   ['codes_5fhandle_5fnew_5ffrom_5fmessage_5fcopy',['codes_handle_new_from_message_copy',['../group__codes__handle.html#ga079df0c709e381812ae13af08c354032',1,'eccodes.h']]],
   ['codes_5findex_5fadd_5ffile',['codes_index_add_file',['../classeccodes.html#af89d3c57b15bdbd00241358a10b836a8',1,'eccodes::codes_index_add_file()'],['../group__codes__index.html#ga8fa6ca199182c48c0327e61ac98dfd00',1,'codes_index_add_file(): eccodes.h'],['../namespaceec_codes.html#a1c18ea67e5ce00500824676691b4bc4a',1,'ecCodes.codes_index_add_file()']]],
   ['codes_5findex_5fcreate',['codes_index_create',['../classeccodes.html#a5f52ecf1abe0a68a32517fe2a0d08058',1,'eccodes']]],
@@ -182,7 +185,7 @@ var searchData=
   ['codes_5fset_5freal8_5farray',['codes_set_real8_array',['../interfaceeccodes_1_1codes__set.html#a14b3bc17ea1ee83936f32dd0fced44a4',1,'eccodes::codes_set::codes_set_real8_array()'],['../classeccodes.html#a14b3bc17ea1ee83936f32dd0fced44a4',1,'eccodes::codes_set_real8_array()']]],
   ['codes_5fset_5fsamples_5fpath',['codes_set_samples_path',['../classeccodes.html#af4be467f3273e17111becbd483c25018',1,'eccodes::codes_set_samples_path()'],['../namespaceec_codes.html#ab7f299aaed48129491cc365a8ca289c2',1,'ecCodes.codes_set_samples_path()']]],
   ['codes_5fset_5fstring',['codes_set_string',['../interfaceeccodes_1_1codes__set.html#a50acfd20f8dff8b4e547135057ef119a',1,'eccodes::codes_set::codes_set_string()'],['../classeccodes.html#a50acfd20f8dff8b4e547135057ef119a',1,'eccodes::codes_set_string()'],['../group__get__set.html#ga6062cdd5950966bffa72e74708f85368',1,'codes_set_string(): eccodes.h'],['../namespaceec_codes.html#acbb0d241a917a3e726792157c1f5d973',1,'ecCodes.codes_set_string()']]],
-  ['codes_5fset_5fstring_5farray',['codes_set_string_array',['../classeccodes.html#aae3ccb53638a4d16daf98d937a96e8b6',1,'eccodes::codes_set_string_array()'],['../group__get__set.html#ga6840ee00df4366a431bedcef609f8ae5',1,'codes_set_string_array(): eccodes.h']]],
+  ['codes_5fset_5fstring_5farray',['codes_set_string_array',['../classeccodes.html#aae3ccb53638a4d16daf98d937a96e8b6',1,'eccodes::codes_set_string_array()'],['../group__get__set.html#ga6840ee00df4366a431bedcef609f8ae5',1,'codes_set_string_array(): eccodes.h'],['../namespaceec_codes.html#a54b35eededa62b2cb3a32b90060c0f2c',1,'ecCodes.codes_set_string_array()']]],
   ['codes_5fset_5fvalues',['codes_set_values',['../namespaceec_codes.html#abc699d0bb7a7dded968ee0111342ffd0',1,'ecCodes']]],
   ['codes_5fskip_5fcoded',['codes_skip_coded',['../classeccodes.html#a56a1567687b281d07c193ce273c0e1b2',1,'eccodes::codes_skip_coded()'],['../namespaceec_codes.html#a4b7140ca0dd81372721cffd1d964e4ad',1,'ecCodes.codes_skip_coded()']]],
   ['codes_5fskip_5fcomputed',['codes_skip_computed',['../classeccodes.html#aad63202303a1b6aaf9f5e605622a8095',1,'eccodes::codes_skip_computed()'],['../namespaceec_codes.html#a587af29aac21a816f8ffd327a1fce779',1,'ecCodes.codes_skip_computed()']]],
diff --git a/html/search/functions_67.html b/html/search/functions_67.html
deleted file mode 100644
index 39cc96d..0000000
--- a/html/search/functions_67.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
-<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.5">
-<link rel="stylesheet" type="text/css" href="search.css"/>
-<script type="text/javascript" src="functions_67.js"></script>
-<script type="text/javascript" src="search.js"></script>
-</head>
-<body class="SRPage">
-<div id="SRIndex">
-<div class="SRStatus" id="Loading">Loading...</div>
-<div id="SRResults"></div>
-<script type="text/javascript"><!--
-createResults();
---></script>
-<div class="SRStatus" id="Searching">Searching...</div>
-<div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
-document.getElementById("Loading").style.display="none";
-document.getElementById("NoMatches").style.display="none";
-var searchResults = new SearchResults("searchResults");
-searchResults.Search();
---></script>
-</div>
-</body>
-</html>
diff --git a/html/search/functions_67.js b/html/search/functions_67.js
deleted file mode 100644
index f6b6951..0000000
--- a/html/search/functions_67.js
+++ /dev/null
@@ -1,5 +0,0 @@
-var searchData=
-[
-  ['grib_5fget_5fstring_5farray',['grib_get_string_array',['../namespaceec_codes.html#a86388748f15624cd8fd2ec89d066295a',1,'ecCodes']]],
-  ['grib_5fset_5fstring_5farray',['grib_set_string_array',['../namespaceec_codes.html#a2353707d7e586ce4255e3a93bc0f39d4',1,'ecCodes']]]
-];
diff --git a/html/search/functions_74.html b/html/search/functions_74.html
new file mode 100644
index 0000000..8b138f0
--- /dev/null
+++ b/html/search/functions_74.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.5">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_74.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/html/search/functions_74.js b/html/search/functions_74.js
new file mode 100644
index 0000000..9c4c431
--- /dev/null
+++ b/html/search/functions_74.js
@@ -0,0 +1,16 @@
+var searchData=
+[
+  ['test_5fclone',['test_clone',['../classhigh__level__api_1_1_test_grib_message.html#ac4ad8985e15d4cb25c2907c09f76891b',1,'high_level_api.TestGribMessage.test_clone()'],['../classhigh__level__api_1_1_test_bufr_message.html#ac4ad8985e15d4cb25c2907c09f76891b',1,'high_level_api.TestBufrMessage.test_clone()']]],
+  ['test_5fcontent',['test_content',['../classhigh__level__api_1_1_test_bufr_message.html#aae0bd902ad06975ab7daff87c34aea50',1,'high_level_api::TestBufrMessage']]],
+  ['test_5fcreate_5fand_5fserialize_5findex',['test_create_and_serialize_index',['../classhigh__level__api_1_1_test_grib_index.html#a66286a9b57f5493b5f366cda130d4c32',1,'high_level_api::TestGribIndex']]],
+  ['test_5findex_5fcomprehension',['test_index_comprehension',['../classhigh__level__api_1_1_test_grib_index.html#a3a4f65d7dfe52f1248010fe1cdae2f01',1,'high_level_api::TestGribIndex']]],
+  ['test_5fiterator_5fprotocol',['test_iterator_protocol',['../classhigh__level__api_1_1_test_grib_file.html#ac296c5581454cae229c9e926509488f4',1,'high_level_api.TestGribFile.test_iterator_protocol()'],['../classhigh__level__api_1_1_test_bufr_file.html#ac296c5581454cae229c9e926509488f4',1,'high_level_api.TestBufrFile.test_iterator_protocol()']]],
+  ['test_5fmemory_5fmanagement',['test_memory_management',['../classhigh__level__api_1_1_test_grib_file.html#a4794a05e5b1eb5d444652bae54f04128',1,'high_level_api.TestGribFile.test_memory_management()'],['../classhigh__level__api_1_1_test_grib_index.html#a4794a05e5b1eb5d444652bae54f04128',1,'high_level_api.TestGribIndex.test_memory_management()'],['../classhigh__level__api_1_1_test_bufr_file.html#a4794a05e5b1eb5d444652bae54f04128',1,'high_level_api.TestBufrFile.test_memory_management()']]],
+  ['test_5fmessage_5fcounting_5fworks',['test_message_counting_works',['../classhigh__level__api_1_1_test_grib_file.html#a400f7c3570e6aac8231fb9e7e55a16a2',1,'high_level_api.TestGribFile.test_message_counting_works()'],['../classhigh__level__api_1_1_test_bufr_file.html#a400f7c3570e6aac8231fb9e7e55a16a2',1,'high_level_api.TestBufrFile.test_message_counting_works()']]],
+  ['test_5fmetadata',['test_metadata',['../classhigh__level__api_1_1_test_grib_message.html#a494685737e2cd151570101279bffe4c2',1,'high_level_api.TestGribMessage.test_metadata()'],['../classhigh__level__api_1_1_test_bufr_message.html#a494685737e2cd151570101279bffe4c2',1,'high_level_api.TestBufrMessage.test_metadata()']]],
+  ['test_5fmissing_5fmessage_5fbehaviour',['test_missing_message_behaviour',['../classhigh__level__api_1_1_test_grib_message.html#a4dcbe8806395648ca284d88976042231',1,'high_level_api::TestGribMessage']]],
+  ['test_5fread_5finvalid_5ffile',['test_read_invalid_file',['../classhigh__level__api_1_1_test_grib_file.html#adf65917be1841c4717dee205457d576b',1,'high_level_api.TestGribFile.test_read_invalid_file()'],['../classhigh__level__api_1_1_test_bufr_file.html#adf65917be1841c4717dee205457d576b',1,'high_level_api.TestBufrFile.test_read_invalid_file()']]],
+  ['test_5fread_5fpast_5flast_5fmessage',['test_read_past_last_message',['../classhigh__level__api_1_1_test_grib_file.html#a42d0160d68272b2d96cdffbc2db5f3f2',1,'high_level_api.TestGribFile.test_read_past_last_message()'],['../classhigh__level__api_1_1_test_bufr_file.html#a42d0160d68272b2d96cdffbc2db5f3f2',1,'high_level_api.TestBufrFile.test_read_past_last_message()']]],
+  ['test_5fserialize',['test_serialize',['../classhigh__level__api_1_1_test_grib_message.html#aa2e02e263da64ba84940736a7f00fd96',1,'high_level_api.TestGribMessage.test_serialize()'],['../classhigh__level__api_1_1_test_bufr_message.html#aa2e02e263da64ba84940736a7f00fd96',1,'high_level_api.TestBufrMessage.test_serialize()']]],
+  ['test_5fvalue_5fsetting',['test_value_setting',['../classhigh__level__api_1_1_test_grib_message.html#a9cab109486b0ae16e800b8777db052e7',1,'high_level_api.TestGribMessage.test_value_setting()'],['../classhigh__level__api_1_1_test_bufr_message.html#a9cab109486b0ae16e800b8777db052e7',1,'high_level_api.TestBufrMessage.test_value_setting()']]]
+];
diff --git a/html/search/search.js b/html/search/search.js
index f61a40a..5c67ff1 100644
--- a/html/search/search.js
+++ b/html/search/search.js
@@ -8,10 +8,10 @@
 var indexSectionsWithContent =
 {
   0: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101010111000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
-  1: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+  1: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001010000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
   2: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
   3: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
-  4: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+  4: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
   5: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100010011000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
   6: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
 };
diff --git a/license.pl b/license.pl
index 8e7223e..fc94784 100755
--- a/license.pl
+++ b/license.pl
@@ -2,7 +2,7 @@
 use strict;
 
 my $APACHE = <<"EOF";
-Copyright 2005-2016 ECMWF.
+Copyright 2005-2017 ECMWF.
 
 This software is licensed under the terms of the Apache Licence Version 2.0
 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/memfs/CMakeLists.txt b/memfs/CMakeLists.txt
index 7f9c466..23a4a91 100644
--- a/memfs/CMakeLists.txt
+++ b/memfs/CMakeLists.txt
@@ -12,7 +12,8 @@ set_source_files_properties( ${CMAKE_CURRENT_BINARY_DIR}/memfs.c PROPERTIES OBJE
     # "${PROJECT_SOURCE_DIR}/memfs.py" ${definition_files}"
     )
 
-ecbuild_add_library(TARGET    eccodes_memfs
-                    CONDITION HAVE_MEMFS
-                    SOURCES   ${CMAKE_CURRENT_BINARY_DIR}/memfs.c
-                    GENERATED ${CMAKE_CURRENT_BINARY_DIR}/memfs.c )
+if (HAVE_MEMFS)
+    ecbuild_add_library(TARGET    eccodes_memfs
+                        SOURCES   ${CMAKE_CURRENT_BINARY_DIR}/memfs.c
+                        GENERATED ${CMAKE_CURRENT_BINARY_DIR}/memfs.c)
+endif()
diff --git a/perf/jmeter.awk b/perf/jmeter.awk
index 790c913..b6f1efd 100644
--- a/perf/jmeter.awk
+++ b/perf/jmeter.awk
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/perf/time.sh b/perf/time.sh
index 50a8e08..213bc71 100755
--- a/perf/time.sh
+++ b/perf/time.sh
@@ -1,6 +1,6 @@
 # This script times stuff to get nice reports
 
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/perl/GRIB-API/API.xs b/perl/GRIB-API/API.xs
deleted file mode 100644
index 5b6349e..0000000
--- a/perl/GRIB-API/API.xs
+++ /dev/null
@@ -1,987 +0,0 @@
-#include "EXTERN.h"
-#include "perl.h"
-#include "XSUB.h"
-
-#include "ppport.h"
-
-#include <grib_api.h>
-#include <stdlib.h>
-/*
-http://world.std.com/~swmcd/steven/perl/pm/xs/modules/Set/Bit/
-*/
-
-static int _fail_on_error = 0;
-
-static int error(int e)
-{
-	if(e && _fail_on_error) croak(grib_get_error_message(e));
-	return e;
-}
-
-static int fail(int e)
-{
-	if(e) croak(grib_get_error_message(e));
-	return e;
-}
-
-static SV* get_long(grib_handle* h,const char* what)
-{
-	long value;
-
-	if(error(grib_get_long(h,what,&value)) == 0)
-		return sv_2mortal(newSViv(value));
-
-	return &PL_sv_undef;
-}
-
-static SV* get_double(grib_handle* h,const char* what)
-{
-	double value;
-
-	if(error(grib_get_double(h,what,&value)) == 0)
-		return sv_2mortal(newSVnv(value));
-
-	return &PL_sv_undef;
-}
-
-static SV* get_string(grib_handle* h,const char* what)
-{
-	char buf[1024];
-	size_t size = sizeof(buf);
-
-	if(error(grib_get_string(h,what,buf,&size)) == 0)
-	{
-		while(size>0 && buf[size-1] == 0) size--;
-		return sv_2mortal(newSVpv(buf,size));
-	}
-
-	return &PL_sv_undef;
-}
-
-static SV* get_bytes(grib_handle* h,const char* what)
-{
-	size_t size;
-	SV*   sv;
-	char *buffer = 0;
-
-	if(error(grib_get_size(h,what,&size)) != 0)
-		return &PL_sv_undef;
-
-	sv = newSVpv("",0);
-	buffer = SvGROW(sv,size);
-
-	if(error(grib_get_bytes(h,what,buffer,&size)) == 0)
-	{
-		SvCUR_set(sv, size);
-		SvPOK_only(sv);
-		return sv_2mortal(sv);
-	}
-	else
-	{
-		/* Memory leek ... */
-		return &PL_sv_undef;
-	}
-
-}
-
-static SV* get_double_array(grib_handle* h,const char* what)
-{
-
-	size_t size = 0;
-	double *values = 0;
-	SV* result  = &PL_sv_undef;
-
-
-	if(error(grib_get_size(h,what,&size)) != 0)
-		return &PL_sv_undef;
-
-	Newz(0,values,size,double);
-
-	if(error(grib_get_double_array(h,what,values,&size)) == 0)
-	{
-			AV* av      = newAV();
-			int i;
-
-			for(i = 0; i < size; i++)
-				av_push(av,newSVnv(values[i]));
-
-			result = sv_2mortal(newRV_noinc((SV*)av));
-			/* sv_bless(result,gv_stashpv("GRIB::API::Debug",1)); */
-	}
-	Safefree(values);
-
-	return result;
-
-}
-
-static SV* get_long_array(grib_handle* h,const char* what)
-{
-
-	size_t size = 0;
-	long *values = 0;
-	SV* result  = &PL_sv_undef;
-
-
-	if(error(grib_get_size(h,what,&size)) != 0)
-		return &PL_sv_undef;
-
-	Newz(0,values,size,long);
-
-	if(error(grib_get_long_array(h,what,values,&size)) == 0)
-	{
-			AV* av      = newAV();
-			int i;
-
-			for(i = 0; i < size; i++)
-				av_push(av,newSVnv(values[i]));
-
-			result = sv_2mortal(newRV_noinc((SV*)av));
-	}
-	Safefree(values);
-
-	return result;
-
-}
-
-static int compar(const void *a, const void *b)
-{
-	double da = *(double*)a;
-	double db = *(double*)b;
-
-	if(da == db)
-		return 0;
-
-	if(da < db)
-		return -1;
-
-	return 1;
-}
-
-
-typedef grib_handle   *GRIB__API;
-typedef grib_iterator *GRIB__API__Iterator;
-
-
-MODULE = GRIB::API		PACKAGE = GRIB::API		
-
-PROTOTYPES: ENABLE
-
-void debug()
-	CODE:
-		grib_context_set_debug(0,1);
-
-GRIB::API
-Read(file)
-	SV*   file
-
-	PREINIT:
-		FILE* f = PerlIO_findFILE(IoIFP(sv_2io(file)));
-		int err;
-	CODE:
-		RETVAL = grib_handle_new_from_file(0,f,&err);
-		fail(err);
-	OUTPUT:
-		RETVAL
-
-GRIB::API
-create(bufsv)
-	SV*   bufsv
-
-	PREINIT:
-		size_t size = 0;
-		char   *buffer;
-	CODE:
-
-		RETVAL = 0;
-
-		if(SvOK(bufsv))
-		{
-			size   = SvCUR(bufsv);
-			buffer = SvPV(bufsv,PL_na);
-			RETVAL = grib_handle_new_from_message(0,buffer,size);
-		}
-	OUTPUT:
-		RETVAL
-
-GRIB::API
-template(name)
-	char* name
-
-	PREINIT:
-	CODE:
-		RETVAL = grib_handle_new_from_template(0,name);
-	OUTPUT:
-		RETVAL
-
-
-GRIB::API
-clone(h)
-	GRIB::API h
-	CODE:
-		RETVAL = grib_handle_clone(h);
-	OUTPUT:
-		RETVAL
-		
-
-void
-DESTROY(h)
-	GRIB::API h
-	CODE:
-		grib_handle_delete(h);
-
-void
-Write(h,file)
-	GRIB::API h
-	SV*   file
-
-	PREINIT:
-		FILE* f = PerlIO_findFILE(IoIFP(sv_2io(file)));
-		size_t size = 0;
-		const void *message = 0;
-	PPCODE:
-
-		if( fail(grib_get_message(h,&message,&size) ) == 0)
-		{
-			/* printf("write %ld\n",size); */
-			if(fwrite(message,1,size,f) == size)
-				XPUSHs(&PL_sv_yes);
-			else
-				XPUSHs(&PL_sv_undef);
-		}
-		else
-				XPUSHs(&PL_sv_undef);
-
-void fail_on_error(f = 1)
-	long f
-
-	PPCODE: 
-		_fail_on_error = f;
-		XPUSHs(&PL_sv_yes);
-
-void
-Dump(h,file,mode = "debug",flags = ~0,format = NULL)
-	GRIB::API h
-	SV*   file
-	char *mode
-	long flags
-	char *format
-
-	PREINIT:
-		FILE* f = PerlIO_findFILE(IoIFP(sv_2io(file)));
-	PPCODE:
-		grib_dump_content(h,f,mode,flags,format);
-		XPUSHs(&PL_sv_yes);
-
-
-void
-get_long(h,what)
-	GRIB::API h
-	char *what
-	PPCODE:
-		XPUSHs(get_long(h,what));
-
-	
-void
-get_double(h,what)
-	GRIB::API h
-	char *what
-	PPCODE:
-		XPUSHs(get_double(h,what));
-
-void
-get_string(h,what)
-	GRIB::API h
-	char *what
-	PPCODE:
-		XPUSHs(get_string(h,what));
-
-void
-get_bytes(h,what)
-	GRIB::API h
-	char *what
-	PPCODE:
-		XPUSHs(get_bytes(h,what));
-
-
-void
-set_bytes(h,what,bufsv)
-	GRIB::API h
-	char *what
-	SV*   bufsv
-
-	PREINIT:
-		size_t size = 0;
-		char   *buffer;
-	PPCODE:
-
-		if(!SvOK(bufsv))
-			XPUSHs(&PL_sv_undef);
-		else {
-
-			size   = SvCUR(bufsv);
-			buffer = SvPV(bufsv,PL_na);
-
-			if(error(grib_set_bytes(h,what,buffer,&size)) == 0)
-				XPUSHs(&PL_sv_yes);
-			else
-				XPUSHs(&PL_sv_undef);
-		}
-
-void
-set_values(h,ref)
-	GRIB::API h
-	SV*   ref
-
-	PREINIT:
-		size_t size = 0;
-		grib_values vals[1024];
-		HV* hash;
-		SV *value;
-		I32 ret;
-		char* key;
-		int i;
-	PPCODE:
-		{
-			if(SvTYPE(SvRV(ref)) != SVt_PVHV)
-			{
-				croak("not an HASH reference!");
-				XPUSHs(&PL_sv_undef);
-			}
-			else
-			{
-				hash = (HV*)SvRV(ref);
-				hv_iterinit(hash);
-				size = 0;
-				while((value = hv_iternextsv(hash, &key, &ret)) != 0)
-				{
-					/* printf("key=%s\n",key); */
-					vals[size].name = strdup(key);
-					if(SvIOK(value))
-					{
-						vals[size].type       = GRIB_TYPE_LONG;
-						vals[size].long_value = SvIV(value);
-						/* printf("-- %d %d %ld\n",size,vals[size].type,vals[size].long_value); */
-					}
-					else if(SvNOK(value))
-					{
-						vals[size].type         = GRIB_TYPE_DOUBLE;
-						vals[size].double_value = SvNV(value);
-						/* printf("-- %d %d %g\n",size,vals[size].type,vals[size].double_value); */
-					}
-					else if(SvPOK(value))
-					{
-						size_t len;
-						char *buffer = SvPV(value,len);
-						/* e =  grib_set_string(h,what,buffer,&size); */
-						vals[size].type         = GRIB_TYPE_STRING;
-						vals[size].string_value = buffer;
-						/* printf("-- %d %d %s\n",size,vals[size].type,vals[size].string_value); */
-					}
-					else if(!SvOK(value) || (value == &PL_sv_undef)) 
-					{
-						/* TODO: support other missing */
-						vals[size].type       = GRIB_TYPE_LONG;
-						vals[size].long_value = GRIB_MISSING_LONG;
-					}
-					else
-					{
-						char buf[1024];
-						sprintf(buf,"Invalid type %s",key);
-						croak(buf);
-						XPUSHs(&PL_sv_undef);
-						break;
-					}
-
-					/* printf("%d %d %d\n",SvIOK(value),SvNOK(value),SvPOK(value)); */
-
-					size++;
-					if(size > 1024)
-					{
-						croak("Too many values");
-						XPUSHs(&PL_sv_undef);
-						break;
-					}
-				}
-
-				/* printf("%s %d\n",vals[0].name,vals[0].type); */
-				/* printf("SIZE %d\n",size); */
-
-				if(error(grib_set_values(h,vals,size)) == 0)
-					XPUSHs(&PL_sv_yes);
-				else
-					XPUSHs(&PL_sv_undef);
-
-				for(i = 0; i < size; i++)
-					free((char*)vals[i].name);
-
-				XPUSHs(&PL_sv_yes);
-			}
-		}
-
-void
-get_double_array(h,what)
-	GRIB::API h
-	char *what
-
-	PREINIT:
-		size_t size = 0;
-	PPCODE:
-
-		if(error(grib_get_size(h,what,&size)) != 0)
-			XPUSHs(&PL_sv_undef);
-		else {
-
-			double *values = 0;
-			
-			Newz(0,values,size,double);
-
-			if(values)
-			{
-
-				if(error(grib_get_double_array(h,what,values,&size)) == 0)
-				{
-					int i;
-					if(GIMME_V == G_ARRAY)
-					{
-						EXTEND(SP,size);
-						for(i = 0; i < size; i++)
-							XPUSHs(sv_2mortal(newSVnv(values[i])));
-					}
-					else
-					{
-						AV* av      = newAV();
-
-						for(i = 0; i < size; i++)
-							av_push(av,newSVnv(values[i]));
-
-					/* XPUSHs(bufsv); */
-					/* XPUSHs(sv_2mortal(newSViv(size)));*/
-						XPUSHs(newRV_noinc((SV*)av));
-					}
-				}
-				else
-					XPUSHs(&PL_sv_undef);
-
-			}
-			else
-				XPUSHs(&PL_sv_undef);
-
-			Safefree(values);
-		}
-
-void
-set_double_array(h,what,list)
-	GRIB::API h
-	char *what
-	SV* list
-
-	PREINIT:
-		size_t size = 0;
-		double *values = 0;
-		int i;
-		AV* av;
-
-		if(!SvROK(list))
-			croak("Argument 2 is not an ARRAY reference");
-		
-		if(SvTYPE(SvRV(list))!=SVt_PVAV)
-			croak("Argument 2 is not an ARRAY reference");
-
-		av  = (AV*)SvRV(list);
-		if(av_len(av) < 0)
-			croak("list has negative size ");
-
-		size   = av_len(av) + 1;
-		/* printf("set_double_array: %d\n",size); */
-		
-
-	PPCODE:
-
-			
-		Newz(0,values,size,double);
-
-		if(!values)
-			croak("cannot allocate values");
-
-		for(i = 0; i < size; i++)
-		{
-			SV* sv = *av_fetch(av,i,1);
-			if(SvNOK(sv))
-				values[i] =  SvNV(sv);
-			else if(SvIOK(sv))
-				values[i] =  SvIV(sv);
-			else if(SvPOK(sv))
-			{
-					char *buffer = SvPV(sv,PL_na);
-					values[i] = atof(buffer);
-			}
-			else values[i] = 0;
-		}
-
-
-		/* printf("list %d\n",size); */
-
-		if(error(grib_set_double_array(h,what,values,size)) == 0)
-			XPUSHs(&PL_sv_yes);
-		else
-			XPUSHs(&PL_sv_undef);
-
-		Safefree(values);
-
-void
-set_long_array(h,what,list)
-	GRIB::API h
-	char *what
-	SV* list
-
-	PREINIT:
-		size_t size = 0;
-
-		if(!SvROK(list))
-			croak("Argument 2 is not an ARRAY reference");
-		
-		if(SvTYPE(SvRV(list))!=SVt_PVAV)
-			croak("Argument 2 is not an ARRAY reference");
-
-		AV* av  = (AV*)SvRV(list);
-		if(av_len(av) < 0)
-			croak("list has negative size ");
-
-		size   = av_len(av);
-		
-
-	PPCODE:
-
-		if(error(grib_get_size(h,what,&size)) != 0)
-			XPUSHs(&PL_sv_undef);
-		else {
-
-			long *values = 0;
-			
-			Newz(0,values,size,long);
-
-			if(values)
-			{
-				int i;
-				AV* av = (AV*)SvRV(list);
-				size = av_len(av);
-				for(i = 0; i < size; i++)
-				{
-					SV* sv = *av_fetch(av,i,1);
-					if(SvNOK(sv))
-						values[i] =  SvNV(sv);
-					else if(SvIOK(sv))
-						values[i] =  SvIV(sv);
-					else if(SvPOK(sv))
-					{
-						char *buffer = SvPV(sv,PL_na);
-						values[i] = atof(buffer);
-					}
-					else
-						values[i] = 0;
-
-				}
-
-				/* printf("list %d\n",size); */
-
-				if(error(grib_set_long_array(h,what,values,size)) == 0)
-					XPUSHs(&PL_sv_yes);
-				else
-					XPUSHs(&PL_sv_undef);
-
-			}
-			else
-				XPUSHs(&PL_sv_undef);
-
-			Safefree(values);
-		}
-
-void
-get_long_array(h,what)
-	GRIB::API h
-	char *what
-
-	PREINIT:
-		size_t size = 0;
-	PPCODE:
-
-		if(error(grib_get_size(h,what,&size)) != 0)
-			XPUSHs(&PL_sv_undef);
-		else {
-
-			long *values = 0;
-			
-			Newz(0,values,size,long);
-
-			if(values)
-			{
-
-				if(error(grib_get_long_array(h,what,values,&size)) == 0)
-				{
-					int i;
-					if(GIMME_V == G_ARRAY)
-					{
-						EXTEND(SP,size);
-						for(i = 0; i < size; i++)
-							XPUSHs(sv_2mortal(newSViv(values[i])));
-					}
-					else
-					{
-						AV* av      = newAV();
-
-						for(i = 0; i < size; i++)
-							av_push(av,newSViv(values[i]));
-
-					/* XPUSHs(bufsv); */
-					/*XPUSHs(sv_2mortal(newSViv(size)));*/
-						XPUSHs(sv_2mortal(newRV_noinc((SV*)av)));
-					}
-				}
-				else
-					XPUSHs(&PL_sv_undef);
-
-			}
-			else
-				XPUSHs(&PL_sv_undef);
-
-			Safefree(values);
-		}
-
-char*
-get_accessor_class(h,what)
-	GRIB::API h
-	char *what
-	PREINIT:
-	char *p;
-	PPCODE:
-		 p = (char*)grib_get_accessor_class_name(h,what);
-		 if(p)
-		 	XPUSHs(sv_2mortal(newSVpv(p,0)));
-		else
-			XPUSHs(&PL_sv_undef);
-
-void
-get_size(h,what)
-	GRIB::API h
-	char *what
-
-	PREINIT:
-		size_t size = 0;
-	PPCODE:
-
-		if( error(grib_get_size(h,what,&size)) != 0)
-			XPUSHs(&PL_sv_undef);
-		else 
-			XPUSHs(sv_2mortal(newSViv(size)));
-
-void
-get_type(h,what)
-	GRIB::API h
-	char *what
-
-	PREINIT:
-		int type = 0;
-	PPCODE:
-		if( error(grib_get_native_type(h,what,&type)) != 0)
-			XPUSHs(&PL_sv_undef);
-		else 
-			XPUSHs(sv_2mortal(newSViv(type)));
-
-void
-set(h,what,value)
-	GRIB::API h
-	char *what
-	SV* value;
-	PREINIT:
-		int e = 1;
-	PPCODE:
-		if(SvIOK(value))
-			e = error(grib_set_long(h,what,SvIV(value)));
-		else if(SvNOK(value))
-			e =  error(grib_set_double(h,what,SvNV(value)));
-		else if(SvPOK(value))
-		{
-			size_t size;
-			char *buffer = SvPV(value,size);
-			e =  error(grib_set_string(h,what,buffer,&size));
-		}
-
-		if(e == 0)
-			XPUSHs(&PL_sv_yes);
-		else
-			XPUSHs(&PL_sv_undef);
-
-SV*
-get(h,what)
-	GRIB::API h
-	char *what
-	PREINIT:
-		int e1,e2;
-		int type;
-		size_t size;
-		long long_value;
-		double double_value;
-		SV* result = &PL_sv_undef;
-		char buf[1024];
-
-	PPCODE:
-		e1 = error(grib_get_native_type(h,what,&type));
-		e2 = error(grib_get_size(h,what,&size));
-
-		if(e1 == 0 && e2 == 0)
-		{
-			/* printf("what=%s type=%d size=%d\n",what,type,size); */
-			switch(type)
-			{
-				case GRIB_TYPE_LONG:
-					if(size > 1)
-						result = get_long_array(h,what);
-					else
-						result = get_long(h,what);
-					break;
-
-				case GRIB_TYPE_DOUBLE:
-					if(size > 1)
-						result = get_double_array(h,what);
-					else
-						result = get_double(h,what);
-					break;
-
-				case GRIB_TYPE_STRING:
-						result = get_string(h,what);
-					break;
-
-				case GRIB_TYPE_BYTES:
-						result = get_bytes(h,what);
-					break;
-
-				default:
-						/* result = get_bytes(h,what); */
-					break;
-					
-			}
-		}
-		XPUSHs(result);
-
-
-SV* 
-get_gaussian_latitudes(n)
-	int n
-	PREINIT:
-		double *values = 0;
-		SV* result  = &PL_sv_undef;
-
-	PPCODE:
-		Newz(0,values,n*2,double);
-
-		if( error(grib_get_gaussian_latitudes(n,values)) == 0)
-		{
-				AV* av      = newAV();
-				int i;
-
-				for(i = 0; i < n*2; i++)
-					av_push(av,newSVnv(values[i]));
-
-				result = sv_2mortal(newRV_noinc((SV*)av));
-				/* sv_bless(result,gv_stashpv("GRIB::API::Debug",1)); */
-		}
-		Safefree(values);
-		XPUSHs(result);
-
-
-void
-set_long(h,what,value)
-	GRIB::API h
-	char *what
-	long value;
-	PREINIT:
-	PPCODE:
-		if(error(grib_set_long(h,what,value)) == 0)
-			XPUSHs(&PL_sv_yes);
-		else
-			XPUSHs(&PL_sv_undef);
-
-void
-set_long_internal(h,what,value)
-	GRIB::API h
-	char *what
-	long value;
-	PREINIT:
-	PPCODE:
-		if(error(grib_set_long_internal(h,what,value)) == 0)
-			XPUSHs(&PL_sv_yes);
-		else
-			XPUSHs(&PL_sv_undef);
-
-void
-set_double(h,what,value)
-	GRIB::API h
-	char *what
-	double value;
-	PREINIT:
-	PPCODE:
-		if(error(grib_set_double(h,what,value)) == 0)
-			XPUSHs(&PL_sv_yes);
-		else
-			XPUSHs(&PL_sv_undef);
-
-void
-set_double_internal(h,what,value)
-	GRIB::API h
-	char *what
-	double value;
-	PREINIT:
-	PPCODE:
-		if(error(grib_set_double_internal(h,what,value)) == 0)
-			XPUSHs(&PL_sv_yes);
-		else
-			XPUSHs(&PL_sv_undef);
-
-void
-set_string(h,what,value)
-	GRIB::API h
-	char *what
-	char *value;
-	PREINIT:
-		size_t size = strlen(value);
-	PPCODE:
-		if(error(grib_set_string(h,what,value,&size)) == 0)
-			XPUSHs(&PL_sv_yes);
-		else
-			XPUSHs(&PL_sv_undef);
-
-void
-set_string_internal(h,what,value)
-	GRIB::API h
-	char *what
-	char *value;
-	PREINIT:
-		size_t size = strlen(value);
-	PPCODE:
-		if(error(grib_set_string_internal(h,what,value,&size)) == 0)
-			XPUSHs(&PL_sv_yes);
-		else
-			XPUSHs(&PL_sv_undef);
-
-void
-update_sections_lengths(h)
-	GRIB::API h
-	PPCODE:
-		grib_update_sections_lengths(h);
-
-void
-obsfucate(h,what = "values")
-	GRIB::API h
-	char *what
-	PREINIT:
-		int e;
-		size_t size = 0;
-		double *values = 0;
-	PPCODE:
-
-
-	if(error(grib_get_size(h,what,&size)) != 0)
-	{
-		croak(grib_get_error_message(e));
-		return;
-	}
-
-	Newz(0,values,size,double);
-
-
-	if(error(grib_get_double_array(h,what,values,&size)) != 0)
-	{
-		Safefree(values);
-		croak(grib_get_error_message(e));
-		return;
-	}
-
-	qsort(values,size,sizeof(double),&compar);
-
-	if(error(grib_set_double_array(h,what,values,size)) != 0)
-	{
-		Safefree(values);
-		croak(grib_get_error_message(e));
-		return;
-	}
-
-	Safefree(values);
-
-void
-zero(h,what = "values")
-	GRIB::API h
-	char *what
-	PREINIT:
-	PPCODE:
-
-	fail(grib_set_double_array(h,what,NULL,0));
-
-
-
-
-void
-get_keys(h,name_space = NULL)
-	GRIB::API h
-	char *name_space
-
-	PREINIT:
-		grib_keys_iterator* ks;
-
-	PPCODE:
-
-		ks = grib_keys_iterator_new(h,GRIB_KEYS_ITERATOR_ALL_KEYS,name_space);
-
-		if(GIMME_V == G_ARRAY)
-		{
-			EXTEND(SP,800);
-			while(grib_keys_iterator_next(ks))
-			{
-				const char* name = grib_keys_iterator_get_name(ks);
-				XPUSHs(sv_2mortal(newSVpvn(name,strlen(name))));
-			}
-		}
-		else
-		{
-			AV* av  = newAV();
-			while(grib_keys_iterator_next(ks))
-			{
-				const char* name = grib_keys_iterator_get_name(ks);
-				av_push(av,newSVpvn(name,strlen(name)));
-			}
-
-			XPUSHs(newRV_noinc((SV*)av));
-		}
-		grib_keys_iterator_delete(ks); 
-
-
-GRIB::API::Iterator
-iterator(h)
-	GRIB::API h
-	CODE:
-		/* FIXME: RETVAL = grib_iterator_new(h); */
-		abort();
-
-		/* printf("ITERATOR %p\n",RETVAL); */
-	OUTPUT:
-		RETVAL
-
-MODULE = GRIB::API		PACKAGE = GRIB::API::Iterator
-
-void
-next(i)
-	GRIB::API::Iterator i
-	PREINIT:
-		double lat,lon,value;
-	PPCODE:
-		if(grib_iterator_next(i,&lat,&lon,&value))
-		{
-			
-			XPUSHs(sv_2mortal(newSVnv(lat)));
-			XPUSHs(sv_2mortal(newSVnv(lon)));
-			XPUSHs(sv_2mortal(newSVnv(value)));
-		}
-		/* else */
-			/* XPUSHs(&PL_sv_undef); */
-			
-		
-	
diff --git a/perl/GRIB-API/Changes b/perl/GRIB-API/Changes
deleted file mode 100644
index cbcf7a1..0000000
--- a/perl/GRIB-API/Changes
+++ /dev/null
@@ -1,6 +0,0 @@
-Revision history for Perl extension GRIB::API.
-
-0.01  Fri Nov 25 13:48:43 2005
-	- original version; created by h2xs 1.23 with options
-		-cn GRIB::API ../src/grib_api.h
-
diff --git a/perl/GRIB-API/INSTALL b/perl/GRIB-API/INSTALL
deleted file mode 100644
index bd5d3cd..0000000
--- a/perl/GRIB-API/INSTALL
+++ /dev/null
@@ -1,13 +0,0 @@
-%perl56 Makefile.PL PREFIX=/tmp/test INSTALLDIRS=perl
-%make
-%make install
-
-and
-use lib qw(/tmp/test/lib);
-
-If you don't set INSTALLDIRS, the modules go to /tmp/test/lib/site_perl, so you need
-use lib qw(/tmp/test/lib/site_perl);
-
-perl56 Makefile.PL PREFIX=/home/ma/mab/grib/api INSTALLDIRS=perl
-
-perl Makefile.PL PREFIX=/home/ma/mab/grib/api INSTALLDIRS=perl LD="ld -b32"
diff --git a/perl/GRIB-API/MANIFEST b/perl/GRIB-API/MANIFEST
deleted file mode 100644
index d4c1a4a..0000000
--- a/perl/GRIB-API/MANIFEST
+++ /dev/null
@@ -1,12 +0,0 @@
-API.xs
-Changes
-Makefile.PL
-MANIFEST
-ppport.h
-README
-test.pl
-typemap
-t/GRIB-API.t
-lib/GRIB/API.pm
-lib/GRIB/API/Tie.pm
-lib/GRIB/API/Debug.pm
diff --git a/perl/GRIB-API/Makefile.PL.in b/perl/GRIB-API/Makefile.PL.in
deleted file mode 100755
index 0f73d92..0000000
--- a/perl/GRIB-API/Makefile.PL.in
+++ /dev/null
@@ -1,23 +0,0 @@
-use 5.006001;
-use ExtUtils::MakeMaker;
-# See lib/ExtUtils/MakeMaker.pm for details of how to influence
-# the contents of the Makefile that is written.
-WriteMakefile(
-    NAME              => 'GRIB::API',
-   # Module version
-   'VERSION'   => '@PACKAGE_VERSION@',
-
-   # Preprocessor defines
-   'DEFINE' => '@DEFS@',     # e.g., '-DHAVE_SOMETHING'
-
-    VERSION_FROM      => 'lib/GRIB/API.pm', # finds $VERSION
-    PREREQ_PM         => {}, # e.g., Module::Name => 1.1
-    ($] >= 5.005 ?     ## Add these new keywords supported since 5.005
-      (ABSTRACT_FROM  => 'lib/GRIB/API.pm', # retrieve abstract from module
-       AUTHOR         => 'Baudouin Raoult <mab at suse.de>') : ()),
-    LIBS              => ['-L../../src -lgrib_api -lm @LIB_JP2@ @LIB_PNG@'], # e.g., '-lm'
-    INC               => '-I at GRIB_API_INC@', # e.g., '-I. -I/usr/include/other'
-	# Un-comment this if you add C files to link with later:
-    # OBJECT            => '$(O_FILES)', # link all the C files too
-	depend           => { "API.o" => "../../src/libgrib_api.a" }
-);
diff --git a/perl/GRIB-API/README b/perl/GRIB-API/README
deleted file mode 100644
index da0047f..0000000
--- a/perl/GRIB-API/README
+++ /dev/null
@@ -1,38 +0,0 @@
-GRIB-API version 0.01
-=====================
-
-The README is used to introduce the module and provide instructions on
-how to install the module, any machine dependencies it may have (for
-example C compilers and installed libraries) and any other information
-that should be provided before the module is installed.
-
-A README file is required for CPAN modules since CPAN extracts the
-README file from a module distribution so that people browsing the
-archive can use it get an idea of the modules uses. It is usually a
-good idea to provide version information here so that people can
-decide whether fixes for the module are worth downloading.
-
-INSTALLATION
-
-To install this module type the following:
-
-   perl Makefile.PL
-   make
-   make test
-   make install
-
-DEPENDENCIES
-
-This module requires these other modules and libraries:
-
-  blah blah blah
-
-COPYRIGHT AND LICENCE
-Copyright 2005-2016 ECMWF.
-
-This software is licensed under the terms of the Apache Licence Version 2.0
-which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
-
-In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
-virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
-
diff --git a/perl/GRIB-API/convert.pl b/perl/GRIB-API/convert.pl
deleted file mode 100755
index 5149078..0000000
--- a/perl/GRIB-API/convert.pl
+++ /dev/null
@@ -1,529 +0,0 @@
-#!/usr/bin/perl
-# Copyright 2005-2016 ECMWF.
-#
-# This software is licensed under the terms of the Apache Licence Version 2.0
-# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
-# 
-# In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
-# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
-
-use lib qw(blib/lib blib/arch);
-use GRIB::API;
-use Data::Dumper;
-
-
-my %DEFAULTS = ( scaleFactorOfFirstFixedSurface  => 255,
-		productionStatusOfProcessedData => 5, # Tigge test
-		shapeOfTheEarth => 6,
-);
-
-
-my $ukmo = 1;
-
-
-#############################################################
-# Generated by ./tigge_parameters.pl
-
-my %GRIB1TO2;
-my %NEW_ID;
-%GRIB1TO2 = (
-              '134_sfc' => {
-                             discipline => 0,
-                             parameterNumber => 2,
-                             typeOfFirstFixedSurface => 103,
-                             parameterCategory => 2
-                           },
-              '167_sfc' => {
-                             discipline => 0,
-                             parameterNumber => 0,
-                             typeOfFirstFixedSurface => 103,
-                             scaleFactorOfFirstFixedSurface => 0,
-                             parameterCategory => 0,
-                             scaledValueOfFirstFixedSurface => 2
-                           },
-              '168_sfc' => {
-                             discipline => 0,
-                             parameterNumber => 6,
-                             typeOfFirstFixedSurface => 103,
-                             scaleFactorOfFirstFixedSurface => 0,
-                             parameterCategory => 0,
-                             scaledValueOfFirstFixedSurface => 2
-                           },
-              '136_sfc' => {
-                             typeOfSecondFixedSurface => 8,
-                             discipline => 0,
-                             parameterNumber => 47,
-                             typeOfFirstFixedSurface => 1,
-                             parameterCategory => 1
-                           },
-              '121_sfc' => {
-                             discipline => 0,
-                             parameterNumber => 0,
-                             typeOfStatisticalProcessing => 2,
-                             typeOfFirstFixedSurface => 103,
-                             scaleFactorOfFirstFixedSurface => 0,
-                             parameterCategory => 0,
-                             scaledValueOfFirstFixedSurface => 2
-                           },
-              '172_sfc' => {
-                             discipline => 2,
-                             parameterNumber => 0,
-                             typeOfFirstFixedSurface => 1,
-                             parameterCategory => 0
-                           },
-              '122_sfc' => {
-                             discipline => 0,
-                             parameterNumber => 0,
-                             typeOfStatisticalProcessing => 3,
-                             typeOfFirstFixedSurface => 103,
-                             scaleFactorOfFirstFixedSurface => 0,
-                             parameterCategory => 0,
-                             scaledValueOfFirstFixedSurface => 2
-                           },
-              '228001_sfc' => {
-                                typeOfSecondFixedSurface => 8,
-                                discipline => 0,
-                                parameterNumber => 7,
-                                typeOfFirstFixedSurface => 1,
-                                parameterCategory => 7
-                              },
-              '228_sfc' => {
-                             discipline => 0,
-                             parameterNumber => 54,
-                             typeOfStatisticalProcessing => 1,
-                             typeOfFirstFixedSurface => 1,
-                             parameterCategory => 1
-                           },
-              '141_sfc' => {
-                             discipline => 0,
-                             parameterNumber => 13,
-                             typeOfFirstFixedSurface => 1,
-                             parameterCategory => 1
-                           },
-              '189_sfc' => {
-                             discipline => 0,
-                             parameterNumber => 22,
-                             typeOfStatisticalProcessing => 1,
-                             typeOfFirstFixedSurface => 1,
-                             parameterCategory => 6
-                           },
-              '228002_sfc' => {
-                                discipline => 0,
-                                parameterNumber => 5,
-                                typeOfFirstFixedSurface => 1,
-                                parameterCategory => 3
-                              },
-              '139_sfc' => {
-                             typeOfSecondFixedSurface => 106,
-                             discipline => 2,
-                             scaledValueOfSecondFixedSurface => 2,
-                             parameterNumber => 2,
-                             typeOfFirstFixedSurface => 106,
-                             scaleFactorOfFirstFixedSurface => 0,
-                             scaleFactorOfSecondFixedSurface => 1,
-                             parameterCategory => 0,
-                             scaledValueOfFirstFixedSurface => 0
-                           },
-              '130_pl' => {
-                            discipline => 0,
-                            parameterNumber => 0,
-                            typeOfFirstFixedSurface => 100,
-                            scaleFactorOfFirstFixedSurface => 0,
-                            parameterCategory => 0
-                          },
-              '131_pl' => {
-                            discipline => 0,
-                            parameterNumber => 2,
-                            typeOfFirstFixedSurface => 100,
-                            scaleFactorOfFirstFixedSurface => 0,
-                            parameterCategory => 2
-                          },
-              '39_sfc' => {
-                            typeOfSecondFixedSurface => 106,
-                            discipline => 2,
-                            scaledValueOfSecondFixedSurface => 2,
-                            parameterNumber => 22,
-                            typeOfFirstFixedSurface => 106,
-                            scaleFactorOfFirstFixedSurface => 0,
-                            scaleFactorOfSecondFixedSurface => 1,
-                            parameterCategory => 0,
-                            scaledValueOfFirstFixedSurface => 0
-                          },
-              '132_pl' => {
-                            discipline => 0,
-                            parameterNumber => 3,
-                            typeOfFirstFixedSurface => 100,
-                            scaleFactorOfFirstFixedSurface => 0,
-                            parameterCategory => 2
-                          },
-              '176_sfc' => {
-                             discipline => 0,
-                             parameterNumber => 9,
-                             typeOfStatisticalProcessing => 1,
-                             typeOfFirstFixedSurface => 1,
-                             parameterCategory => 4
-                           },
-              '133_pl' => {
-                            discipline => 0,
-                            parameterNumber => 0,
-                            typeOfFirstFixedSurface => 100,
-                            scaleFactorOfFirstFixedSurface => 0,
-                            parameterCategory => 1
-                          },
-              '144_sfc' => {
-                             discipline => 0,
-                             parameterNumber => 55,
-                             typeOfStatisticalProcessing => 1,
-                             typeOfFirstFixedSurface => 1,
-                             parameterCategory => 1
-                           },
-              '60_pt' => {
-                            discipline => 0,
-                            parameterNumber => 14,
-                            typeOfFirstFixedSurface => 107,
-                            scaleFactorOfFirstFixedSurface => 0,
-                            parameterCategory => 2,
-                            scaledValueOfFirstFixedSurface => 2000000
-                          },
-              '177_sfc' => {
-                             discipline => 0,
-                             parameterNumber => 5,
-                             typeOfStatisticalProcessing => 1,
-                             typeOfFirstFixedSurface => 1,
-                             parameterCategory => 5
-                           },
-              '3_pv' => {
-                          discipline => 0,
-                          parameterNumber => 2,
-                          typeOfFirstFixedSurface => 109,
-                          scaleFactorOfFirstFixedSurface => 6,
-                          parameterCategory => 0,
-                          scaledValueOfFirstFixedSurface => 2
-                        },
-              '131_pv' => {
-                            discipline => 0,
-                            parameterNumber => 2,
-                            typeOfFirstFixedSurface => 109,
-                            scaleFactorOfFirstFixedSurface => 6,
-                            parameterCategory => 2,
-                            scaledValueOfFirstFixedSurface => 2
-                          },
-              '132_pv' => {
-                            discipline => 0,
-                            parameterNumber => 3,
-                            typeOfFirstFixedSurface => 109,
-                            scaleFactorOfFirstFixedSurface => 6,
-                            parameterCategory => 2,
-                            scaledValueOfFirstFixedSurface => 2
-                          },
-              '235_sfc' => {
-                             discipline => 0,
-                             parameterNumber => 17,
-                             typeOfFirstFixedSurface => 1,
-                             parameterCategory => 0
-                           },
-              '59_sfc' => {
-                            typeOfSecondFixedSurface => 8,
-                            discipline => 0,
-                            parameterNumber => 6,
-                            typeOfFirstFixedSurface => 1,
-                            parameterCategory => 7
-                          },
-              '146_sfc' => {
-                             discipline => 0,
-                             parameterNumber => 11,
-                             typeOfStatisticalProcessing => 1,
-                             typeOfFirstFixedSurface => 1,
-                             parameterCategory => 0
-                           },
-              '179_sfc' => {
-                             discipline => 0,
-                             parameterNumber => 5,
-                             typeOfStatisticalProcessing => 1,
-                             typeOfFirstFixedSurface => 8,
-                             parameterCategory => 5
-                           },
-              '164_sfc' => {
-                             typeOfSecondFixedSurface => 8,
-                             discipline => 0,
-                             parameterNumber => 1,
-                             typeOfFirstFixedSurface => 1,
-                             parameterCategory => 6
-                           },
-              '147_sfc' => {
-                             discipline => 0,
-                             parameterNumber => 10,
-                             typeOfStatisticalProcessing => 1,
-                             typeOfFirstFixedSurface => 1,
-                             parameterCategory => 0
-                           },
-              '165_sfc' => {
-                             discipline => 0,
-                             parameterNumber => 2,
-                             typeOfFirstFixedSurface => 103,
-                             scaleFactorOfFirstFixedSurface => 0,
-                             parameterCategory => 2,
-                             scaledValueOfFirstFixedSurface => 10
-                           },
-              '166_sfc' => {
-                             discipline => 0,
-                             parameterNumber => 3,
-                             typeOfFirstFixedSurface => 103,
-                             scaleFactorOfFirstFixedSurface => 0,
-                             parameterCategory => 2,
-                             scaledValueOfFirstFixedSurface => 10
-                           },
-              '156_pl' => {
-                            discipline => 0,
-                            parameterNumber => 5,
-                            typeOfFirstFixedSurface => 100,
-                            scaleFactorOfFirstFixedSurface => 0,
-                            parameterCategory => 3
-                          },
-              '151_sfc' => {
-                             discipline => 0,
-                             parameterNumber => 0,
-                             typeOfFirstFixedSurface => 101,
-                             parameterCategory => 3
-                           }
-            );
-%NEW_ID = (
-            '167.128' => 167,
-            '176.128' => 176,
-            '60.128' => 60,
-            '168.128' => 168,
-            '144.128' => 144,
-            '1.228' => 228001,
-            '177.128' => 177,
-            '121.128' => 121,
-            '136.128' => 136,
-            '130.128' => 130,
-            '235.128' => 235,
-            '2.228' => 228002,
-            '59.128' => 59,
-            '3.128' => 3,
-            '172.128' => 172,
-            '122.128' => 122,
-            '146.128' => 146,
-            '131.128' => 131,
-            '179.128' => 179,
-            '164.128' => 164,
-            '147.128' => 147,
-            '132.128' => 132,
-            '228.128' => 228,
-            '156.128' => 156,
-            '141.128' => 141,
-            '165.128' => 165,
-            '189.128' => 189,
-            '139.128' => 139,
-            '133.128' => 133,
-            '166.128' => 166,
-            '151.128' => 151,
-            '39.128' => 39,
-            '134.128' => 134
-          );
-
-#############################################################
-
-
-my %EQ = (
-		'201.128' => '121.128', # MX2T -> MX2T6, for UKMO
-		'202.128' => '122.128', # MN2T -> MN2T6, for UKMO
-		'129.128' => '156.128', # Z -> GH, for ECMWF
-);
-
-# Special case for orography
-
-$GRIB1TO2{"156_sfc"} = $GRIB1TO2{"228002_sfc"};
-
-my %MAPPING = (
-		param    => \%GRIB1TO2,
-		marsType => {
-		cf => {
-			productDefinitionTemplateNumber => 1,
-			typeOfGeneratingProcess         => 4, # To be checked
-			typeOfEnsembleForecast          => 1, # Low-res control forecast
-#			numberOfForecastsInEnsemble     => 51,
-			typeOfProcessedData => 3,
-		},
-		fc => {
-			productDefinitionTemplateNumber => 0,
-			typeOfGeneratingProcess         => 2, # To be checked
-			typeOfProcessedData => 2,
-		},
-		pf => {
-			productDefinitionTemplateNumber => 1,
-			typeOfGeneratingProcess         => 4, # To be checked
-			typeOfEnsembleForecast          => 3, # Positively perturbed forecast
-			typeOfProcessedData => 4,
-		},
-		},
-);
-
-
-my %GAUSSIAN;
-
-die "Usage: $0 in out" unless(@ARGV == 2);
-my ($in,$out) = @ARGV;
-
-open(IN,  "<$in" ) or die "$in: $!";
-open(OUT, ">$out") or die "$out: $!";
-
-my $g;
-my $n = 0;
-
-while($g = GRIB::API->new(\*IN))
-{
-#	print "GRIB $n ...\n";
-
-
-	my %g1;
-	foreach my $k ( keys %MAPPING )
-	{
-		$g1{$k} = $g->get_string($k);
-	}
-
-	# my $l = $LEVELS{$g->get_string("levtype")};
-	my $l = $g->get_string("levtype");
-	my $p = $g1{param};
-
-	$p = $EQ{$p} if(exists $EQ{$p});
-
-unless(exists $NEW_ID{$p})
-{
-	system("smslabel","info","No ID for $p");
-	die "No ID for $p" 
-}
-	$p = $NEW_ID{$p};
-	$p = "${p}_${l}";
-	$g1{param} = $p;
-
-# print Dumper(\%g1);
-
-# Change edition, this should copy lots of things
-
-
-
-
-# Update missing fields
-
-	my %x = %DEFAULTS;
-
-	foreach my $m ( keys %MAPPING )
-	{
-
-		my $e       = $MAPPING{$m};
-		my $mapping = $e->{$g1{$m}};
-		unless($mapping) {
-			# $g->Dump(\*STDOUT);
-		system("smslabel","info","No mapping for [$m] [$g1{$m}]");
-			die Dumper(\%g1, "No mapping for [$m] [$g1{$m}]") 
-		}
-
-		foreach my $k ( keys %{$mapping} )
-		{
-			$x{$k} = $mapping->{$k} if(defined $mapping->{$k});
-		}
-
-	}
-
-	if(exists $x{typeOfStatisticalProcessing})
-	{
-		$x{productDefinitionTemplateNumber}  = 8  if($x{productDefinitionTemplateNumber} == 0);
-		$x{productDefinitionTemplateNumber}  = 11 if($x{productDefinitionTemplateNumber} == 1);
-	}
-
-	$x{editionNumber} = 2;
-
-	if($ukmo)
-	{
-		$x{basicAngleOfTheInitialProductionDomain} = 360;
-		$x{subdivisionsOfBasicAngle}               = 864;
-		$x{iDirectionIncrement}                    = 3;
-		$x{jDirectionIncrement}                    = 2;
-
-		$x{latitudeOfFirstGridPoint}               = -216;
-		$x{latitudeOfLastGridPoint}                = 0;
-
-		$x{longitudeOfFirstGridPoint}              = 216;
-		$x{longitudeOfLastGridPoint}               = 861;
-
-		if($g1{"param"} =~ /^13(1|2)/)
-		{
-			$x{subdivisionsOfBasicAngle} = 1728;
-		}
-	}
-
-
-	delete $x{forecastTime};
-
-# $g->Dump(\*STDOUT);
-# print STDERR Dumper(\%x);
-
-
-	my ($s,$e) = ($g->get("marsStartStep"),$g->get("marsEndStep"));
-
-
-#if($n == 0) { print '-' x 80, "\n"; $g->Dump(\*STDOUT) ; print '-' x 80, "\n\n"; };
-	$g->set_values(\%x) or die Dumper(\%x);  ;
-
-# if($n == 0) { print '+' x 80, "\n"; $g->Dump(\*STDOUT) ; print '+' x 80, "\n\n"; };
-
-# $g->Dump(\*STDOUT);
-
-# Gaussian grid
-
-	if($g->get("gridDefinitionTemplateNumber") == 40)
-	{
-		my $n = $g->get("numberOfParallelsBetweenAPoleAndTheEquator");
-		unless(exists $GAUSSIAN{$n})
-		{
-			my $x = GRIB::API::get_gaussian_latitudes($n);
-			$GAUSSIAN{$n} = $x->[0];
-		}
-		my $x =  int($GAUSSIAN{$n}*1_000_000);
-		$g->set_long("latitudeOfFirstGridPoint",$x);
-		$g->set_long("latitudeOfLastGridPoint",-$x);
-
-		my $y = $g->get_long("latitudeOfFirstGridPoint");
-		die if($x != $y);
-		
-	}
-
-	my $n = $g->get("numberOfValues");
-	die "numberOfValues: $n" unless($n > 0);
-
-	my $n = $g->get("numberOfDataPoints");
-	die "numberOfDataPoints: $n" unless($n > 0);
-
-	$g->set("backgroundGeneratingProcessIdentifier",$g->get("generatingProcessIdentifier"));
-
-#$g->set("lengthOfTheTimeRangeOverWhichStatisticalProcessingIsDone",
-#	$g->get("marsEndStep")-$g->get("marsStartStep"));
-
-	if(exists $x{typeOfStatisticalProcessing}){
-
-		if($x{typeOfStatisticalProcessing} eq 1) # some grib1 are badly coded
-		{
-			$g->set_long("marsStartStep",0);
-			$g->set_long("marsEndStep",$e);
-		}
-		else
-		{
-# UKMO die "s=$s e=$e" unless($e == $s);
-#if($s > 0)
-#{
-#$g->set_long("marsStartStep",$s-6);
-#	$g->set_long("marsEndStep",$s);
-#}
-		}
-	}
-
-
-
-	$g->Write(\*OUT) or die "$out: $!";
-#print "... done\n";
-	$n++;
-}
-
-close(OUT) or die "$out: $!";
diff --git a/perl/GRIB-API/lib/GRIB/API.pm b/perl/GRIB-API/lib/GRIB/API.pm
deleted file mode 100644
index 914738f..0000000
--- a/perl/GRIB-API/lib/GRIB/API.pm
+++ /dev/null
@@ -1,97 +0,0 @@
-package GRIB::API;
-
-use 5.006001;
-use strict;
-use warnings;
-use Carp;
-
-require Exporter;
-use AutoLoader qw(AUTOLOAD);
-
-our @ISA = qw(Exporter);
-
-# Items to export into callers namespace by default. Note: do not export
-# names by default without a very good reason. Use EXPORT_OK instead.
-# Do not simply export all your public functions/methods/constants.
-
-# This allows declaration	use GRIB::API ':all';
-# If you do not need this, moving things directly into @EXPORT or @EXPORT_OK
-# will save memory.
-our %EXPORT_TAGS = ( 'all' => [ qw(
-	
-) ] );
-
-our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
-
-our @EXPORT = qw(
-	
-);
-
-our $VERSION = '0.01';
-
-require XSLoader;
-XSLoader::load('GRIB::API', $VERSION);
-
-# Preloaded methods go here.
-
-sub new {
-	my ($class,$arg) = @_;
-	return Read($arg)      if(ref($arg) =~ /GLOB/);
-	return create($arg)    if(substr($arg,0,4) =~ /(GRIB|BUDG|TIDE)/);
-	return template($arg);
-}
-
-# Autoload methods go after =cut, and are processed by the autosplit program.
-
-1;
-__END__
-# Below is stub documentation for your module. You'd better edit it!
-
-=head1 NAME
-
-GRIB::API - Perl extension for blah blah blah
-
-=head1 SYNOPSIS
-
-  use GRIB::API;
-  blah blah blah
-
-=head1 DESCRIPTION
-
-Stub documentation for GRIB::API, created by h2xs. It looks like the
-author of the extension was negligent enough to leave the stub
-unedited.
-
-Blah blah blah.
-
-=head2 EXPORT
-
-None by default.
-
-
-
-=head1 SEE ALSO
-
-Mention other useful documentation such as the documentation of
-related modules or operating system documentation (such as man pages
-in UNIX), or any relevant external documentation such as RFCs or
-standards.
-
-If you have a mailing list set up for your module, mention it here.
-
-If you have a web site set up for your module, mention it here.
-
-=head1 AUTHOR
-
-Baudouin Raoult
-
-=head1 COPYRIGHT AND LICENSE
-Copyright 2005-2016 ECMWF.
-
-This software is licensed under the terms of the Apache Licence Version 2.0
-which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
-
-In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
-virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
-
-=cut
diff --git a/perl/GRIB-API/lib/GRIB/API/Debug.pm b/perl/GRIB-API/lib/GRIB/API/Debug.pm
deleted file mode 100644
index 3cf02dd..0000000
--- a/perl/GRIB-API/lib/GRIB/API/Debug.pm
+++ /dev/null
@@ -1,7 +0,0 @@
-package GRIB::API::Debug;
-
-sub DESTROY {
-	print "GRIB::API::Debug DESTROY called\n";
-}
-
-1;
diff --git a/perl/GRIB-API/lib/GRIB/API/Tie.pm b/perl/GRIB-API/lib/GRIB/API/Tie.pm
deleted file mode 100644
index 6f05d58..0000000
--- a/perl/GRIB-API/lib/GRIB/API/Tie.pm
+++ /dev/null
@@ -1,46 +0,0 @@
-package GRIB::API::Tie;
-use Carp;
-
-sub TIEHASH {
-	my ($class,$handle) = @_;
-	bless({handle=>$handle},$class);
-}
-
-sub FETCH {
-	my ($self,$key) = @_;
-	return $self->{handle}->get($key);
-}
-
-sub STORE {
-	my ($self,$key,$value) = @_;
-	$self->{handle}->set($key,$value) or warn "Cannot set $key to $value";
-	delete $self->{keys};
-}
-
-sub EXISTS {
-	my ($self,$key) = @_;
-	die;
-	return $self->{handle}->get_size($key);
-}
-
-sub CLEAR {
-	my ($self) = @_;
-	warn "GRIB::API::Tie::CLEAR ignored";
-
-}
-
-sub FIRSTKEY {
-	my ($self) = @_;
-	$self->{keys} = $self->{handle}->get_keys();
-	$self->{n} = 0;
-	$self->{keys}->[$self->{n}++];
-}
-
-sub NEXTKEY {
-	my ($self,$last) = @_;
-	croak "Cannot iterate and modify GRIB at the same time"
-		unless(exists $self->{keys});
-	$self->{keys}->[$self->{n}++];
-}
-
-1;
diff --git a/perl/GRIB-API/ppport.h b/perl/GRIB-API/ppport.h
deleted file mode 100644
index cc9f678..0000000
--- a/perl/GRIB-API/ppport.h
+++ /dev/null
@@ -1,1096 +0,0 @@
-
-/* ppport.h -- Perl/Pollution/Portability Version 2.011 
- *
- * Automatically Created by Devel::PPPort on Fri Nov 25 13:48:43 2005 
- *
- * Do NOT edit this file directly! -- Edit PPPort.pm instead.
- *
- * Version 2.x, Copyright (C) 2001, Paul Marquess.
- * Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
- * This code may be used and distributed under the same license as any
- * version of Perl.
- * 
- * This version of ppport.h is designed to support operation with Perl
- * installations back to 5.004, and has been tested up to 5.8.1.
- *
- * If this version of ppport.h is failing during the compilation of this
- * module, please check if a newer version of Devel::PPPort is available
- * on CPAN before sending a bug report.
- *
- * If you are using the latest version of Devel::PPPort and it is failing
- * during compilation of this module, please send a report to perlbug at perl.com
- *
- * Include all following information:
- *
- *  1. The complete output from running "perl -V"
- *
- *  2. This file.
- *
- *  3. The name & version of the module you were trying to build.
- *
- *  4. A full log of the build that failed.
- *
- *  5. Any other information that you think could be relevant.
- *
- *
- * For the latest version of this code, please retreive the Devel::PPPort
- * module from CPAN.
- * 
- */
-
-/*
- * In order for a Perl extension module to be as portable as possible
- * across differing versions of Perl itself, certain steps need to be taken.
- * Including this header is the first major one, then using dTHR is all the
- * appropriate places and using a PL_ prefix to refer to global Perl
- * variables is the second.
- *
- */
-
-
-/* If you use one of a few functions that were not present in earlier
- * versions of Perl, please add a define before the inclusion of ppport.h
- * for a static include, or use the GLOBAL request in a single module to
- * produce a global definition that can be referenced from the other
- * modules.
- * 
- * Function:            Static define:           Extern define:
- * newCONSTSUB()        NEED_newCONSTSUB         NEED_newCONSTSUB_GLOBAL
- *
- */
- 
-
-/* To verify whether ppport.h is needed for your module, and whether any
- * special defines should be used, ppport.h can be run through Perl to check
- * your source code. Simply say:
- * 
- * 	perl -x ppport.h *.c *.h *.xs foo/bar*.c [etc]
- * 
- * The result will be a list of patches suggesting changes that should at
- * least be acceptable, if not necessarily the most efficient solution, or a
- * fix for all possible problems. It won't catch where dTHR is needed, and
- * doesn't attempt to account for global macro or function definitions,
- * nested includes, typemaps, etc.
- * 
- * In order to test for the need of dTHR, please try your module under a
- * recent version of Perl that has threading compiled-in.
- *
- */ 
-
-
-/*
-#!/usr/bin/perl
- at ARGV = ("*.xs") if !@ARGV;
-%badmacros = %funcs = %macros = (); $replace = 0;
-foreach (<DATA>) {
-	$funcs{$1} = 1 if /Provide:\s+(\S+)/;
-	$macros{$1} = 1 if /^#\s*define\s+([a-zA-Z0-9_]+)/;
-	$replace = $1 if /Replace:\s+(\d+)/;
-	$badmacros{$2}=$1 if $replace and /^#\s*define\s+([a-zA-Z0-9_]+).*?\s+([a-zA-Z0-9_]+)/;
-	$badmacros{$1}=$2 if /Replace (\S+) with (\S+)/;
-}
-foreach $filename (map(glob($_), at ARGV)) {
-	unless (open(IN, "<$filename")) {
-		warn "Unable to read from $file: $!\n";
-		next;
-	}
-	print "Scanning $filename...\n";
-	$c = ""; while (<IN>) { $c .= $_; } close(IN);
-	$need_include = 0; %add_func = (); $changes = 0;
-	$has_include = ($c =~ /#.*include.*ppport/m);
-
-	foreach $func (keys %funcs) {
-		if ($c =~ /#.*define.*\bNEED_$func(_GLOBAL)?\b/m) {
-			if ($c !~ /\b$func\b/m) {
-				print "If $func isn't needed, you don't need to request it.\n" if
-				$changes += ($c =~ s/^.*#.*define.*\bNEED_$func\b.*\n//m);
-			} else {
-				print "Uses $func\n";
-				$need_include = 1;
-			}
-		} else {
-			if ($c =~ /\b$func\b/m) {
-				$add_func{$func} =1 ;
-				print "Uses $func\n";
-				$need_include = 1;
-			}
-		}
-	}
-
-	if (not $need_include) {
-		foreach $macro (keys %macros) {
-			if ($c =~ /\b$macro\b/m) {
-				print "Uses $macro\n";
-				$need_include = 1;
-			}
-		}
-	}
-
-	foreach $badmacro (keys %badmacros) {
-		if ($c =~ /\b$badmacro\b/m) {
-			$changes += ($c =~ s/\b$badmacro\b/$badmacros{$badmacro}/gm);
-			print "Uses $badmacros{$badmacro} (instead of $badmacro)\n";
-			$need_include = 1;
-		}
-	}
-	
-	if (scalar(keys %add_func) or $need_include != $has_include) {
-		if (!$has_include) {
-			$inc = join('',map("#define NEED_$_\n", sort keys %add_func)).
-			       "#include \"ppport.h\"\n";
-			$c = "$inc$c" unless $c =~ s/#.*include.*XSUB.*\n/$&$inc/m;
-		} elsif (keys %add_func) {
-			$inc = join('',map("#define NEED_$_\n", sort keys %add_func));
-			$c = "$inc$c" unless $c =~ s/^.*#.*include.*ppport.*$/$inc$&/m;
-		}
-		if (!$need_include) {
-			print "Doesn't seem to need ppport.h.\n";
-			$c =~ s/^.*#.*include.*ppport.*\n//m;
-		}
-		$changes++;
-	}
-	
-	if ($changes) {
-		open(OUT,">/tmp/ppport.h.$$");
-		print OUT $c;
-		close(OUT);
-		open(DIFF, "diff -u $filename /tmp/ppport.h.$$|");
-		while (<DIFF>) { s!/tmp/ppport\.h\.$$!$filename.patched!; print STDOUT; }
-		close(DIFF);
-		unlink("/tmp/ppport.h.$$");
-	} else {
-		print "Looks OK\n";
-	}
-}
-__DATA__
-*/
-
-#ifndef _P_P_PORTABILITY_H_
-#define _P_P_PORTABILITY_H_
-
-#ifndef PERL_REVISION
-#   ifndef __PATCHLEVEL_H_INCLUDED__
-#       define PERL_PATCHLEVEL_H_IMPLICIT
-#       include <patchlevel.h>
-#   endif
-#   if !(defined(PERL_VERSION) || (defined(SUBVERSION) && defined(PATCHLEVEL)))
-#       include <could_not_find_Perl_patchlevel.h>
-#   endif
-#   ifndef PERL_REVISION
-#	define PERL_REVISION	(5)
-        /* Replace: 1 */
-#       define PERL_VERSION	PATCHLEVEL
-#       define PERL_SUBVERSION	SUBVERSION
-        /* Replace PERL_PATCHLEVEL with PERL_VERSION */
-        /* Replace: 0 */
-#   endif
-#endif
-
-#define PERL_BCDVERSION ((PERL_REVISION * 0x1000000L) + (PERL_VERSION * 0x1000L) + PERL_SUBVERSION)
-
-/* It is very unlikely that anyone will try to use this with Perl 6 
-   (or greater), but who knows.
- */
-#if PERL_REVISION != 5
-#	error ppport.h only works with Perl version 5
-#endif /* PERL_REVISION != 5 */
-
-#ifndef ERRSV
-#	define ERRSV perl_get_sv("@",FALSE)
-#endif
-
-#if (PERL_VERSION < 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION <= 5))
-/* Replace: 1 */
-#	define PL_Sv		Sv
-#	define PL_compiling	compiling
-#	define PL_copline	copline
-#	define PL_curcop	curcop
-#	define PL_curstash	curstash
-#	define PL_defgv		defgv
-#	define PL_dirty		dirty
-#	define PL_dowarn	dowarn
-#	define PL_hints		hints
-#	define PL_na		na
-#	define PL_perldb	perldb
-#	define PL_rsfp_filters	rsfp_filters
-#	define PL_rsfpv		rsfp
-#	define PL_stdingv	stdingv
-#	define PL_sv_no		sv_no
-#	define PL_sv_undef	sv_undef
-#	define PL_sv_yes	sv_yes
-/* Replace: 0 */
-#endif
-
-#ifdef HASATTRIBUTE
-#  if (defined(__GNUC__) && defined(__cplusplus)) || defined(__INTEL_COMPILER)
-#    define PERL_UNUSED_DECL
-#  else
-#    define PERL_UNUSED_DECL __attribute__((unused))
-#  endif
-#else
-#  define PERL_UNUSED_DECL
-#endif
-
-#ifndef dNOOP
-#  define NOOP (void)0
-#  define dNOOP extern int Perl___notused PERL_UNUSED_DECL
-#endif
-
-#ifndef dTHR
-#  define dTHR          dNOOP
-#endif
-
-#ifndef dTHX
-#  define dTHX          dNOOP
-#  define dTHXa(x)      dNOOP
-#  define dTHXoa(x)     dNOOP
-#endif
-
-#ifndef pTHX
-#    define pTHX	void
-#    define pTHX_
-#    define aTHX
-#    define aTHX_
-#endif         
-
-#ifndef dAX
-#   define dAX I32 ax = MARK - PL_stack_base + 1
-#endif
-#ifndef dITEMS
-#   define dITEMS I32 items = SP - MARK
-#endif
-
-/* IV could also be a quad (say, a long long), but Perls
- * capable of those should have IVSIZE already. */
-#if !defined(IVSIZE) && defined(LONGSIZE)
-#   define IVSIZE LONGSIZE
-#endif
-#ifndef IVSIZE
-#   define IVSIZE 4 /* A bold guess, but the best we can make. */
-#endif
-
-#ifndef UVSIZE
-#   define UVSIZE IVSIZE
-#endif
-
-#ifndef NVTYPE
-#   if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE)
-#       define NVTYPE long double
-#   else
-#       define NVTYPE double
-#   endif
-typedef NVTYPE NV;
-#endif
-
-#ifndef INT2PTR
-
-#if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE)
-#  define PTRV                  UV
-#  define INT2PTR(any,d)        (any)(d)
-#else
-#  if PTRSIZE == LONGSIZE
-#    define PTRV                unsigned long
-#  else
-#    define PTRV                unsigned
-#  endif
-#  define INT2PTR(any,d)        (any)(PTRV)(d)
-#endif
-#define NUM2PTR(any,d)  (any)(PTRV)(d)
-#define PTR2IV(p)       INT2PTR(IV,p)
-#define PTR2UV(p)       INT2PTR(UV,p)
-#define PTR2NV(p)       NUM2PTR(NV,p)
-#if PTRSIZE == LONGSIZE
-#  define PTR2ul(p)     (unsigned long)(p)
-#else
-#  define PTR2ul(p)     INT2PTR(unsigned long,p)        
-#endif
-
-#endif /* !INT2PTR */
-
-#ifndef boolSV
-#	define boolSV(b) ((b) ? &PL_sv_yes : &PL_sv_no)
-#endif
-
-#ifndef gv_stashpvn
-#	define gv_stashpvn(str,len,flags) gv_stashpv(str,flags)
-#endif
-
-#ifndef newSVpvn
-#	define newSVpvn(data,len) ((len) ? newSVpv ((data), (len)) : newSVpv ("", 0))
-#endif
-
-#ifndef newRV_inc
-/* Replace: 1 */
-#	define newRV_inc(sv) newRV(sv)
-/* Replace: 0 */
-#endif
-
-/* DEFSV appears first in 5.004_56 */
-#ifndef DEFSV
-#  define DEFSV	GvSV(PL_defgv)
-#endif
-
-#ifndef SAVE_DEFSV
-#    define SAVE_DEFSV SAVESPTR(GvSV(PL_defgv))
-#endif
-
-#ifndef newRV_noinc
-#  ifdef __GNUC__
-#    define newRV_noinc(sv)               \
-      ({                                  \
-          SV *nsv = (SV*)newRV(sv);       \
-          SvREFCNT_dec(sv);               \
-          nsv;                            \
-      })
-#  else
-#    if defined(USE_THREADS)
-static SV * newRV_noinc (SV * sv)
-{
-          SV *nsv = (SV*)newRV(sv);       
-          SvREFCNT_dec(sv);               
-          return nsv;                     
-}
-#    else
-#      define newRV_noinc(sv)    \
-        (PL_Sv=(SV*)newRV(sv), SvREFCNT_dec(sv), (SV*)PL_Sv)
-#    endif
-#  endif
-#endif
-
-/* Provide: newCONSTSUB */
-
-/* newCONSTSUB from IO.xs is in the core starting with 5.004_63 */
-#if (PERL_VERSION < 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION < 63))
-
-#if defined(NEED_newCONSTSUB)
-static
-#else
-extern void newCONSTSUB(HV * stash, char * name, SV *sv);
-#endif
-
-#if defined(NEED_newCONSTSUB) || defined(NEED_newCONSTSUB_GLOBAL)
-void
-newCONSTSUB(stash,name,sv)
-HV *stash;
-char *name;
-SV *sv;
-{
-	U32 oldhints = PL_hints;
-	HV *old_cop_stash = PL_curcop->cop_stash;
-	HV *old_curstash = PL_curstash;
-	line_t oldline = PL_curcop->cop_line;
-	PL_curcop->cop_line = PL_copline;
-
-	PL_hints &= ~HINT_BLOCK_SCOPE;
-	if (stash)
-		PL_curstash = PL_curcop->cop_stash = stash;
-
-	newSUB(
-
-#if (PERL_VERSION < 3) || ((PERL_VERSION == 3) && (PERL_SUBVERSION < 22))
-     /* before 5.003_22 */
-		start_subparse(),
-#else
-#  if (PERL_VERSION == 3) && (PERL_SUBVERSION == 22)
-     /* 5.003_22 */
-     		start_subparse(0),
-#  else
-     /* 5.003_23  onwards */
-     		start_subparse(FALSE, 0),
-#  endif
-#endif
-
-		newSVOP(OP_CONST, 0, newSVpv(name,0)),
-		newSVOP(OP_CONST, 0, &PL_sv_no),   /* SvPV(&PL_sv_no) == "" -- GMB */
-		newSTATEOP(0, Nullch, newSVOP(OP_CONST, 0, sv))
-	);
-
-	PL_hints = oldhints;
-	PL_curcop->cop_stash = old_cop_stash;
-	PL_curstash = old_curstash;
-	PL_curcop->cop_line = oldline;
-}
-#endif
-
-#endif /* newCONSTSUB */
-
-#ifndef START_MY_CXT
-
-/*
- * Boilerplate macros for initializing and accessing interpreter-local
- * data from C.  All statics in extensions should be reworked to use
- * this, if you want to make the extension thread-safe.  See ext/re/re.xs
- * for an example of the use of these macros.
- *
- * Code that uses these macros is responsible for the following:
- * 1. #define MY_CXT_KEY to a unique string, e.g. "DynaLoader_guts"
- * 2. Declare a typedef named my_cxt_t that is a structure that contains
- *    all the data that needs to be interpreter-local.
- * 3. Use the START_MY_CXT macro after the declaration of my_cxt_t.
- * 4. Use the MY_CXT_INIT macro such that it is called exactly once
- *    (typically put in the BOOT: section).
- * 5. Use the members of the my_cxt_t structure everywhere as
- *    MY_CXT.member.
- * 6. Use the dMY_CXT macro (a declaration) in all the functions that
- *    access MY_CXT.
- */
-
-#if defined(MULTIPLICITY) || defined(PERL_OBJECT) || \
-    defined(PERL_CAPI)    || defined(PERL_IMPLICIT_CONTEXT)
-
-/* This must appear in all extensions that define a my_cxt_t structure,
- * right after the definition (i.e. at file scope).  The non-threads
- * case below uses it to declare the data as static. */
-#define START_MY_CXT
-
-#if (PERL_VERSION < 4 || (PERL_VERSION == 4 && PERL_SUBVERSION < 68 ))
-/* Fetches the SV that keeps the per-interpreter data. */
-#define dMY_CXT_SV \
-	SV *my_cxt_sv = perl_get_sv(MY_CXT_KEY, FALSE)
-#else /* >= perl5.004_68 */
-#define dMY_CXT_SV \
-	SV *my_cxt_sv = *hv_fetch(PL_modglobal, MY_CXT_KEY,		\
-				  sizeof(MY_CXT_KEY)-1, TRUE)
-#endif /* < perl5.004_68 */
-
-/* This declaration should be used within all functions that use the
- * interpreter-local data. */
-#define dMY_CXT	\
-	dMY_CXT_SV;							\
-	my_cxt_t *my_cxtp = INT2PTR(my_cxt_t*,SvUV(my_cxt_sv))
-
-/* Creates and zeroes the per-interpreter data.
- * (We allocate my_cxtp in a Perl SV so that it will be released when
- * the interpreter goes away.) */
-#define MY_CXT_INIT \
-	dMY_CXT_SV;							\
-	/* newSV() allocates one more than needed */			\
-	my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\
-	Zero(my_cxtp, 1, my_cxt_t);					\
-	sv_setuv(my_cxt_sv, PTR2UV(my_cxtp))
-
-/* This macro must be used to access members of the my_cxt_t structure.
- * e.g. MYCXT.some_data */
-#define MY_CXT		(*my_cxtp)
-
-/* Judicious use of these macros can reduce the number of times dMY_CXT
- * is used.  Use is similar to pTHX, aTHX etc. */
-#define pMY_CXT		my_cxt_t *my_cxtp
-#define pMY_CXT_	pMY_CXT,
-#define _pMY_CXT	,pMY_CXT
-#define aMY_CXT		my_cxtp
-#define aMY_CXT_	aMY_CXT,
-#define _aMY_CXT	,aMY_CXT
-
-#else /* single interpreter */
-
-#define START_MY_CXT	static my_cxt_t my_cxt;
-#define dMY_CXT_SV	dNOOP
-#define dMY_CXT		dNOOP
-#define MY_CXT_INIT	NOOP
-#define MY_CXT		my_cxt
-
-#define pMY_CXT		void
-#define pMY_CXT_
-#define _pMY_CXT
-#define aMY_CXT
-#define aMY_CXT_
-#define _aMY_CXT
-
-#endif 
-
-#endif /* START_MY_CXT */
-
-#ifndef IVdf
-#  if IVSIZE == LONGSIZE
-#       define	IVdf		"ld"
-#       define	UVuf		"lu"
-#       define	UVof		"lo"
-#       define	UVxf		"lx"
-#       define	UVXf		"lX"
-#   else
-#       if IVSIZE == INTSIZE
-#           define	IVdf	"d"
-#           define	UVuf	"u"
-#           define	UVof	"o"
-#           define	UVxf	"x"
-#           define	UVXf	"X"
-#       endif
-#   endif
-#endif
-
-#ifndef NVef
-#   if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) && \
-	defined(PERL_PRIfldbl) /* Not very likely, but let's try anyway. */ 
-#       define NVef		PERL_PRIeldbl
-#       define NVff		PERL_PRIfldbl
-#       define NVgf		PERL_PRIgldbl
-#   else
-#       define NVef		"e"
-#       define NVff		"f"
-#       define NVgf		"g"
-#   endif
-#endif
-
-#ifndef AvFILLp			/* Older perls (<=5.003) lack AvFILLp */
-#   define AvFILLp AvFILL
-#endif
-
-#ifdef SvPVbyte
-#   if PERL_REVISION == 5 && PERL_VERSION < 7
-       /* SvPVbyte does not work in perl-5.6.1, borrowed version for 5.7.3 */
-#       undef SvPVbyte
-#       define SvPVbyte(sv, lp) \
-          ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK) \
-           ? ((lp = SvCUR(sv)), SvPVX(sv)) : my_sv_2pvbyte(aTHX_ sv, &lp))
-       static char *
-       my_sv_2pvbyte(pTHX_ register SV *sv, STRLEN *lp)
-       {   
-           sv_utf8_downgrade(sv,0);
-           return SvPV(sv,*lp);
-       }
-#   endif
-#else
-#   define SvPVbyte SvPV
-#endif
-
-#ifndef SvPV_nolen
-#   define SvPV_nolen(sv) \
-        ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
-         ? SvPVX(sv) : sv_2pv_nolen(sv))
-    static char *
-    sv_2pv_nolen(pTHX_ register SV *sv)
-    {   
-        STRLEN n_a;
-        return sv_2pv(sv, &n_a);
-    }
-#endif
-
-#ifndef get_cv
-#   define get_cv(name,create) perl_get_cv(name,create)
-#endif
-
-#ifndef get_sv
-#   define get_sv(name,create) perl_get_sv(name,create)
-#endif
-
-#ifndef get_av
-#   define get_av(name,create) perl_get_av(name,create)
-#endif
-
-#ifndef get_hv
-#   define get_hv(name,create) perl_get_hv(name,create)
-#endif
-
-#ifndef call_argv
-#   define call_argv perl_call_argv
-#endif
-
-#ifndef call_method
-#   define call_method perl_call_method
-#endif
-
-#ifndef call_pv
-#   define call_pv perl_call_pv
-#endif
-
-#ifndef call_sv
-#   define call_sv perl_call_sv
-#endif
-
-#ifndef eval_pv
-#   define eval_pv perl_eval_pv
-#endif
-
-#ifndef eval_sv
-#   define eval_sv perl_eval_sv
-#endif
-
-#ifndef PERL_SCAN_GREATER_THAN_UV_MAX
-#   define PERL_SCAN_GREATER_THAN_UV_MAX 0x02
-#endif
-
-#ifndef PERL_SCAN_SILENT_ILLDIGIT
-#   define PERL_SCAN_SILENT_ILLDIGIT 0x04
-#endif
-
-#ifndef PERL_SCAN_ALLOW_UNDERSCORES
-#   define PERL_SCAN_ALLOW_UNDERSCORES 0x01
-#endif
-
-#ifndef PERL_SCAN_DISALLOW_PREFIX
-#   define PERL_SCAN_DISALLOW_PREFIX 0x02
-#endif
-
-#if (PERL_VERSION > 6) || ((PERL_VERSION == 6) && (PERL_SUBVERSION >= 1))
-#define I32_CAST
-#else
-#define I32_CAST (I32*)
-#endif
-
-#ifndef grok_hex
-static UV _grok_hex (char *string, STRLEN *len, I32 *flags, NV *result) {
-    NV r = scan_hex(string, *len, I32_CAST len);
-    if (r > UV_MAX) {
-        *flags |= PERL_SCAN_GREATER_THAN_UV_MAX;
-        if (result) *result = r;
-        return UV_MAX;
-    }
-    return (UV)r;
-}
-        
-#   define grok_hex(string, len, flags, result)     \
-        _grok_hex((string), (len), (flags), (result))
-#endif 
-
-#ifndef grok_oct
-static UV _grok_oct (char *string, STRLEN *len, I32 *flags, NV *result) {
-    NV r = scan_oct(string, *len, I32_CAST len);
-    if (r > UV_MAX) {
-        *flags |= PERL_SCAN_GREATER_THAN_UV_MAX;
-        if (result) *result = r;
-        return UV_MAX;
-    }
-    return (UV)r;
-}
-
-#   define grok_oct(string, len, flags, result)     \
-        _grok_oct((string), (len), (flags), (result))
-#endif
-
-#if !defined(grok_bin) && defined(scan_bin)
-static UV _grok_bin (char *string, STRLEN *len, I32 *flags, NV *result) {
-    NV r = scan_bin(string, *len, I32_CAST len);
-    if (r > UV_MAX) {
-        *flags |= PERL_SCAN_GREATER_THAN_UV_MAX;
-        if (result) *result = r;
-        return UV_MAX;
-    }
-    return (UV)r;
-}
-
-#   define grok_bin(string, len, flags, result)     \
-        _grok_bin((string), (len), (flags), (result))
-#endif
-
-#ifndef IN_LOCALE
-#   define IN_LOCALE \
-	(PL_curcop == &PL_compiling ? IN_LOCALE_COMPILETIME : IN_LOCALE_RUNTIME)
-#endif
-
-#ifndef IN_LOCALE_RUNTIME
-#   define IN_LOCALE_RUNTIME   (PL_curcop->op_private & HINT_LOCALE)
-#endif
-
-#ifndef IN_LOCALE_COMPILETIME
-#   define IN_LOCALE_COMPILETIME   (PL_hints & HINT_LOCALE)
-#endif
-
-
-#ifndef IS_NUMBER_IN_UV
-#   define IS_NUMBER_IN_UV		            0x01   
-#   define IS_NUMBER_GREATER_THAN_UV_MAX    0x02
-#   define IS_NUMBER_NOT_INT	            0x04
-#   define IS_NUMBER_NEG		            0x08
-#   define IS_NUMBER_INFINITY	            0x10 
-#   define IS_NUMBER_NAN                    0x20  
-#endif
-   
-#ifndef grok_numeric_radix
-#   define GROK_NUMERIC_RADIX(sp, send) grok_numeric_radix(aTHX_ sp, send)
-
-#define grok_numeric_radix Perl_grok_numeric_radix
-    
-bool
-Perl_grok_numeric_radix(pTHX_ const char **sp, const char *send)
-{
-#ifdef USE_LOCALE_NUMERIC
-#if (PERL_VERSION > 6) || ((PERL_VERSION == 6) && (PERL_SUBVERSION >= 1))
-    if (PL_numeric_radix_sv && IN_LOCALE) { 
-        STRLEN len;
-        char* radix = SvPV(PL_numeric_radix_sv, len);
-        if (*sp + len <= send && memEQ(*sp, radix, len)) {
-            *sp += len;
-            return TRUE; 
-        }
-    }
-#else
-    /* pre5.6.0 perls don't have PL_numeric_radix_sv so the radix
-     * must manually be requested from locale.h */
-#include <locale.h>
-    struct lconv *lc = localeconv();
-    char *radix = lc->decimal_point;
-    if (radix && IN_LOCALE) { 
-        STRLEN len = strlen(radix);
-        if (*sp + len <= send && memEQ(*sp, radix, len)) {
-            *sp += len;
-            return TRUE; 
-        }
-    }
-#endif /* PERL_VERSION */
-#endif /* USE_LOCALE_NUMERIC */
-    /* always try "." if numeric radix didn't match because
-     * we may have data from different locales mixed */
-    if (*sp < send && **sp == '.') {
-        ++*sp;
-        return TRUE;
-    }
-    return FALSE;
-}
-#endif /* grok_numeric_radix */
-
-#ifndef grok_number
-
-#define grok_number Perl_grok_number
-
-int
-Perl_grok_number(pTHX_ const char *pv, STRLEN len, UV *valuep)
-{
-  const char *s = pv;
-  const char *send = pv + len;
-  const UV max_div_10 = UV_MAX / 10;
-  const char max_mod_10 = UV_MAX % 10;
-  int numtype = 0;
-  int sawinf = 0;
-  int sawnan = 0;
-
-  while (s < send && isSPACE(*s))
-    s++;
-  if (s == send) {
-    return 0;
-  } else if (*s == '-') {
-    s++;
-    numtype = IS_NUMBER_NEG;
-  }
-  else if (*s == '+')
-  s++;
-
-  if (s == send)
-    return 0;
-
-  /* next must be digit or the radix separator or beginning of infinity */
-  if (isDIGIT(*s)) {
-    /* UVs are at least 32 bits, so the first 9 decimal digits cannot
-       overflow.  */
-    UV value = *s - '0';
-    /* This construction seems to be more optimiser friendly.
-       (without it gcc does the isDIGIT test and the *s - '0' separately)
-       With it gcc on arm is managing 6 instructions (6 cycles) per digit.
-       In theory the optimiser could deduce how far to unroll the loop
-       before checking for overflow.  */
-    if (++s < send) {
-      int digit = *s - '0';
-      if (digit >= 0 && digit <= 9) {
-        value = value * 10 + digit;
-        if (++s < send) {
-          digit = *s - '0';
-          if (digit >= 0 && digit <= 9) {
-            value = value * 10 + digit;
-            if (++s < send) {
-              digit = *s - '0';
-              if (digit >= 0 && digit <= 9) {
-                value = value * 10 + digit;
-		        if (++s < send) {
-                  digit = *s - '0';
-                  if (digit >= 0 && digit <= 9) {
-                    value = value * 10 + digit;
-                    if (++s < send) {
-                      digit = *s - '0';
-                      if (digit >= 0 && digit <= 9) {
-                        value = value * 10 + digit;
-                        if (++s < send) {
-                          digit = *s - '0';
-                          if (digit >= 0 && digit <= 9) {
-                            value = value * 10 + digit;
-                            if (++s < send) {
-                              digit = *s - '0';
-                              if (digit >= 0 && digit <= 9) {
-                                value = value * 10 + digit;
-                                if (++s < send) {
-                                  digit = *s - '0';
-                                  if (digit >= 0 && digit <= 9) {
-                                    value = value * 10 + digit;
-                                    if (++s < send) {
-                                      /* Now got 9 digits, so need to check
-                                         each time for overflow.  */
-                                      digit = *s - '0';
-                                      while (digit >= 0 && digit <= 9
-                                             && (value < max_div_10
-                                                 || (value == max_div_10
-                                                     && digit <= max_mod_10))) {
-                                        value = value * 10 + digit;
-                                        if (++s < send)
-                                          digit = *s - '0';
-                                        else
-                                          break;
-                                      }
-                                      if (digit >= 0 && digit <= 9
-                                          && (s < send)) {
-                                        /* value overflowed.
-                                           skip the remaining digits, don't
-                                           worry about setting *valuep.  */
-                                        do {
-                                          s++;
-                                        } while (s < send && isDIGIT(*s));
-                                        numtype |=
-                                          IS_NUMBER_GREATER_THAN_UV_MAX;
-                                        goto skip_value;
-                                      }
-                                    }
-                                  }
-				                }
-                              }
-                            }
-                          }
-                        }
-                      }
-                    }
-                  }
-                }
-              }
-            }
-          }
-	    }
-      }
-    }
-    numtype |= IS_NUMBER_IN_UV;
-    if (valuep)
-      *valuep = value;
-
-  skip_value:
-    if (GROK_NUMERIC_RADIX(&s, send)) {
-      numtype |= IS_NUMBER_NOT_INT;
-      while (s < send && isDIGIT(*s))  /* optional digits after the radix */
-        s++;
-    }
-  }
-  else if (GROK_NUMERIC_RADIX(&s, send)) {
-    numtype |= IS_NUMBER_NOT_INT | IS_NUMBER_IN_UV; /* valuep assigned below */
-    /* no digits before the radix means we need digits after it */
-    if (s < send && isDIGIT(*s)) {
-      do {
-        s++;
-      } while (s < send && isDIGIT(*s));
-      if (valuep) {
-        /* integer approximation is valid - it's 0.  */
-        *valuep = 0;
-      }
-    }
-    else
-      return 0;
-  } else if (*s == 'I' || *s == 'i') {
-    s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
-    s++; if (s == send || (*s != 'F' && *s != 'f')) return 0;
-    s++; if (s < send && (*s == 'I' || *s == 'i')) {
-      s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
-      s++; if (s == send || (*s != 'I' && *s != 'i')) return 0;
-      s++; if (s == send || (*s != 'T' && *s != 't')) return 0;
-      s++; if (s == send || (*s != 'Y' && *s != 'y')) return 0;
-      s++;
-    }
-    sawinf = 1;
-  } else if (*s == 'N' || *s == 'n') {
-    /* XXX TODO: There are signaling NaNs and quiet NaNs. */
-    s++; if (s == send || (*s != 'A' && *s != 'a')) return 0;
-    s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
-    s++;
-    sawnan = 1;
-  } else
-    return 0;
-
-  if (sawinf) {
-    numtype &= IS_NUMBER_NEG; /* Keep track of sign  */
-    numtype |= IS_NUMBER_INFINITY | IS_NUMBER_NOT_INT;
-  } else if (sawnan) {
-    numtype &= IS_NUMBER_NEG; /* Keep track of sign  */
-    numtype |= IS_NUMBER_NAN | IS_NUMBER_NOT_INT;
-  } else if (s < send) {
-    /* we can have an optional exponent part */
-    if (*s == 'e' || *s == 'E') {
-      /* The only flag we keep is sign.  Blow away any "it's UV"  */
-      numtype &= IS_NUMBER_NEG;
-      numtype |= IS_NUMBER_NOT_INT;
-      s++;
-      if (s < send && (*s == '-' || *s == '+'))
-        s++;
-      if (s < send && isDIGIT(*s)) {
-        do {
-          s++;
-        } while (s < send && isDIGIT(*s));
-      }
-      else
-      return 0;
-    }
-  }
-  while (s < send && isSPACE(*s))
-    s++;
-  if (s >= send)
-    return numtype;
-  if (len == 10 && memEQ(pv, "0 but true", 10)) {
-    if (valuep)
-      *valuep = 0;
-    return IS_NUMBER_IN_UV;
-  }
-  return 0;
-}
-#endif /* grok_number */
-
-#ifndef PERL_MAGIC_sv
-#   define PERL_MAGIC_sv             '\0'
-#endif
-
-#ifndef PERL_MAGIC_overload
-#   define PERL_MAGIC_overload       'A'
-#endif
-
-#ifndef PERL_MAGIC_overload_elem
-#   define PERL_MAGIC_overload_elem  'a'
-#endif
-
-#ifndef PERL_MAGIC_overload_table
-#   define PERL_MAGIC_overload_table 'c'
-#endif
-
-#ifndef PERL_MAGIC_bm
-#   define PERL_MAGIC_bm             'B'
-#endif
-
-#ifndef PERL_MAGIC_regdata
-#   define PERL_MAGIC_regdata        'D'
-#endif
-
-#ifndef PERL_MAGIC_regdatum
-#   define PERL_MAGIC_regdatum       'd'
-#endif
-
-#ifndef PERL_MAGIC_env
-#   define PERL_MAGIC_env            'E'
-#endif
-
-#ifndef PERL_MAGIC_envelem
-#   define PERL_MAGIC_envelem        'e'
-#endif
-
-#ifndef PERL_MAGIC_fm
-#   define PERL_MAGIC_fm             'f'
-#endif
-
-#ifndef PERL_MAGIC_regex_global
-#   define PERL_MAGIC_regex_global   'g'
-#endif
-
-#ifndef PERL_MAGIC_isa
-#   define PERL_MAGIC_isa            'I'
-#endif
-
-#ifndef PERL_MAGIC_isaelem
-#   define PERL_MAGIC_isaelem        'i'
-#endif
-
-#ifndef PERL_MAGIC_nkeys
-#   define PERL_MAGIC_nkeys          'k'
-#endif
-
-#ifndef PERL_MAGIC_dbfile
-#   define PERL_MAGIC_dbfile         'L'
-#endif
-
-#ifndef PERL_MAGIC_dbline
-#   define PERL_MAGIC_dbline         'l'
-#endif
-
-#ifndef PERL_MAGIC_mutex
-#   define PERL_MAGIC_mutex          'm'
-#endif
-
-#ifndef PERL_MAGIC_shared
-#   define PERL_MAGIC_shared         'N'
-#endif
-
-#ifndef PERL_MAGIC_shared_scalar
-#   define PERL_MAGIC_shared_scalar  'n'
-#endif
-
-#ifndef PERL_MAGIC_collxfrm
-#   define PERL_MAGIC_collxfrm       'o'
-#endif
-
-#ifndef PERL_MAGIC_tied
-#   define PERL_MAGIC_tied           'P'
-#endif
-
-#ifndef PERL_MAGIC_tiedelem
-#   define PERL_MAGIC_tiedelem       'p'
-#endif
-
-#ifndef PERL_MAGIC_tiedscalar
-#   define PERL_MAGIC_tiedscalar     'q'
-#endif
-
-#ifndef PERL_MAGIC_qr
-#   define PERL_MAGIC_qr             'r'
-#endif
-
-#ifndef PERL_MAGIC_sig
-#   define PERL_MAGIC_sig            'S'
-#endif
-
-#ifndef PERL_MAGIC_sigelem
-#   define PERL_MAGIC_sigelem        's'
-#endif
-
-#ifndef PERL_MAGIC_taint
-#   define PERL_MAGIC_taint          't'
-#endif
-
-#ifndef PERL_MAGIC_uvar
-#   define PERL_MAGIC_uvar           'U'
-#endif
-
-#ifndef PERL_MAGIC_uvar_elem
-#   define PERL_MAGIC_uvar_elem      'u'
-#endif
-
-#ifndef PERL_MAGIC_vstring
-#   define PERL_MAGIC_vstring        'V'
-#endif
-
-#ifndef PERL_MAGIC_vec
-#   define PERL_MAGIC_vec            'v'
-#endif
-
-#ifndef PERL_MAGIC_utf8
-#   define PERL_MAGIC_utf8           'w'
-#endif
-
-#ifndef PERL_MAGIC_substr
-#   define PERL_MAGIC_substr         'x'
-#endif
-
-#ifndef PERL_MAGIC_defelem
-#   define PERL_MAGIC_defelem        'y'
-#endif
-
-#ifndef PERL_MAGIC_glob
-#   define PERL_MAGIC_glob           '*'
-#endif
-
-#ifndef PERL_MAGIC_arylen
-#   define PERL_MAGIC_arylen         '#'
-#endif
-
-#ifndef PERL_MAGIC_pos
-#   define PERL_MAGIC_pos            '.'
-#endif
-
-#ifndef PERL_MAGIC_backref
-#   define PERL_MAGIC_backref        '<'
-#endif
-
-#ifndef PERL_MAGIC_ext
-#   define PERL_MAGIC_ext            '~'
-#endif
-
-#endif /* _P_P_PORTABILITY_H_ */
-
-/* End of File ppport.h */
diff --git a/perl/GRIB-API/t/GRIB-API.t b/perl/GRIB-API/t/GRIB-API.t
deleted file mode 100644
index 58130ff..0000000
--- a/perl/GRIB-API/t/GRIB-API.t
+++ /dev/null
@@ -1,27 +0,0 @@
-# Before `make install' is performed this script should be runnable with
-# `make test'. After `make install' it should work as `perl GRIB-API.t'
-
-#########################
-
-# change 'tests => 1' to 'tests => last_test_to_print';
-
-use Test::More tests => 1;
-BEGIN { use_ok('GRIB::API') };
-
-#########################
-
-# Insert your test code below, the Test::More module is use()ed here so read
-# its man page ( perldoc Test::More ) for help writing this test script.
-
-use Data::Dumper;
-
-ok(test1());
-
-sub test1 {
-print "here\n";
-
-open(IN,"</tmp/data.grib");
-my $x = GRIB::API::Read(\*IN);
-print Dumper($x);
-
-}
diff --git a/perl/GRIB-API/test.pl b/perl/GRIB-API/test.pl
deleted file mode 100755
index 67ceabb..0000000
--- a/perl/GRIB-API/test.pl
+++ /dev/null
@@ -1,133 +0,0 @@
-#!/usr/local/bin/perl56 
-# Copyright 2005-2016 ECMWF.
-#
-# This software is licensed under the terms of the Apache Licence Version 2.0
-# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
-# 
-# In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
-# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
-
-use lib qw(blib/lib blib/arch);
-use GRIB::API;
-use GRIB::API::Tie;
-use GRIB::API::Debug;
-use Data::Dumper;
-use IO::Handle;
-
-open(IN,"<data.grib");
-while(my $x = GRIB::API->new(\*IN))
-{
-	my @x = $x->get_keys("mars");
-	print "@x\n";
-}
-
-__END__
-
-autoflush STDOUT 1;
-
-unless( -f "data.grib")
-{
-	open(MARS,"|mars");
-	print MARS "ret,tar=data.grib,level=500,grid=5/5,area=e\n";
-	close(MARS);
-}
-
-#GRIB::API::debug();
-
-
-{
-	print Dumper($x->get_long("date"));
-	print Dumper($x->get_long("foo"));
-	print Dumper($x->get_double("class"));
-	print Dumper($x->get_string("class"));
-	print Dumper($x->get_string("expver"));
-	print "set ", Dumper($x->set_long("date",20050101));
-
-
-	print Dumper($x->get_long("date"));
-	$x->set_string("class","rd") or die;
-	$x->set_string("klass","rd") or warn;
-	print Dumper($x->get_string("class"));
-
-	my $class = "xxxx";
-	print Dumper([$class=$x->get_bytes("expver"),$class]);
-
-	my $class = "xxxx";
-	print Dumper([$class=$x->get_bytes("expver"),$class]);
-
-	$class = pack "L" , 0x41414141;
-	print Dumper([$class]);
-	$x->set_bytes("expver",$class) or warn;
-	print Dumper($x->get_string("expver"));
-
-	print Dumper($x->get_size("values"));
-	my @x = $x->get_double_array("values");
-	print scalar(@x),"\n";
-	my $t = $x->get_double_array("values");
-	print ref($t),"\n";
-
-if(1) {
-	foreach my $t ( @x ) { $t *= 2; }
-	$x->set_double_array("values",\@x) or die;
-	my @y = $x->get_double_array("values");
-
-	my $i = 0;
-	foreach my $t ( @x )
-	{
-		my $x = ($t - $y[$i])/($t?$t:1);
-		$x = -$x if($x<0);
-		die "$t $y[$i] $x" if($x > 1e6);
-		$i++;
-	}
-}
-
-
-	my $i = $x->iterator();
-	print "iterator $i\n";
-	if($i)
-	{
-		while( ($lat,$lon,$value) = $i->next())
-		{
-			print "($lat,$lon,$value)\n";
-		}
-	}
-
-
-	@x = $x->get_keys();
-	print Dumper(\@x);
-
-	open(OUT,">foo");
-	$x->Write(\*OUT);
-	close(OUT);
-
-
-	my %x;
-	tie %x, "GRIB::API::Tie",$x;
-	print "--- ",$x{class},"\n";
-	$x{class} = "e4";
-	print "--- ",$x{class},"\n";
-	$x{class} = 1;
-	print "--- ",$x{class},"\n";
-
-
-	foreach my $z ( keys %x )
-	{
-		print "$z = [$x{$z}]\n" ;
-		print "    size=[", $x->get_size($z),"] type=[", $x->get_type($z), "] class=[" , $x->get_accessor_class($z), "]\n";
-		;#unless($z =~ /grib(\w+)?section_?\d/i);
-	}
-
-	$r = $x->get("values");
-	print $r,"\n";
-	$r = undef;
-
-
-	print Dumper(\%x);
-
-	my $y= GRIB::API::create("GRIB\0\0\0\1" . "\0" x 400000);
-	my %y;
-	tie %y, "GRIB::API::Tie",$y;
-
-	#%y = %x;
-#	print Dumper(\%y);
-}
diff --git a/perl/GRIB-API/typemap b/perl/GRIB-API/typemap
deleted file mode 100644
index 6254cb2..0000000
--- a/perl/GRIB-API/typemap
+++ /dev/null
@@ -1,2 +0,0 @@
-GRIB::API    T_PTROBJ
-GRIB::API::Iterator    T_PTROBJ
diff --git a/perl/Makefile.am b/perl/Makefile.am
deleted file mode 100644
index 8db8c7b..0000000
--- a/perl/Makefile.am
+++ /dev/null
@@ -1,39 +0,0 @@
-
-API_DIR=GRIB-API
-PERLMAKEMAKER=$(API_DIR)/Makefile.PL
-PERLMAKEFILE=$(API_DIR)/Makefile
-PERLLIB=$(API_DIR)/blib/arch/auto/GRIB/API/API.so
-
-dist-hook:
-	( cd $(API_DIR) &&  \
-	   cat MANIFEST \
-	       | cpio -pdum $(distdir)/$(API_DIR) 2> /dev/null ; )
-
-all-local: all-perl
-
-all-perl: $(PERLLIB)
-
-$(PERLMAKEFILE): $(PERLMAKEMAKER)
-	cd $(API_DIR) && @PERL@ Makefile.PL @PERL_INSTALL_OPTIONS@ @PERL_MAKE_OPTIONS@ @PERL_LD_OPTIONS@ 
-
-$(PERLLIB): $(PERLMAKEFILE) $(top_builddir)/src/libgrib_api.a
-	cd $(API_DIR) && $(MAKE)
-
-$(top_builddir)/src/libgrib_api.a: $(top_builddir)/src/Makefile
-	cd $(top_builddir)/src  && $(MAKE)
-
-install-exec-perl: $(PERLMAKEFILE)
-	cd $(API_DIR) && $(MAKE) install && $(MAKE) clean
-
-install-exec-am:install-exec-perl
-
-check-perl: $(PERLMAKEFILE)
-	cd $(API_DIR) && $(MAKE) test
-
-clean-perl: $(PERLMAKEFILE)
-	cd $(API_DIR) && \
-	$(MAKE) clean && \
-	rm -f Makefile.old
-
-distclean-perl: clean-perl
-clean: clean-perl
diff --git a/perl/README b/perl/README
deleted file mode 100644
index 6cfe17d..0000000
--- a/perl/README
+++ /dev/null
@@ -1,20 +0,0 @@
-Batti:
-
-cd grib_api/main/perl/GRIB-API
-perl56 Makefile.PL
-make
-
-./test.pl
-./create.pl
-xdiff data.grib copy.grib
-~emos/bin/linux/compareGribFiles data.grib copy.grib
-
-mars
-ret,targ="data.grib",level=1,levtype=ml
-
-
-./create.pl
-xdiff *.dump
-
-(cannot set "pv")
-
diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt
index f8a0079..a895480 100644
--- a/python/CMakeLists.txt
+++ b/python/CMakeLists.txt
@@ -11,7 +11,11 @@ if( HAVE_PYTHON )
     endif()
 
     if( HAVE_LIBOPENJPEG )
+        # Get the name of the OpenJPEG library: version dependent!
+        # E.g. openjpeg (version 1.5) or openjp2 (version 2.x)
         get_filename_component(OPENJPEG_LIB_DIR ${OPENJPEG_LIBRARY} PATH )
+        get_filename_component(OJ_NAME_WE       ${OPENJPEG_LIBRARY} NAME_WE )
+        STRING(REGEX REPLACE "^lib" "" OJ_WITHOUT_LIB ${OJ_NAME_WE})
     endif()
 
     if( HAVE_AEC )
@@ -53,6 +57,6 @@ if( HAVE_PYTHON )
     # Build the extension module for use in install tree with RPATH pointing to install tree
     install(CODE "execute_process(COMMAND ${PYTHON_EXECUTABLE} setup.py build_ext --rpath ${CMAKE_INSTALL_PREFIX}/${INSTALL_LIB_DIR} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})")
     # Call distutils for installation
-    install(CODE "execute_process(COMMAND ${PYTHON_EXECUTABLE} setup.py install --prefix $ENV{DESTDIR}${CMAKE_INSTALL_PREFIX} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})")
+    install(CODE "execute_process(COMMAND ${PYTHON_EXECUTABLE} setup.py install --root \$ENV{DESTDIR}/ --prefix ${CMAKE_INSTALL_PREFIX} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})")
 
 endif()
diff --git a/python/create_errors.py.sh b/python/create_errors.py.sh
new file mode 100755
index 0000000..fd78090
--- /dev/null
+++ b/python/create_errors.py.sh
@@ -0,0 +1,111 @@
+#!/usr/bin/env perl
+
+# This script is used to generate the file "python/gribapi/errors.py"
+# It reads "src/grib_errors.c" which it expects to be up-to-date with
+# all the error codes.
+
+$|=1;
+
+my $input = '../src/grib_errors.c';
+my $print_class = 1;
+my %errmap = ();
+
+# Print header
+# -------------------------------------
+my $header = <<'END_HEADER';
+"""
+Exception class hierarchy
+"""
+
+import gribapi_swig as _internal
+
+
+class GribInternalError(Exception):
+    """
+    @brief Wrap errors coming from the C API in a Python exception object.
+
+    Base class for all exceptions
+    """
+
+    def __init__(self, value):
+        # Call the base class constructor with the parameters it needs
+        Exception.__init__(self, value)
+        if type(value) is int:
+            err, self.msg = _internal.grib_c_get_error_string(value, 1024)
+            assert err == 0
+        else:
+            self.msg = value
+
+    def __str__(self):
+        return self.msg
+
+
+END_HEADER
+print $header;
+
+# Print the exception classes
+# -------------------------------------
+while (<>) {
+    # Example of input line
+    #  "Passed array is too small",   /* -6 GRIB_ARRAY_TOO_SMALL */
+    if (/^"(.*)",\s+\/\* (.*) (.*) \*\//) {
+        $desc = $1;
+        $code = $2;
+        $name = $3;
+        next if ($code == 0);
+
+        $name =~ s/GRIB_//;
+        $name_lc = $name;
+        $name_lc =~ s/_/ /g;
+        $name_lc = lc $name_lc;
+        $name_lc =~ s/(\w+)/\u$1/g;
+        $name_lc =~ s/ //g;
+
+        $name = $name_lc;
+        if ($name !~ /Error$/) {
+            $name = $name . "Error";
+        }
+        
+        $name = 'FunctionNotImplementedError' if ($name eq 'NotImplementedError');
+        $name = 'MessageEndNotFoundError'     if ($name eq '7777NotFoundError');
+        $name = 'IOProblemError'              if ($name eq 'IoProblemError');
+        $name = 'MessageInvalidError'         if ($name eq 'InvalidMessageError');
+        $name = 'GeocalculusError'            if ($name eq 'GeocalculusProblemError');
+        $name = 'InvalidOrderByError'         if ($name eq 'InvalidOrderbyError');
+        $name = 'InvalidBitsPerValueError'    if ($name eq 'InvalidBpvError');
+        $name = 'KeyValueNotFoundError'       if ($name eq 'NotFoundError');
+        $name = 'MemoryAllocationError'       if ($name eq 'OutOfMemoryError');
+
+        # Print the class declaration
+        print "class ${name}(GribInternalError):\n";
+        print "    \"\"\"${desc}.\"\"\"\n";
+
+        $errmap{$code} = $name; # store for later
+    }
+}
+
+# Print the map
+# -------------------------------------
+my $size = keys %errmap;
+print "\nERROR_MAP = {\n";
+my $i = 0;
+for $key (sort { $a <=> $b } keys %errmap) {
+    $i++;
+    my $ktext = sprintf("%-3d", $key);
+    print "    $ktext : $errmap{$key}";
+    print ",\n" if ($i < $size);
+}
+print "\n}\n\n";
+
+
+# Print footer
+# -------------------------------------
+my $footer = <<'END_FOOTER';
+
+def raise_grib_error(errid):
+    """
+    Raise the GribInternalError corresponding to ``errid``.
+    """
+    raise ERROR_MAP[errid](errid)
+END_FOOTER
+print $footer;
diff --git a/python/eccodes/__init__.py b/python/eccodes/__init__.py
index b6c4997..42006b9 100644
--- a/python/eccodes/__init__.py
+++ b/python/eccodes/__init__.py
@@ -1,2 +1,11 @@
+from __future__ import absolute_import
+import sys
+
 from .eccodes import *
 from .eccodes import __version__
+
+if sys.version_info >= (2, 6):
+    from .high_level.gribfile import GribFile
+    from .high_level.gribmessage import GribMessage
+    from .high_level.gribindex import GribIndex
+    from .high_level.bufr import BufrFile, BufrMessage
diff --git a/python/eccodes/eccodes.py b/python/eccodes/eccodes.py
index cfa22e6..aa83611 100644
--- a/python/eccodes/eccodes.py
+++ b/python/eccodes/eccodes.py
@@ -48,6 +48,8 @@ from gribapi import grib_set_long as codes_set_long
 from gribapi import grib_set_double as codes_set_double
 from gribapi import grib_new_from_samples as codes_grib_new_from_samples
 from gribapi import codes_bufr_new_from_samples
+from gribapi import codes_new_from_samples
+from gribapi import codes_bufr_copy_data
 from gribapi import grib_clone as codes_clone
 from gribapi import grib_set_double_array as codes_set_double_array
 from gribapi import grib_get_double_array as codes_get_double_array
@@ -99,3 +101,4 @@ from gribapi import grib_set_definitions_path as codes_set_definitions_path
 from gribapi import grib_set_samples_path as codes_set_samples_path
 
 from gribapi import GribInternalError as CodesInternalError
+from gribapi.errors import *
diff --git a/python/eccodes/high_level/__init__.py b/python/eccodes/high_level/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/python/eccodes/high_level/bufr.py b/python/eccodes/high_level/bufr.py
new file mode 100644
index 0000000..3fda4d9
--- /dev/null
+++ b/python/eccodes/high_level/bufr.py
@@ -0,0 +1,79 @@
+"""
+Classes for handling BUFR with a high level interface.
+
+``BufrFiles`` can be treated mostly as regular files and used as context
+managers, as can ``BufrMessages``. Each of these classes destructs itself and
+any child instances appropriately.
+
+Author: Daniel Lee, DWD, 2016
+"""
+
+from .. import eccodes
+from .codesmessage import CodesMessage
+from .codesfile import CodesFile
+
+
+class BufrMessage(CodesMessage):
+
+    __doc__ = "\n".join(CodesMessage.__doc__.splitlines()[4:]).format(
+        prod_type="BUFR", classname="BufrMessage", parent="BufrFile",
+        alias="bufr")
+
+    product_kind = eccodes.CODES_PRODUCT_BUFR
+
+    # Arguments included explicitly to support introspection
+    # TODO: Can we get this to work with an index?
+    def __init__(self, codes_file=None, clone=None, sample=None,
+                 headers_only=False):
+        """
+        Open a message and inform the GRIB file that it's been incremented.
+
+        The message is taken from ``codes_file``, cloned from ``clone`` or
+        ``sample``, or taken from ``index``, in that order of precedence.
+        """
+        super(self.__class__, self).__init__(codes_file, clone, sample,
+                                             headers_only)
+        self._unpacked = False
+
+    def get(self, key, ktype=None):
+        """Return requested value, unpacking data values if necessary."""
+        # TODO: Only do this if accessing arrays that need unpacking
+        if not self._unpacked:
+            self.unpacked = True
+        return super(self.__class__, self).get(key, ktype)
+
+    #def missing(self, key):
+    #    """
+    #    Report if key is missing.#
+    #
+    #    Overloaded due to confusing behaviour in ``codes_is_missing`` (SUP-1874).
+    #    """
+    #    return not bool(eccodes.codes_is_defined(self.codes_id, key))
+
+    def keys(self, namespace=None):
+        self.unpacked = True
+        return super(self.__class__, self).keys(namespace)
+
+    @property
+    def unpacked(self):
+        return self._unpacked
+
+    @unpacked.setter
+    def unpacked(self, val):
+        eccodes.codes_set(self.codes_id, "unpack", val)
+        self._unpacked = val
+
+    def __setitem__(self, key, value):
+        """Set item and pack BUFR."""
+        if not self._unpacked:
+            self.unpacked = True
+        super(self.__class__, self).__setitem__(key, value)
+        eccodes.codes_set(self.codes_id, "pack", True)
+
+
+class BufrFile(CodesFile):
+
+    __doc__ = "\n".join(CodesFile.__doc__.splitlines()[4:]).format(
+        prod_type="BUFR", classname="BufrFile", alias="bufr")
+
+    MessageClass = BufrMessage
diff --git a/python/eccodes/high_level/codesfile.py b/python/eccodes/high_level/codesfile.py
new file mode 100644
index 0000000..261a097
--- /dev/null
+++ b/python/eccodes/high_level/codesfile.py
@@ -0,0 +1,71 @@
+"""
+``CodesFile`` class that implements a file that is readable by ecCodes and
+closes itself and its messages when it is no longer needed.
+
+Author: Daniel Lee, DWD, 2016
+"""
+
+from .. import eccodes
+
+
+class CodesFile(file):
+
+    """
+    An abstract class to specify and/or implement common behaviour that files
+    read by ecCodes should implement.
+
+    A {prod_type} file handle meant for use in a context manager.
+
+    Individual messages can be accessed using the ``next`` method. Of course,
+    it is also possible to iterate over each message in the file::
+
+        >>> with {classname}(filename) as {alias}:
+        ...     # Print number of messages in file
+        ...     len({alias})
+        ...     # Open all messages in file
+        ...     for msg in {alias}:
+        ...         print(msg[key_name])
+        ...     len({alias}.open_messages)
+        >>> # When the file is closed, any open messages are closed
+        >>> len({alias}.open_messages)
+    """
+
+    #: Type of messages belonging to this file
+    MessageClass = None
+
+    def __init__(self, filename, mode="r"):
+        """Open file and receive codes file handle."""
+        #: File handle for working with actual file on disc
+        #: The class holds the file it works with because ecCodes'
+        # typechecking does not allow using inherited classes.
+        self.file_handle = open(filename, mode)
+        #: Number of message in file currently being read
+        self.message = 0
+        #: Open messages
+        self.open_messages = []
+
+    def __exit__(self, exception_type, exception_value, traceback):
+        """Close all open messages, release GRIB file handle and close file."""
+        while self.open_messages:
+            self.open_messages.pop().close()
+        self.file_handle.close()
+
+    def __len__(self):
+        """Return total number of messages in file."""
+        return eccodes.codes_count_in_file(self.file_handle)
+
+    def __enter__(self):
+        return self
+
+    def close(self):
+        """Possibility to manually close file."""
+        self.__exit__(None, None, None)
+
+    def __iter__(self):
+        return self
+
+    def next(self):
+        try:
+            return self.MessageClass(self)
+        except IOError:
+            raise StopIteration()
diff --git a/python/eccodes/high_level/codesmessage.py b/python/eccodes/high_level/codesmessage.py
new file mode 100644
index 0000000..a35a2f6
--- /dev/null
+++ b/python/eccodes/high_level/codesmessage.py
@@ -0,0 +1,179 @@
+"""
+``CodesMessage`` class that implements a message readable by ecCodes that
+allows access to the message's key-value pairs in a dictionary-like manner
+and closes the message when it is no longer needed, coordinating this with
+its host file.
+
+Author: Daniel Lee, DWD, 2016
+"""
+
+from .. import eccodes
+
+
+class CodesMessage(object):
+
+    """
+    An abstract class to specify and/or implement common behaviour that
+    messages read by ecCodes should implement.
+
+    A {prod_type} message.
+
+    Each ``{classname}`` is stored as a key/value pair in a dictionary-like
+    structure. It can be used in a context manager or by itself. When the
+    ``{parent}`` it belongs to is closed, the ``{parent}`` closes any open
+    ``{classname}``s that belong to it. If a ``{classname}`` is closed before
+    its ``{parent}`` is closed, it informs the ``{parent}`` of its closure.
+
+    Scalar and vector values are set appropriately through the same method.
+
+    ``{classname}``s can be instantiated from a ``{parent}``, cloned from
+    other ``{classname}``s or taken from samples. Iterating over the members
+    of a ``{parent}`` extracts the ``{classname}``s it contains until the
+    ``{parent}`` is exhausted.
+
+    Usage::
+
+        >>> with {parent}(filename) as {alias}:
+        ...     # Access a key from each message
+        ...     for msg in {alias}:
+        ...         print(msg[key_name])
+        ...     # Report number of keys in message
+        ...     len(msg)
+        ...     # Report message size in bytes
+        ...     msg.size
+        ...     # Report keys in message
+        ...     msg.keys()
+        ...     # Set scalar value
+        ...     msg[scalar_key] = 5
+        ...     # Check key's value
+        ...     msg[scalar_key]
+        ...     msg[key_name]
+        ...     # Array values are set transparently
+        ...     msg[array_key] = [1, 2, 3]
+        ...     # Messages can be written to file
+        ...     with open(testfile, "w") as test:
+        ...         msg.write(test)
+        ...     # Messages can be cloned from other messages
+        ...     msg2 = {classname}(clone=msg)
+        ...     # If desired, messages can be closed manually or used in with
+        ...     msg.close()
+    """
+
+    #: ecCodes enum-like PRODUCT constant
+    product_kind = None
+
+    def __init__(self, codes_file=None, clone=None, sample=None,
+                 headers_only=False, other_args_found=False):
+        """
+        Open a message and inform the host file that it's been incremented.
+
+        If ``codes_file`` is not supplied, the message is cloned from
+        ``CodesMessage`` ``clone``. If neither is supplied,
+        the ``CodesMessage`` is cloned from ``sample``.
+
+        :param codes_file: A file readable for ecCodes
+        :param clone: A valid ``CodesMessage``
+        :param sample: A valid sample path to create ``CodesMessage`` from
+        """
+        if not other_args_found and codes_file is None and clone is None and sample is None:
+            raise RuntimeError("CodesMessage initialization parameters not "
+                               "present.")
+        #: Unique ID, for ecCodes interface
+        self.codes_id = None
+        #: File containing message
+        self.codes_file = None
+        if codes_file is not None:
+            self.codes_id = eccodes.codes_new_from_file(
+                codes_file.file_handle, self.product_kind, headers_only)
+            if self.codes_id is None:
+                raise IOError("CodesFile %s is exhausted" % codes_file.name)
+            self.codes_file = codes_file
+            self.codes_file.message += 1
+            self.codes_file.open_messages.append(self)
+        elif clone is not None:
+            self.codes_id = eccodes.codes_clone(clone.codes_id)
+        elif sample is not None:
+            self.codes_id = eccodes.codes_new_from_samples(
+                sample, self.product_kind)
+
+    def write(self, outfile=None):
+        """Write message to file."""
+        if not outfile:
+            # This is a hack because the API does not accept inheritance
+            outfile = self.codes_file.file_handle
+        eccodes.codes_write(self.codes_id, outfile)
+
+    def __setitem__(self, key, value):
+        """
+        Set value associated with key.
+
+        Iterables and scalars are handled intelligently.
+        """
+        # Passed value is iterable and not string
+        if hasattr(value, "__iter__"):
+            eccodes.codes_set_array(self.codes_id, key, value)
+        else:
+            eccodes.codes_set(self.codes_id, key, value)
+
+    def keys(self, namespace=None):
+        """Get available keys in message."""
+        iterator = eccodes.codes_keys_iterator_new(self.codes_id,
+                                                   namespace=namespace)
+        keys = []
+        while eccodes.codes_keys_iterator_next(iterator):
+            key = eccodes.codes_keys_iterator_get_name(iterator)
+            keys.append(key)
+        eccodes.codes_keys_iterator_delete(iterator)
+        return keys
+
+    def size(self):
+        """Return size of message in bytes."""
+        return eccodes.codes_get_message_size(self.codes_id)
+
+    def dump(self):
+        """Dump message's binary content."""
+        return eccodes.codes_get_message(self.codes_id)
+
+    def get(self, key, ktype=None):
+        """Get value of a given key as its native or specified type."""
+        # if self.missing(key):
+        #    raise KeyError("Value of key %s is MISSING." % key)
+        if eccodes.codes_get_size(self.codes_id, key) > 1:
+            ret = eccodes.codes_get_array(self.codes_id, key, ktype)
+        else:
+            ret = eccodes.codes_get(self.codes_id, key, ktype)
+        return ret
+
+    def __exit__(self, exc_type, exc_val, exc_tb):
+        """Release message handle and inform host file of release."""
+        eccodes.codes_release(self.codes_id)
+
+    def __enter__(self):
+        return self
+
+    def close(self):
+        """Possibility to manually close message."""
+        self.__exit__(None, None, None)
+
+    def __contains__(self, key):
+        """Check whether a key is present in message."""
+        return key in self.keys()
+
+    def __len__(self):
+        """Return key count."""
+        return len(self.keys())
+
+    def __getitem__(self, key):
+        """Return value associated with key as its native type."""
+        return self.get(key)
+
+    def __iter__(self):
+        return iter(self.keys())
+
+    # Not yet implemented
+    # def itervalues(self):
+    #    return self.values()
+
+    def items(self):
+        """Return list of tuples of all key/value pairs."""
+        return [(key, self[key]) for key in self.keys()]
diff --git a/python/eccodes/high_level/gribfile.py b/python/eccodes/high_level/gribfile.py
new file mode 100644
index 0000000..6e074fe
--- /dev/null
+++ b/python/eccodes/high_level/gribfile.py
@@ -0,0 +1,17 @@
+"""
+``GribFile`` class that implements a GRIB file that closes itself and its
+messages when it is no longer needed.
+
+Author: Daniel Lee, DWD, 2014
+"""
+
+from .codesfile import CodesFile
+from .gribmessage import GribMessage
+
+
+class GribFile(CodesFile):
+
+    __doc__ = "\n".join(CodesFile.__doc__.splitlines()[4:]).format(
+        prod_type="GRIB", classname="GribFile", alias="grib")
+
+    MessageClass = GribMessage
diff --git a/python/eccodes/high_level/gribindex.py b/python/eccodes/high_level/gribindex.py
new file mode 100644
index 0000000..955095a
--- /dev/null
+++ b/python/eccodes/high_level/gribindex.py
@@ -0,0 +1,102 @@
+"""
+``GribIndex`` class that implements a GRIB index that allows access to
+the GRIB API's index functionality.
+
+Author: Daniel Lee, DWD, 2014
+"""
+
+from .. import eccodes
+from .gribmessage import GribMessage
+
+
+class GribIndex(object):
+    """
+    A GRIB index meant for use in a context manager.
+
+    Usage::
+
+        >>> # Create index from file with keys
+        >>> with GribIndex(filename, keys) as idx:
+        ...     # Write index to file
+        ...     idx.write(index_file)
+        >>> # Read index from file
+        >>> with GribIndex(file_index=index_file) as idx:
+        ...     # Add new file to index
+        ...     idx.add(other_filename)
+        ...     # Report number of unique values for given key
+        ...     idx.size(key)
+        ...     # Report unique values indexed by key
+        ...     idx.values(key)
+        ...     # Request GribMessage matching key, value
+        ...     msg = idx.select({key: value})
+    """
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, exception_type, exception_value, traceback):
+        """Release GRIB message handle and inform file of release."""
+        while self.open_messages:
+            self.open_messages[0].close()
+        eccodes.codes_index_release(self.iid)
+
+    def close(self):
+        """Possibility to manually close index."""
+        self.__exit__(None, None, None)
+
+    def __init__(self, filename=None, keys=None, file_index=None,
+                 grib_index=None):
+        """
+        Create new GRIB index over ``keys`` from ``filename``.
+
+        ``filename`` should be a string of the desired file's filename.
+        ``keys`` should be a sequence of keys to index. ``file_index`` should
+        be a string of the file that the index should be loaded from.
+        ``grib_index`` should be another ``GribIndex``.
+
+        If ``filename`` and ``keys`` are provided, the ``GribIndex`` is
+        initialized over the given keys from the given file. If they are not
+        provided, the ``GribIndex`` is read from ``indexfile``. If
+        ``grib_index`` is provided, it is cloned from the given ``GribIndex``.
+        """
+        #: Grib index ID
+        self.iid = None
+        if filename and keys:
+            self.iid = eccodes.codes_index_new_from_file(filename, keys)
+        elif file_index:
+            self.iid = eccodes.codes_index_read(file_index)
+        elif grib_index:
+            self.iid = eccodes.codes_new_from_index(grib_index.iid)
+        else:
+            raise RuntimeError("No source was supplied "
+                               "(possibilities: grib_file, clone, sample).")
+        #: Indexed keys. Only available if GRIB is initialized from file.
+        self.keys = keys
+        #: Open GRIB messages
+        self.open_messages = []
+
+    def size(self, key):
+        """Return number of distinct values for index key."""
+        return eccodes.codes_index_get_size(self.iid, key)
+
+    def values(self, key, ktype=str):
+        """Return distinct values of index key."""
+        return eccodes.codes_index_get(self.iid, key, ktype)
+
+    def add(self, filename):
+        """Add ``filename`` to the ``GribIndex``."""
+        eccodes.codes_index_add_file(self.iid, filename)
+
+    def write(self, outfile):
+        """Write index to filename at ``outfile``."""
+        eccodes.codes_index_write(self.iid, outfile)
+
+    def select(self, key_value_pairs):
+        """
+        Return message associated with given key value pairs.
+
+        ``key_value_pairs`` should be passed as a dictionary.
+        """
+        for key in key_value_pairs:
+            eccodes.codes_index_select(self.iid, key, key_value_pairs[key])
+        return GribMessage(gribindex=self)
diff --git a/python/eccodes/high_level/gribmessage.py b/python/eccodes/high_level/gribmessage.py
new file mode 100644
index 0000000..c87cfed
--- /dev/null
+++ b/python/eccodes/high_level/gribmessage.py
@@ -0,0 +1,80 @@
+"""
+``GribMessage`` class that implements a GRIB message that allows access to
+the message's key-value pairs in a dictionary-like manner and closes the
+message when it is no longer needed, coordinating this with its host file.
+
+Author: Daniel Lee, DWD, 2014
+"""
+
+from .codesmessage import CodesMessage
+from .. import eccodes
+
+
+class IndexNotSelectedError(Exception):
+    """GRIB index was requested before selecting key/value pairs."""
+
+
+class GribMessage(CodesMessage):
+
+    __doc__ = "\n".join(CodesMessage.__doc__.splitlines()[4:]).format(
+        prod_type="GRIB", classname="GribMessage", parent="GribFile",
+        alias="grib")
+
+    product_kind = eccodes.CODES_PRODUCT_GRIB
+
+    # Arguments included explicitly to support introspection
+    def __init__(self, codes_file=None, clone=None, sample=None,
+                 headers_only=False, gribindex=None):
+        """
+        Open a message and inform the GRIB file that it's been incremented.
+
+        The message is taken from ``codes_file``, cloned from ``clone`` or
+        ``sample``, or taken from ``index``, in that order of precedence.
+        """
+        grib_args_present = True
+        if gribindex is None:
+            grib_args_present = False
+        super(self.__class__, self).__init__(codes_file, clone, sample,
+                                             headers_only, grib_args_present)
+        #: GribIndex referencing message
+        self.grib_index = None
+        if gribindex is not None:
+            self.codes_id = eccodes.codes_new_from_index(gribindex.iid)
+            if not self.codes_id:
+                raise IndexNotSelectedError("All keys must have selected "
+                                            "values before receiving message "
+                                            "from index.")
+            self.grib_index = gribindex
+            gribindex.open_messages.append(self)
+
+    def __exit__(self, exc_type, exc_val, exc_tb):
+        """Release GRIB message handle and inform file of release."""
+        super(self.__class__, self).__exit__(exc_type, exc_val, exc_tb)
+        if self.grib_index:
+            self.grib_index.open_messages.remove(self)
+
+    def missing(self, key):
+        """Report if the value of a key is MISSING."""
+        return bool(eccodes.codes_is_missing(self.codes_id, key))
+
+    def set_missing(self, key):
+        """Set the value of key to MISSING."""
+        eccodes.codes_set_missing(self.codes_id, key)
+
+    @property
+    def gid(self):
+        """Provided for backwards compatibility."""
+        return self.codes_id
+
+    @property
+    def grib_file(self):
+        """Provided for backwards compatibility."""
+        return self.codes_file
+
+    @gid.setter
+    def gid(self, val):
+        self.codes_id = val
+
+    @grib_file.setter
+    def grib_file(self, val):
+        self.codes_file = val
diff --git a/python/grib_errors.h b/python/grib_errors.h
index 03cdcca..2b35a26 100644
--- a/python/grib_errors.h
+++ b/python/grib_errors.h
@@ -39,7 +39,7 @@ Error codes returned by the grib_api functions.
 #define GRIB_NO_MORE_IN_SET		-15
 /** Problem with calculation of geographic attributes */
 #define GRIB_GEOCALCULUS_PROBLEM		-16
-/** Out of memory */
+/** Memory allocation error */
 #define GRIB_OUT_OF_MEMORY		-17
 /** Value is read only */
 #define GRIB_READ_ONLY		-18
diff --git a/python/grib_interface.c b/python/grib_interface.c
index 5c5c4fd..7ffd042 100644
--- a/python/grib_interface.c
+++ b/python/grib_interface.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -2011,6 +2011,19 @@ int grib_c_copy_message(int* gid, void* mess,size_t* len)
     return GRIB_SUCCESS;
 }
 
+int grib_c_bufr_copy_data(int *msgid_src, int *msgid_dst)
+{
+    int err = 0;
+    grib_handle* src  = get_handle(*msgid_src);
+    grib_handle* dest = get_handle(*msgid_dst);
+    if (!src || !dest) {
+        return GRIB_INVALID_GRIB;
+    }
+
+    err = codes_bufr_copy_data(src, dest);
+    return err;
+}
+
 void grib_c_check(int* err,char* call,char* str)
 {
     grib_context* c=grib_context_get_default();
diff --git a/python/grib_interface.h b/python/grib_interface.h
index db35b4e..d6fb295 100644
--- a/python/grib_interface.h
+++ b/python/grib_interface.h
@@ -94,6 +94,7 @@ int grib_c_get_data_real4(int *gid, float *lats, float *lons, float *values, siz
 int grib_c_get_message_size(int *gid, size_t *len);
 int grib_c_get_message_offset(int *gid, size_t *len);
 int grib_c_copy_message(int *gid, void *mess, size_t *len);
+int grib_c_bufr_copy_data(int *msgid_src, int *msgid_dst);
 void grib_c_check(int *err, char *call, char *str);
 int grib_c_write(int *gid, FILE *f);
 int grib_c_multi_new(int* mgid);
diff --git a/python/gribapi.c b/python/gribapi.c
index 36efd0f..d0a96f5 100644
--- a/python/gribapi.c
+++ b/python/gribapi.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/python/gribapi/errors.py b/python/gribapi/errors.py
new file mode 100644
index 0000000..4bf9497
--- /dev/null
+++ b/python/gribapi/errors.py
@@ -0,0 +1,235 @@
+"""
+Exception class hierarchy
+"""
+
+import gribapi_swig as _internal
+
+
+class GribInternalError(Exception):
+    """
+    @brief Wrap errors coming from the C API in a Python exception object.
+
+    Base class for all exceptions
+    """
+
+    def __init__(self, value):
+        # Call the base class constructor with the parameters it needs
+        Exception.__init__(self, value)
+        if type(value) is int:
+            err, self.msg = _internal.grib_c_get_error_string(value, 1024)
+            assert err == 0
+        else:
+            self.msg = value
+
+    def __str__(self):
+        return self.msg
+
+
+class WrongBitmapSizeError(GribInternalError):
+    """Size of bitmap is incorrect."""
+class OutOfRangeError(GribInternalError):
+    """Value out of coding range."""
+class UnsupportedEditionError(GribInternalError):
+    """Edition not supported.."""
+class AttributeNotFoundError(GribInternalError):
+    """Attribute not found.."""
+class TooManyAttributesError(GribInternalError):
+    """Too many attributes. Increase MAX_ACCESSOR_ATTRIBUTES."""
+class AttributeClashError(GribInternalError):
+    """Attribute is already present, cannot add."""
+class NullPointerError(GribInternalError):
+    """Null pointer."""
+class MissingBufrEntryError(GribInternalError):
+    """Missing BUFR table entry for descriptor."""
+class WrongConversionError(GribInternalError):
+    """Wrong type conversion."""
+class StringTooSmallError(GribInternalError):
+    """String is smaller than requested."""
+class InvalidKeyValueError(GribInternalError):
+    """Invalid key value."""
+class ValueDifferentError(GribInternalError):
+    """Value is different."""
+class DifferentEditionError(GribInternalError):
+    """Edition of two messages is different."""
+class InvalidBitsPerValueError(GribInternalError):
+    """Invalid number of bits per value."""
+class CorruptedIndexError(GribInternalError):
+    """Index is corrupted."""
+class MessageMalformedError(GribInternalError):
+    """Message malformed."""
+class UnderflowError(GribInternalError):
+    """Underflow."""
+class SwitchNoMatchError(GribInternalError):
+    """Switch unable to find a matching case."""
+class ConstantFieldError(GribInternalError):
+    """Constant field."""
+class MessageTooLargeError(GribInternalError):
+    """Message is too large for the current architecture."""
+class InternalArrayTooSmallError(GribInternalError):
+    """An internal array is too small."""
+class PrematureEndOfFileError(GribInternalError):
+    """End of resource reached when reading message."""
+class NullIndexError(GribInternalError):
+    """Null index."""
+class EndOfIndexError(GribInternalError):
+    """End of index reached."""
+class WrongGridError(GribInternalError):
+    """Grid description is wrong or inconsistent."""
+class NoValuesError(GribInternalError):
+    """Unable to code a field without values."""
+class EndError(GribInternalError):
+    """End of resource."""
+class WrongTypeError(GribInternalError):
+    """Wrong type while packing."""
+class NoDefinitionsError(GribInternalError):
+    """Definitions files not found."""
+class HashArrayNoMatchError(GribInternalError):
+    """Hash array no match."""
+class ConceptNoMatchError(GribInternalError):
+    """Concept no match."""
+class OutOfAreaError(GribInternalError):
+    """The point is out of the grid area."""
+class MissingKeyError(GribInternalError):
+    """Missing a key from the fieldset."""
+class InvalidOrderByError(GribInternalError):
+    """Invalid order by."""
+class InvalidNearestError(GribInternalError):
+    """Invalid nearest id."""
+class InvalidKeysIteratorError(GribInternalError):
+    """Invalid keys iterator id."""
+class InvalidIteratorError(GribInternalError):
+    """Invalid iterator id."""
+class InvalidIndexError(GribInternalError):
+    """Invalid index id."""
+class InvalidGribError(GribInternalError):
+    """Invalid grib id."""
+class InvalidFileError(GribInternalError):
+    """Invalid file id."""
+class WrongStepUnitError(GribInternalError):
+    """Wrong units for step (step must be integer)."""
+class WrongStepError(GribInternalError):
+    """Unable to set step."""
+class InvalidTypeError(GribInternalError):
+    """Invalid key type."""
+class WrongLengthError(GribInternalError):
+    """Wrong message length."""
+class ValueCannotBeMissingError(GribInternalError):
+    """Value cannot be missing."""
+class InvalidSectionNumberError(GribInternalError):
+    """Invalid section number."""
+class NullHandleError(GribInternalError):
+    """Null handle."""
+class InvalidArgumentError(GribInternalError):
+    """Invalid argument."""
+class ReadOnlyError(GribInternalError):
+    """Value is read only."""
+class MemoryAllocationError(GribInternalError):
+    """Memory allocation error."""
+class GeocalculusError(GribInternalError):
+    """Problem with calculation of geographic attributes."""
+class NoMoreInSetError(GribInternalError):
+    """Code cannot unpack because of string too small."""
+class EncodingError(GribInternalError):
+    """Encoding invalid."""
+class DecodingError(GribInternalError):
+    """Decoding invalid."""
+class MessageInvalidError(GribInternalError):
+    """Message invalid."""
+class IOProblemError(GribInternalError):
+    """Input output problem."""
+class KeyValueNotFoundError(GribInternalError):
+    """Key/value not found."""
+class WrongArraySizeError(GribInternalError):
+    """Array size mismatch."""
+class CodeNotFoundInTableError(GribInternalError):
+    """Code not found in code table."""
+class FileNotFoundError(GribInternalError):
+    """File not found."""
+class ArrayTooSmallError(GribInternalError):
+    """Passed array is too small."""
+class MessageEndNotFoundError(GribInternalError):
+    """Missing 7777 at end of message."""
+class FunctionNotImplementedError(GribInternalError):
+    """Function not yet implemented."""
+class BufferTooSmallError(GribInternalError):
+    """Passed buffer is too small."""
+class InternalError(GribInternalError):
+    """Internal error."""
+class EndOfFileError(GribInternalError):
+    """End of resource reached."""
+
+ERROR_MAP = {
+    -66 : WrongBitmapSizeError,
+    -65 : OutOfRangeError,
+    -64 : UnsupportedEditionError,
+    -63 : AttributeNotFoundError,
+    -62 : TooManyAttributesError,
+    -61 : AttributeClashError,
+    -60 : NullPointerError,
+    -59 : MissingBufrEntryError,
+    -58 : WrongConversionError,
+    -57 : StringTooSmallError,
+    -56 : InvalidKeyValueError,
+    -55 : ValueDifferentError,
+    -54 : DifferentEditionError,
+    -53 : InvalidBitsPerValueError,
+    -52 : CorruptedIndexError,
+    -51 : MessageMalformedError,
+    -50 : UnderflowError,
+    -49 : SwitchNoMatchError,
+    -48 : ConstantFieldError,
+    -47 : MessageTooLargeError,
+    -46 : InternalArrayTooSmallError,
+    -45 : PrematureEndOfFileError,
+    -44 : NullIndexError,
+    -43 : EndOfIndexError,
+    -42 : WrongGridError,
+    -41 : NoValuesError,
+    -40 : EndError,
+    -39 : WrongTypeError,
+    -38 : NoDefinitionsError,
+    -37 : HashArrayNoMatchError,
+    -36 : ConceptNoMatchError,
+    -35 : OutOfAreaError,
+    -34 : MissingKeyError,
+    -33 : InvalidOrderByError,
+    -32 : InvalidNearestError,
+    -31 : InvalidKeysIteratorError,
+    -30 : InvalidIteratorError,
+    -29 : InvalidIndexError,
+    -28 : InvalidGribError,
+    -27 : InvalidFileError,
+    -26 : WrongStepUnitError,
+    -25 : WrongStepError,
+    -24 : InvalidTypeError,
+    -23 : WrongLengthError,
+    -22 : ValueCannotBeMissingError,
+    -21 : InvalidSectionNumberError,
+    -20 : NullHandleError,
+    -19 : InvalidArgumentError,
+    -18 : ReadOnlyError,
+    -17 : MemoryAllocationError,
+    -16 : GeocalculusError,
+    -15 : NoMoreInSetError,
+    -14 : EncodingError,
+    -13 : DecodingError,
+    -12 : MessageInvalidError,
+    -11 : IOProblemError,
+    -10 : KeyValueNotFoundError,
+    -9  : WrongArraySizeError,
+    -8  : CodeNotFoundInTableError,
+    -7  : FileNotFoundError,
+    -6  : ArrayTooSmallError,
+    -5  : MessageEndNotFoundError,
+    -4  : FunctionNotImplementedError,
+    -3  : BufferTooSmallError,
+    -2  : InternalError,
+    -1  : EndOfFileError
+}
+
+
+def raise_grib_error(errid):
+    """
+    Raise the GribInternalError corresponding to ``errid``.
+    """
+    raise ERROR_MAP[errid](errid)
diff --git a/python/gribapi/gribapi.py b/python/gribapi/gribapi.py
index 45e42fd..3a58028 100644
--- a/python/gribapi/gribapi.py
+++ b/python/gribapi/gribapi.py
@@ -29,6 +29,8 @@ import sys
 import os
 from functools import wraps
 # import inspect
+from . import errors
+from errors import *  # noqa
 
 KEYTYPES = {
     1: int,
@@ -85,24 +87,6 @@ def require(**_params_):
         return modified
     return check_types
 
-
-class GribInternalError(Exception):
-    """
-    @brief Wrap errors coming from the C API in a Python exception object.
-    """
-    def __init__(self, value):
-        # Call the base class constructor with the parameters it needs
-        Exception.__init__(self, value)
-        if type(value) is int:
-            err, self.msg = _internal.grib_c_get_error_string(value, 1024)
-            assert err == 0
-        else:
-            self.msg = value
-
-    def __str__(self):
-        return self.msg
-
-
 # @cond
 class Bunch(dict):
     """
@@ -147,7 +131,7 @@ def GRIB_CHECK(errid):
     @exception GribInternalError
     """
     if errid:
-        raise GribInternalError(errid)
+        errors.raise_grib_error(errid)
 # @endcond
 
 
@@ -780,6 +764,29 @@ def grib_set_double(msgid, key, value):
     GRIB_CHECK(_internal.grib_c_set_double(msgid, key, value))
 
 
+ at require(samplename=str, product_kind=int)
+def codes_new_from_samples(samplename, product_kind):
+    """
+    @brief Create a new valid message from a sample for a given product.
+
+    The available samples are picked up from the directory pointed to
+    by the environment variable ECCODES_SAMPLES_PATH.
+    To know where the samples directory is run the codes_info tool.\n
+
+    \b Examples: \ref grib_samples.py "grib_samples.py"
+
+    @param samplename     name of the sample to be used
+    @param product_kind   CODES_PRODUCT_GRIB or CODES_PRODUCT_BUFR
+    @return               id of the message loaded in memory
+    @exception GribInternalError
+    """
+    if product_kind == CODES_PRODUCT_GRIB:
+        return grib_new_from_samples(samplename)
+    if product_kind == CODES_PRODUCT_BUFR:
+        return codes_bufr_new_from_samples(samplename)
+    raise Exception("Invalid product kind: " + product_kind)
+
+
 @require(samplename=str)
 def grib_new_from_samples(samplename):
     """
@@ -809,7 +816,7 @@ def codes_bufr_new_from_samples(samplename):
     by the environment variable ECCODES_SAMPLES_PATH.
     To know where the samples directory is run the codes_info tool.\n
 
-    \b Examples: \ref grib_samples.py "grib_samples.py"
+    \b Examples: \ref bufr_copy_data.py "bufr_copy_data.py"
 
     @param samplename   name of the BUFR sample to be used
     @return             id of the message loaded in memory
@@ -819,6 +826,23 @@ def codes_bufr_new_from_samples(samplename):
     GRIB_CHECK(err)
     return msgid
 
+ at require(msgid_src=int, msgid_dst=int)
+def codes_bufr_copy_data(msgid_src, msgid_dst):
+    """
+    @brief Copy data values from a BUFR message msgid_src to another message msgid_dst
+
+    Copies all the values in the data section that are present in the same position
+    in the data tree and with the same number of values to the output handle.
+
+    @param msgid_src     id of the message from which the data are copied
+    @param msgid_dst     id of the message to which the data are copied
+    @return id of new message
+    @exception GribInternalError
+    """
+    err, msgid_dst = _internal.grib_c_bufr_copy_data(msgid_src, msgid_dst)
+    GRIB_CHECK(err)
+    return msgid_dst
+
 
 @require(msgid_src=int)
 def grib_clone(msgid_src):
@@ -1098,6 +1122,7 @@ def grib_index_get_long(indexid, key):
     return tuple(result)
 
 
+ at require(indexid=int, key=str)
 def grib_index_get_string(indexid, key):
     """
     @brief Get the distinct values of the key in argument contained in the index.
@@ -1216,6 +1241,7 @@ def grib_index_select_string(indexid, key, value):
     GRIB_CHECK(_internal.grib_c_index_select_string(indexid, key, value))
 
 
+ at require(indexid=int)
 def grib_new_from_index(indexid):
     """
     @brief Create a new handle from an index after having selected the key values.
@@ -1305,6 +1331,7 @@ def grib_get_double_elements(gribid, key, indexes):
     return result
 
 
+ at require(gribid=int, key=str)
 def grib_get_elements(gribid, key, indexes):
     """
     @brief Retrieve the elements of the key array for the indexes specified in the input.
@@ -1355,7 +1382,7 @@ def grib_set_key_vals(gribid, key_vals):
     @exception         GribInternalError
     """
     if len(key_vals) == 0:
-        raise GribInternalError("Empty key/values argument")
+        raise errors.InvalidKeyValueError("Empty key/values argument")
     key_vals_str = ""
     if isinstance(key_vals, str):
         # Plain string. We need to do a DEEP copy so as not to change the original
@@ -1366,7 +1393,7 @@ def grib_set_key_vals(gribid, key_vals):
             if not isinstance(kv, str):
                 raise TypeError("Invalid list/tuple element type '%s'" % kv)
             if '=' not in str(kv):
-                raise GribInternalError("Invalid list/tuple element format '%s'" % kv)
+                raise errors.GribInternalError("Invalid list/tuple element format '%s'" % kv)
             if len(key_vals_str) > 0:
                 key_vals_str += ','
             key_vals_str += kv
@@ -1609,8 +1636,11 @@ def grib_set(msgid, key, value):
         grib_set_double(msgid, key, value)
     elif isinstance(value, str):
         grib_set_string(msgid, key, value)
+    #elif hasattr(value, "__iter__"):
+    #    # The value passed in is iterable; i.e. a list or array etc
+    #    grib_set_array(msgid, key, value)
     else:
-        raise GribInternalError("Invalid type of value when setting key '%s'." % key)
+        raise errors.GribInternalError("Invalid type of value when setting key '%s'." % key)
 
 
 @require(msgid=int, key=str)
@@ -1647,7 +1677,7 @@ def grib_set_array(msgid, key, value):
     elif isinstance(val0, str):
         grib_set_string_array(msgid, key, value)
     else:
-        raise GribInternalError("Invalid type of value when setting key '%s'." % key)
+        raise errors.GribInternalError("Invalid type of value when setting key '%s'." % key)
 
 
 @require(indexid=int, key=str)
@@ -1701,7 +1731,7 @@ def grib_index_select(indexid, key, value):
     elif isinstance(value, str):
         grib_index_select_string(indexid, key, value)
     else:
-        raise GribInternalError("Invalid type of value when setting key '%s'." % key)
+        raise errors.GribInternalError("Invalid type of value when setting key '%s'." % key)
 
 
 @require(indexid=int, filename=str)
diff --git a/python/gribapi_swig.i b/python/gribapi_swig.i
index f553b08..7571377 100644
--- a/python/gribapi_swig.i
+++ b/python/gribapi_swig.i
@@ -99,6 +99,8 @@ int grib_c_skip_duplicates(int* iterid);
 int grib_c_skip_read_only(int* iterid);
 int grib_c_skip_function(int* iterid);
 int grib_c_keys_iterator_rewind(int* iterid);
+int grib_c_bufr_copy_data(int* gid, int* INOUT);
+
 
 %cstring_bounded_output(char* name, 1024);
 int grib_c_keys_iterator_get_name(int* iterid, char* name, int len);
diff --git a/python/setup.py.in b/python/setup.py.in
index 990897c..09eed7d 100644
--- a/python/setup.py.in
+++ b/python/setup.py.in
@@ -38,15 +38,19 @@ if shared_libs == 'OFF':
 
     if @HAVE_LIBOPENJPEG@:
         openjpeg_lib_dir = '@OPENJPEG_LIB_DIR@'
+        openjpeg_libname = '@OJ_WITHOUT_LIB@'
         if openjpeg_lib_dir:
             add_attribute(library_dirs=openjpeg_lib_dir,
                           runtime_library_dirs=openjpeg_lib_dir)
-        add_attribute(libraries='openjp2')
+        add_attribute(libraries=openjpeg_libname)
 
     # assumes png is supplied by system paths -- may not be true
     if @HAVE_LIBPNG@:
         add_attribute(libraries='png')
 
+    if @HAVE_MEMFS@:
+        add_attribute(libraries='eccodes_memfs')
+
     if @HAVE_AEC@:
         aec_dir = '@AEC_DIR@'
         if aec_dir and aec_dir != 'system':
@@ -64,4 +68,4 @@ setup(name='eccodes',
       url='https://software.ecmwf.int/wiki/display/ECC/ecCodes+Home',
       download_url='https://software.ecmwf.int/wiki/display/ECC/Releases',
       ext_modules=[Extension('gribapi._gribapi_swig', **attdict)],
-      packages=['eccodes', 'gribapi'])
+      packages=['eccodes', 'eccodes.high_level', 'gribapi'])
diff --git a/python/swig_wrap_numpy.c b/python/swig_wrap_numpy.c
index ce2dc6b..cf1357b 100644
--- a/python/swig_wrap_numpy.c
+++ b/python/swig_wrap_numpy.c
@@ -6389,6 +6389,55 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_grib_c_bufr_copy_data(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  int *arg1 = (int *) 0 ;
+  int *arg2 = (int *) 0 ;
+  int temp1 ;
+  int res1 = 0 ;
+  int temp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  int result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:grib_c_bufr_copy_data",&obj0,&obj1)) SWIG_fail;
+  if (!(SWIG_IsOK((res1 = SWIG_ConvertPtr(obj0,SWIG_as_voidptrptr(&arg1),SWIGTYPE_p_int,0))))) {
+    int val; 
+    int ecode = SWIG_AsVal_int(obj0, &val);
+    if (!SWIG_IsOK(ecode)) {
+      SWIG_exception_fail(SWIG_ArgError(ecode), "in method '" "grib_c_bufr_copy_data" "', argument " "1"" of type '" "int""'");
+    }
+    temp1 = (int)(val);
+    arg1 = &temp1;
+    res1 = SWIG_AddTmpMask(ecode);
+  }
+  if (!(SWIG_IsOK((res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2),SWIGTYPE_p_int,0))))) {
+    int val; 
+    int ecode = SWIG_AsVal_int(obj1, &val);
+    if (!SWIG_IsOK(ecode)) {
+      SWIG_exception_fail(SWIG_ArgError(ecode), "in method '" "grib_c_bufr_copy_data" "', argument " "2"" of type '" "int""'");
+    }
+    temp2 = (int)(val);
+    arg2 = &temp2;
+    res2 = SWIG_AddTmpMask(ecode);
+  }
+  result = (int)grib_c_bufr_copy_data(arg1,arg2);
+  resultobj = SWIG_From_int((int)(result));
+  if (SWIG_IsTmpObj(res2)) {
+    resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_int((*arg2)));
+  } else {
+    int new_flags = SWIG_IsNewObj(res2) ? (SWIG_POINTER_OWN |  0 ) :  0 ;
+    resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg2), SWIGTYPE_p_int, new_flags));
+  }
+  if (SWIG_IsNewObj(res1)) free((char*)arg1);
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) free((char*)arg1);
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *_wrap_grib_c_keys_iterator_get_name(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   int *arg1 = (int *) 0 ;
@@ -8873,6 +8922,7 @@ static PyMethodDef SwigMethods[] = {
 	 { (char *)"grib_c_skip_read_only", _wrap_grib_c_skip_read_only, METH_VARARGS, NULL},
 	 { (char *)"grib_c_skip_function", _wrap_grib_c_skip_function, METH_VARARGS, NULL},
 	 { (char *)"grib_c_keys_iterator_rewind", _wrap_grib_c_keys_iterator_rewind, METH_VARARGS, NULL},
+	 { (char *)"grib_c_bufr_copy_data", _wrap_grib_c_bufr_copy_data, METH_VARARGS, NULL},
 	 { (char *)"grib_c_keys_iterator_get_name", _wrap_grib_c_keys_iterator_get_name, METH_VARARGS, NULL},
 	 { (char *)"grib_c_index_get_size_long", _wrap_grib_c_index_get_size_long, METH_VARARGS, NULL},
 	 { (char *)"grib_c_index_get_long", _wrap_grib_c_index_get_long, METH_VARARGS, NULL},
diff --git a/python/swig_wrap_numpy.py b/python/swig_wrap_numpy.py
index 7ddb569..26da723 100644
--- a/python/swig_wrap_numpy.py
+++ b/python/swig_wrap_numpy.py
@@ -470,6 +470,10 @@ def grib_c_keys_iterator_rewind(*args):
   return _gribapi_swig.grib_c_keys_iterator_rewind(*args)
 grib_c_keys_iterator_rewind = _gribapi_swig.grib_c_keys_iterator_rewind
 
+def grib_c_bufr_copy_data(*args):
+  return _gribapi_swig.grib_c_bufr_copy_data(*args)
+grib_c_bufr_copy_data = _gribapi_swig.grib_c_bufr_copy_data
+
 def grib_c_keys_iterator_get_name(*args):
   return _gribapi_swig.grib_c_keys_iterator_get_name(*args)
 grib_c_keys_iterator_get_name = _gribapi_swig.grib_c_keys_iterator_get_name
diff --git a/share/ecbuild/toolchains/ecmwf-XC30-Cray.cmake b/share/ecbuild/toolchains/ecmwf-XC30-Cray.cmake
index c6947e8..e3ef29c 100644
--- a/share/ecbuild/toolchains/ecmwf-XC30-Cray.cmake
+++ b/share/ecbuild/toolchains/ecmwf-XC30-Cray.cmake
@@ -35,7 +35,15 @@ set( OMPSTUBS_Fortran_FLAGS  "-hnoomp" )
 # LINK FLAGS
 ####################################################################
 
-set( ECBUILD_C_LINK_FLAGS        "-Wl,-Map,loadmap -Wl,--as-needed -Wl,--eh-frame-hdr -Ktrap=fp" )
-set( ECBUILD_CXX_LINK_FLAGS      "-Wl,-Map,loadmap -Wl,--as-needed -Wl,--eh-frame-hdr -Ktrap=fp" )
-set( ECBUILD_Fortran_LINK_FLAGS  "-Wl,-Map,loadmap -Wl,--as-needed -Wl,--eh-frame-hdr -Ktrap=fp" )
+set( ECBUILD_SHARED_LINKER_FLAGS "-Wl,--eh-frame-hdr -Ktrap=fp" )
+set( ECBUILD_MODULE_LINKER_FLAGS "-Wl,--eh-frame-hdr -Ktrap=fp -Wl,-Map,loadmap" )
+set( ECBUILD_EXE_LINKER_FLAGS    "-Wl,--eh-frame-hdr -Ktrap=fp -Wl,-Map,loadmap -Wl,--as-needed" )
 set( ECBUILD_CXX_IMPLICIT_LINK_LIBRARIES "$ENV{CC_X86_64}/lib/x86-64/libcray-c++-rts.so" CACHE STRING "" )
+
+####################################################################
+# LIBRARIES
+####################################################################
+
+# Don't search for LAPACK as it is provided by the cray-libsci module which is
+# loaded by default
+set( LAPACK_FOUND $ENV{CRAY_LIBSCI_PREFIX_DIR} )
diff --git a/share/ecbuild/toolchains/ecmwf-XC30-GNU.cmake b/share/ecbuild/toolchains/ecmwf-XC30-GNU.cmake
index 3ea294f..84dbd7b 100644
--- a/share/ecbuild/toolchains/ecmwf-XC30-GNU.cmake
+++ b/share/ecbuild/toolchains/ecmwf-XC30-GNU.cmake
@@ -39,6 +39,14 @@ set( ECBUILD_Fortran_FLAGS_DEBUG  "-ffree-line-length-none -O0 -g -fcheck=bounds
 # LINK FLAGS
 ####################################################################
 
-set( ECBUILD_C_LINK_FLAGS        "-Wl,-Map,load.map -Wl,--as-needed -Wl,--eh-frame-hdr" )
-set( ECBUILD_CXX_LINK_FLAGS      "-Wl,-Map,load.map -Wl,--as-needed -Wl,--eh-frame-hdr" )
-set( ECBUILD_Fortran_LINK_FLAGS  "-Wl,-Map,load.map -Wl,--as-needed -Wl,--eh-frame-hdr" )
+set( ECBUILD_SHARED_LINKER_FLAGS "-Wl,--eh-frame-hdr" )
+set( ECBUILD_MODULE_LINKER_FLAGS "-Wl,--eh-frame-hdr -Wl,-Map,loadmap" )
+set( ECBUILD_EXE_LINKER_FLAGS    "-Wl,--eh-frame-hdr -Wl,-Map,loadmap -Wl,--as-needed" )
+
+####################################################################
+# LIBRARIES
+####################################################################
+
+# Don't search for LAPACK as it is provided by the cray-libsci module which is
+# loaded by default
+set( LAPACK_FOUND $ENV{CRAY_LIBSCI_PREFIX_DIR} )
diff --git a/share/ecbuild/toolchains/ecmwf-XC30-Intel.cmake b/share/ecbuild/toolchains/ecmwf-XC30-Intel.cmake
index d5fdb32..a890886 100644
--- a/share/ecbuild/toolchains/ecmwf-XC30-Intel.cmake
+++ b/share/ecbuild/toolchains/ecmwf-XC30-Intel.cmake
@@ -60,6 +60,14 @@ set( ECBUILD_Fortran_FLAGS_DEBUG  "-O0 -g -traceback -warn all -heap-arrays -fpe
 # LINK FLAGS
 ####################################################################
 
-set( ECBUILD_C_LINK_FLAGS        "-Wl,-Map,load.map -Wl,--as-needed -Wl,--eh-frame-hdr" )
-set( ECBUILD_CXX_LINK_FLAGS      "-Wl,-Map,load.map -Wl,--as-needed -Wl,--eh-frame-hdr" )
-set( ECBUILD_Fortran_LINK_FLAGS  "-Wl,-Map,load.map -Wl,--as-needed -Wl,--eh-frame-hdr" )
+set( ECBUILD_SHARED_LINKER_FLAGS "-Wl,--eh-frame-hdr" )
+set( ECBUILD_MODULE_LINKER_FLAGS "-Wl,--eh-frame-hdr -Wl,-Map,loadmap" )
+set( ECBUILD_EXE_LINKER_FLAGS    "-Wl,--eh-frame-hdr -Wl,-Map,loadmap -Wl,--as-needed" )
+
+####################################################################
+# LIBRARIES
+####################################################################
+
+# Don't search for LAPACK as it is provided by the cray-libsci module which is
+# loaded by default
+set( LAPACK_FOUND $ENV{CRAY_LIBSCI_PREFIX_DIR} )
diff --git a/show_compile.sh b/show_compile.sh
index eb3735e..dba4805 100755
--- a/show_compile.sh
+++ b/show_compile.sh
@@ -1,6 +1,6 @@
 #!/bin/sh
 
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index a60ac9e..ae28cd5 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,5 +1,5 @@
 #
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -284,7 +284,6 @@ list( APPEND grib_api_srcs
     grib_dumper_class_bufr_decode_fortran.c
     grib_dumper_class_bufr_decode_python.c
     grib_dumper_class_json.c
-    grib_dumper_class_xml.c
     grib_dumper_class_grib_encode_C.c
     grib_dumper_class_wmo.c
     grib_dumper_class.c
@@ -301,6 +300,7 @@ list( APPEND grib_api_srcs
     grib_itrie.c
     grib_rules.c
     grib_keys_iterator.c
+    bufr_keys_iterator.c
     grib_parse_utils.c
     grib_query.c
     grib_scaling.c
@@ -346,9 +346,11 @@ list( APPEND grib_api_srcs
     grib_iterator_class_gen.c
     grib_iterator_class_latlon.c
     grib_iterator_class_regular.c
+    grib_iterator_class_space_view.c
     grib_expression.c
     grib_util.c
-    compile.c
+    bufr_util.c
+    string_util.c
     functions.c
     grib_accessor_class.h
     grib_accessor_factory.h
@@ -383,6 +385,7 @@ list( APPEND grib_api_srcs
     grib_accessor_class_uint64_little_endian.c
     grib_accessor_class_uint8.c
     grib_accessor_class_blob.c
+    grib_optimize_decimal_factor.c
     eccodes_windef.h
     # We ship our own generated lex/yacc C files
     grib_yacc.c  grib_lex.c
diff --git a/src/Makefile.am b/src/Makefile.am
index 0244a06..266f1c8 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -299,7 +299,6 @@ libeccodes_la_prototypes= \
 	grib_dumper_class_bufr_decode_fortran.c \
 	grib_dumper_class_bufr_decode_python.c \
 	grib_dumper_class_json.c \
-	grib_dumper_class_xml.c \
 	grib_dumper_class_grib_encode_C.c \
 	grib_dumper_class_wmo.c \
 	grib_dumper_class.c \
@@ -316,6 +315,7 @@ libeccodes_la_prototypes= \
 	grib_itrie.c \
 	grib_rules.c \
 	grib_keys_iterator.c \
+	bufr_keys_iterator.c \
 	grib_parse_utils.c \
 	grib_query.c \
 	grib_scaling.c \
@@ -361,11 +361,14 @@ libeccodes_la_prototypes= \
 	grib_iterator_class_gen.c \
 	grib_iterator_class_latlon.c \
 	grib_iterator_class_regular.c \
+	grib_iterator_class_space_view.c \
 	grib_expression.c \
 	grib_util.c \
-	compile.c \
+	bufr_util.c \
+	string_util.c \
 	functions.c \
 	codes_memfs.c \
+	grib_optimize_decimal_factor.c \
 	grib_api_version.c
 
 libeccodes_extra_prototypes = grib_bits_any_endian.c grib_bits_any_endian_simple.c
diff --git a/src/action.c b/src/action.c
index c59fee6..7405d22 100644
--- a/src/action.c
+++ b/src/action.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -201,16 +201,3 @@ void grib_xref_action_branch(FILE* out,grib_action* a,const char* path)
     }
 }
 
-void grib_compile(grib_action* a, grib_compiler* compiler)
-{
-    grib_action_class *c = a->cclass;
-    init(c);
-    if(c->compile) {
-        c->compile(a,compiler);
-    }
-    else 
-    {
-        fprintf(stderr, "NO COMPILE METHOD '%s'\n", c->name);
-        Assert(0);
-    }
-}
diff --git a/src/action.class b/src/action.class
index c7716ae..5f82e6a 100644
--- a/src/action.class
+++ b/src/action.class
@@ -2,7 +2,6 @@ static void init_class      (grib_action_class*);
 static void init            (grib_action* d);
 static void dump            (grib_action* d, FILE*,int);
 static void xref            (grib_action* d, FILE* f,const char* path);
-static void compile         (grib_action* a, grib_compiler* compiler);
 static void destroy         (grib_context*,grib_action*);
 static int create_accessor(grib_section*,grib_action*,grib_loader*);
 static int notify_change(grib_action* a, grib_accessor* observer,grib_accessor* observed);
@@ -34,7 +33,6 @@ static grib_action_class _grib_action_class_NAME = {
     &notify_change,                            /* notify_change */
     &reparse,                            /* reparse */
     &execute,                            /* execute */
-    &compile,                            /* compile */
 };
 
 grib_action_class* grib_action_class_NAME = &_grib_action_class_NAME;
diff --git a/src/action_class_alias.c b/src/action_class_alias.c
index 46a068b..652f06b 100644
--- a/src/action_class_alias.c
+++ b/src/action_class_alias.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -22,7 +22,6 @@
    IMPLEMENTS = create_accessor
    IMPLEMENTS = dump;xref
    IMPLEMENTS = destroy
-   IMPLEMENTS = compile
    MEMBERS    = char* target
    END_CLASS_DEF
 
@@ -41,7 +40,6 @@ or edit "action.class" and rerun ./make_class.pl
 static void init_class      (grib_action_class*);
 static void dump            (grib_action* d, FILE*,int);
 static void xref            (grib_action* d, FILE* f,const char* path);
-static void compile         (grib_action* a, grib_compiler* compiler);
 static void destroy         (grib_context*,grib_action*);
 static int create_accessor(grib_section*,grib_action*,grib_loader*);
 
@@ -70,7 +68,6 @@ static grib_action_class _grib_action_class_alias = {
     0,                            /* notify_change */
     0,                            /* reparse */
     0,                            /* execute */
-    &compile,                            /* compile */
 };
 
 grib_action_class* grib_action_class_alias = &_grib_action_class_alias;
@@ -102,30 +99,6 @@ grib_action* grib_action_create_alias(grib_context* context, const char* name, c
     return act;
 }
 
-static void compile(grib_action* act, grib_compiler *compiler)
-{
-    grib_action_alias* a  = (grib_action_alias*)act;
-    fprintf(compiler->out,"%s = grib_action_create_alias(ctx,",compiler->var);
-    fprintf(compiler->out,"\"%s\",",act->name);
-    if(a->target) {
-        fprintf(compiler->out,"\"%s\",",a->target);
-    }
-    else
-    {
-        fprintf(compiler->out,"NULL,");
-    }
-    if(act->name_space) {
-        fprintf(compiler->out,"\"%s\",",act->name_space);
-    }
-    else
-    {
-        fprintf(compiler->out,"NULL,");
-    }
-    grib_compile_flags(compiler, act->flags);
-    fprintf(compiler->out,");");
-    fprintf(compiler->out,"\n");
-}
-
 static int same(const char* a,const char* b) 
 {
     if(a == b) return 1;
@@ -184,7 +157,6 @@ static int create_accessor( grib_section* p, grib_action* act,grib_loader *h)
         return GRIB_INTERNAL_ERROR;
     }
 
-    /* if(self->target == NULL || (act->flags & GRIB_ACCESSOR_FLAG_OVERRIDE)) */
     y = grib_find_accessor_fast(p->h,act->name);
 
     /* delete old alias if already defined */
diff --git a/src/action_class_assert.c b/src/action_class_assert.c
index e7278ec..c10d070 100644
--- a/src/action_class_assert.c
+++ b/src/action_class_assert.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -68,7 +68,6 @@ static grib_action_class _grib_action_class_assert = {
     &notify_change,                            /* notify_change */
     0,                            /* reparse */
     &execute,                            /* execute */
-    0,                            /* compile */
 };
 
 grib_action_class* grib_action_class_assert = &_grib_action_class_assert;
diff --git a/src/action_class_close.c b/src/action_class_close.c
index cde82fe..e2ee9d6 100644
--- a/src/action_class_close.c
+++ b/src/action_class_close.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -61,7 +61,6 @@ static grib_action_class _grib_action_class_close = {
     0,                            /* notify_change */
     0,                            /* reparse */
     &execute,                            /* execute */
-    0,                            /* compile */
 };
 
 grib_action_class* grib_action_class_close = &_grib_action_class_close;
diff --git a/src/action_class_concept.c b/src/action_class_concept.c
index ec0faac..a60a8e9 100644
--- a/src/action_class_concept.c
+++ b/src/action_class_concept.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -9,8 +9,8 @@
  */
 
 /***************************************************************************
- *   Jean Baptiste Filippi - 01.11.2005                                                           *
- *   Enrico  Fucile
+ *   Jean Baptiste Filippi - 01.11.2005                                    *
+ *   Enrico  Fucile                                                        *
  *                                                                         *
  ***************************************************************************/
 #include "grib_api_internal.h"
@@ -78,7 +78,6 @@ static grib_action_class _grib_action_class_concept = {
     0,                            /* notify_change */
     0,                            /* reparse */
     0,                            /* execute */
-    0,                            /* compile */
 };
 
 grib_action_class* grib_action_class_concept = &_grib_action_class_concept;
@@ -90,7 +89,6 @@ static void init_class(grib_action_class* c)
 	c->notify_change	=	(*(c->super))->notify_change;
 	c->reparse	=	(*(c->super))->reparse;
 	c->execute	=	(*(c->super))->execute;
-	c->compile	=	(*(c->super))->compile;
 }
 /* END_CLASS_IMP */
 
diff --git a/src/action_class_gen.c b/src/action_class_gen.c
index 3eb6771..9d08465 100644
--- a/src/action_class_gen.c
+++ b/src/action_class_gen.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -23,7 +23,6 @@
    IMPLEMENTS = dump;xref
    IMPLEMENTS = destroy
    IMPLEMENTS = notify_change
-   IMPLEMENTS = compile
    MEMBERS    = long            len
    MEMBERS    = grib_arguments* params
    END_CLASS_DEF
@@ -43,7 +42,6 @@ or edit "action.class" and rerun ./make_class.pl
 static void init_class      (grib_action_class*);
 static void dump            (grib_action* d, FILE*,int);
 static void xref            (grib_action* d, FILE* f,const char* path);
-static void compile         (grib_action* a, grib_compiler* compiler);
 static void destroy         (grib_context*,grib_action*);
 static int create_accessor(grib_section*,grib_action*,grib_loader*);
 static int notify_change(grib_action* a, grib_accessor* observer,grib_accessor* observed);
@@ -74,7 +72,6 @@ static grib_action_class _grib_action_class_gen = {
     &notify_change,                            /* notify_change */
     0,                            /* reparse */
     0,                            /* execute */
-    &compile,                            /* compile */
 };
 
 grib_action_class* grib_action_class_gen = &_grib_action_class_gen;
@@ -142,7 +139,6 @@ static void xref( grib_action* act, FILE* f,const char *path)
     F(GRIB_ACCESSOR_FLAG_CAN_BE_MISSING);
     F(GRIB_ACCESSOR_FLAG_HIDDEN);
     F(GRIB_ACCESSOR_FLAG_CONSTRAINT);
-    F(GRIB_ACCESSOR_FLAG_OVERRIDE);
     F(GRIB_ACCESSOR_FLAG_NO_COPY);
     F(GRIB_ACCESSOR_FLAG_COPY_OK);
     F(GRIB_ACCESSOR_FLAG_FUNCTION);
@@ -208,33 +204,3 @@ static void destroy(grib_context* context,grib_action* act)
         grib_context_free_persistent(context, act->set);
 
 }
-
-static void compile(grib_action* act, grib_compiler* compiler)
-{
-    grib_action_gen* a  = (grib_action_gen*)act;
-    fprintf(compiler->out,"%s = grib_action_create_gen(ctx,",compiler->var);
-    fprintf(compiler->out,"\"%s\",",act->name);
-    fprintf(compiler->out,"\"%s\",",act->op);
-    fprintf(compiler->out,"%ld,",a->len);
-    grib_compile_arguments(a->params,        compiler);
-    fprintf(compiler->out,",");
-    grib_compile_arguments(act->default_value,        compiler);
-    fprintf(compiler->out,",");
-    grib_compile_flags(compiler,act->flags);
-    fprintf(compiler->out,",");
-    if(act->name_space) {
-        fprintf(compiler->out,"\"%s\",",act->name_space);
-    }
-    else
-    {
-        fprintf(compiler->out,"NULL,");
-    }    
-    if(act->set) {
-        fprintf(compiler->out,"\"%s\");",act->set);
-    }
-    else
-    {
-        fprintf(compiler->out,"NULL);");
-    }
-    fprintf(compiler->out,"\n");
-}
diff --git a/src/action_class_hash_array.c b/src/action_class_hash_array.c
index 79649d9..676321f 100644
--- a/src/action_class_hash_array.c
+++ b/src/action_class_hash_array.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -9,7 +9,7 @@
  */
 
 /***************************************************************************
- *   Enrico  Fucile 2012
+ *   Enrico  Fucile 2012                                                   *
  *                                                                         *
  ***************************************************************************/
 #include "grib_api_internal.h"
@@ -79,7 +79,6 @@ static grib_action_class _grib_action_class_hash_array = {
     0,                            /* notify_change */
     0,                            /* reparse */
     0,                            /* execute */
-    0,                            /* compile */
 };
 
 grib_action_class* grib_action_class_hash_array = &_grib_action_class_hash_array;
@@ -91,10 +90,36 @@ static void init_class(grib_action_class* c)
 	c->notify_change	=	(*(c->super))->notify_change;
 	c->reparse	=	(*(c->super))->reparse;
 	c->execute	=	(*(c->super))->execute;
-	c->compile	=	(*(c->super))->compile;
 }
 /* END_CLASS_IMP */
 
+#if GRIB_PTHREADS
+static pthread_once_t once  = PTHREAD_ONCE_INIT;
+static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+
+static void init() {
+    pthread_mutexattr_t attr;
+    pthread_mutexattr_init(&attr);
+    pthread_mutexattr_settype(&attr,PTHREAD_MUTEX_RECURSIVE);
+    pthread_mutex_init(&mutex,&attr);
+    pthread_mutexattr_destroy(&attr);
+}
+#elif GRIB_OMP_THREADS
+static int once = 0;
+static omp_nest_lock_t mutex;
+
+static void init()
+{
+    GRIB_OMP_CRITICAL(lock_action_class_hash_array_c)
+    {
+        if (once == 0)
+        {
+            omp_init_nest_lock(&mutex);
+            once = 1;
+        }
+    }
+}
+#endif
 
 grib_action* grib_action_create_hash_array( grib_context* context,
         const char* name,
@@ -186,7 +211,7 @@ static void destroy(grib_context* context,grib_action* act)
     grib_context_free_persistent(context, self->basename);
 }
 
-grib_hash_array_value* get_hash_array(grib_handle* h,grib_action* a)
+static grib_hash_array_value* get_hash_array_impl(grib_handle* h,grib_action* a)
 {
     char buf[1024]={0,};
     char master[1024]={0,};
@@ -258,7 +283,7 @@ grib_hash_array_value* get_hash_array(grib_handle* h,grib_action* a)
     } else if (full) {
         c=grib_parse_hash_array_file(context,full);
     } else {
-        grib_context_log(context,GRIB_LOG_FATAL,
+        grib_context_log(context,GRIB_LOG_ERROR,
                 "unable to find definition file %s in %s:%s:%s\nDefinition files path=\"%s\"",
                 self->basename,master,ecmf,local,context->grib_definition_files_path);
         return NULL;
@@ -280,3 +305,15 @@ grib_hash_array_value* get_hash_array(grib_handle* h,grib_action* a)
 
     return h->context->hash_array[id];
 }
+
+grib_hash_array_value* get_hash_array(grib_handle* h,grib_action* a)
+{
+    grib_hash_array_value* result = NULL;
+    GRIB_MUTEX_INIT_ONCE(&once,&init);
+    GRIB_MUTEX_LOCK(&mutex);
+
+    result = get_hash_array_impl(h, a);
+
+    GRIB_MUTEX_UNLOCK(&mutex);
+    return result;
+}
diff --git a/src/action_class_if.c b/src/action_class_if.c
index 499877b..594f682 100644
--- a/src/action_class_if.c
+++ b/src/action_class_if.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -24,7 +24,6 @@
    IMPLEMENTS = dump
    IMPLEMENTS = destroy
    IMPLEMENTS = xref   
-   IMPLEMENTS = compile
    IMPLEMENTS = reparse;execute
    MEMBERS    = grib_expression *expression
    MEMBERS    = grib_action     *block_true
@@ -47,7 +46,6 @@ or edit "action.class" and rerun ./make_class.pl
 static void init_class      (grib_action_class*);
 static void dump            (grib_action* d, FILE*,int);
 static void xref            (grib_action* d, FILE* f,const char* path);
-static void compile         (grib_action* a, grib_compiler* compiler);
 static void destroy         (grib_context*,grib_action*);
 static int create_accessor(grib_section*,grib_action*,grib_loader*);
 static grib_action* reparse(grib_action* a,grib_accessor* acc,int *doit);
@@ -83,7 +81,6 @@ static grib_action_class _grib_action_class_if = {
     0,                            /* notify_change */
     &reparse,                            /* reparse */
     &execute,                            /* execute */
-    &compile,                            /* compile */
 };
 
 grib_action_class* grib_action_class_if = &_grib_action_class_if;
@@ -132,27 +129,6 @@ grib_action* grib_action_create_if( grib_context* context,
     return act;
 }
 
-static void compile(grib_action* act, grib_compiler *compiler)
-{
-    grib_action_if* a  = (grib_action_if*)act;
-    char t[80];
-    char f[80];
-
-    if(a->block_true)
-        grib_compile_action_branch(a->block_true, compiler,t); 
-    else
-        strcpy(t,"NULL");
-
-    if(a->block_false)
-        grib_compile_action_branch(a->block_false, compiler,f);
-    else
-        strcpy(f,"NULL");
-
-    fprintf(compiler->out,"%s = grib_action_create_if(ctx,",compiler->var);
-    grib_compile_expression(a->expression, compiler);
-    fprintf(compiler->out,",%s,%s,%d);\n", t,f,a->transient);
-}
-
 static int create_accessor( grib_section* p, grib_action* act, grib_loader *h)
 {
     grib_action_if* a = (grib_action_if*)act;
diff --git a/src/action_class_list.c b/src/action_class_list.c
index 1390599..dae2850 100644
--- a/src/action_class_list.c
+++ b/src/action_class_list.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -21,7 +21,7 @@
    CLASS      = action
    SUPER      = action_class_section
    IMPLEMENTS = create_accessor
-   IMPLEMENTS = dump;compile
+   IMPLEMENTS = dump
    IMPLEMENTS = destroy
    IMPLEMENTS = reparse
    MEMBERS    = grib_expression *expression
@@ -42,7 +42,6 @@ or edit "action.class" and rerun ./make_class.pl
 
 static void init_class      (grib_action_class*);
 static void dump            (grib_action* d, FILE*,int);
-static void compile         (grib_action* a, grib_compiler* compiler);
 static void destroy         (grib_context*,grib_action*);
 static int create_accessor(grib_section*,grib_action*,grib_loader*);
 static grib_action* reparse(grib_action* a,grib_accessor* acc,int *doit);
@@ -75,7 +74,6 @@ static grib_action_class _grib_action_class_list = {
     0,                            /* notify_change */
     &reparse,                            /* reparse */
     0,                            /* execute */
-    &compile,                            /* compile */
 };
 
 grib_action_class* grib_action_class_list = &_grib_action_class_list;
@@ -160,22 +158,6 @@ grib_action* grib_action_create_list( grib_context* context, const char* name, g
 	return act;
 }
 
-static void compile(grib_action* act, grib_compiler *compiler)
-{
-    grib_action_list* a  = (grib_action_list*)act;
-    char b[80];
-
-    if(a->block_list)
-        grib_compile_action_branch(a->block_list, compiler,b); 
-    else
-        strcpy(b,"NULL");
-
-    fprintf(compiler->out,"%s = grib_action_create_list(ctx,",compiler->var);
-    fprintf(compiler->out,"\"%s\",", act->name);
-    grib_compile_expression(a->expression, compiler);
-    fprintf(compiler->out,",%s);\n",b);
-}
-
 static grib_action* reparse(grib_action* a,grib_accessor* acc,int *doit)
 {
 	grib_action_list* self = ( grib_action_list*)a;
diff --git a/src/action_class_meta.c b/src/action_class_meta.c
index 49356db..6184589 100644
--- a/src/action_class_meta.c
+++ b/src/action_class_meta.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -68,7 +68,6 @@ static grib_action_class _grib_action_class_meta = {
     0,                            /* notify_change */
     0,                            /* reparse */
     &execute,                            /* execute */
-    0,                            /* compile */
 };
 
 grib_action_class* grib_action_class_meta = &_grib_action_class_meta;
@@ -79,7 +78,6 @@ static void init_class(grib_action_class* c)
 	c->create_accessor	=	(*(c->super))->create_accessor;
 	c->notify_change	=	(*(c->super))->notify_change;
 	c->reparse	=	(*(c->super))->reparse;
-	c->compile	=	(*(c->super))->compile;
 }
 /* END_CLASS_IMP */
 
diff --git a/src/action_class_modify.c b/src/action_class_modify.c
index b908042..6a86192 100644
--- a/src/action_class_modify.c
+++ b/src/action_class_modify.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -18,7 +18,7 @@
 
    START_CLASS_DEF
    CLASS      = action
-   IMPLEMENTS = dump;xref;compile
+   IMPLEMENTS = dump;xref
    IMPLEMENTS = create_accessor
    IMPLEMENTS = destroy
    MEMBERS    = long flags
@@ -40,7 +40,6 @@ or edit "action.class" and rerun ./make_class.pl
 static void init_class      (grib_action_class*);
 static void dump            (grib_action* d, FILE*,int);
 static void xref            (grib_action* d, FILE* f,const char* path);
-static void compile         (grib_action* a, grib_compiler* compiler);
 static void destroy         (grib_context*,grib_action*);
 static int create_accessor(grib_section*,grib_action*,grib_loader*);
 
@@ -70,7 +69,6 @@ static grib_action_class _grib_action_class_modify = {
     0,                            /* notify_change */
     0,                            /* reparse */
     0,                            /* execute */
-    &compile,                            /* compile */
 };
 
 grib_action_class* grib_action_class_modify = &_grib_action_class_modify;
@@ -103,15 +101,6 @@ grib_action* grib_action_create_modify( grib_context* context,
 	return act;
 }
 
-static void compile(grib_action* act, grib_compiler *compiler)
-{
-    fprintf(compiler->out,"%s = grib_action_create_modify(ctx,",compiler->var);
-    fprintf(compiler->out,"\"%s\",",act->name);
-    grib_compile_flags(compiler, act->flags);
-    fprintf(compiler->out,");");
-    fprintf(compiler->out,"\n");
-}
-
 static void dump(grib_action* act, FILE* f, int lvl)
 {
 }
diff --git a/src/action_class_noop.c b/src/action_class_noop.c
index 110427b..16b4b6d 100644
--- a/src/action_class_noop.c
+++ b/src/action_class_noop.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -18,7 +18,7 @@
 
    START_CLASS_DEF
    CLASS      = action
-   IMPLEMENTS = dump;destroy;xref;execute;compile
+   IMPLEMENTS = dump;destroy;xref;execute
    END_CLASS_DEF
 
  */
@@ -36,7 +36,6 @@ or edit "action.class" and rerun ./make_class.pl
 static void init_class      (grib_action_class*);
 static void dump            (grib_action* d, FILE*,int);
 static void xref            (grib_action* d, FILE* f,const char* path);
-static void compile         (grib_action* a, grib_compiler* compiler);
 static void destroy         (grib_context*,grib_action*);
 static int execute(grib_action* a,grib_handle* h);
 
@@ -64,7 +63,6 @@ static grib_action_class _grib_action_class_noop = {
     0,                            /* notify_change */
     0,                            /* reparse */
     &execute,                            /* execute */
-    &compile,                            /* compile */
 };
 
 grib_action_class* grib_action_class_noop = &_grib_action_class_noop;
@@ -94,14 +92,6 @@ grib_action* grib_action_create_noop( grib_context* context,const char* fname)
     return act;
 }
 
-static void compile(grib_action* act, grib_compiler *compiler)
-{
-    fprintf(compiler->out,"%s = grib_action_create_noop(ctx,",compiler->var);
-    fprintf(compiler->out,"\"%s\"",act->name);
-    fprintf(compiler->out,");");
-    fprintf(compiler->out,"\n");
-}
-
 static void dump(grib_action* act, FILE* f, int lvl)
 {
 }
diff --git a/src/action_class_print.c b/src/action_class_print.c
index e82526a..e6083d7 100644
--- a/src/action_class_print.c
+++ b/src/action_class_print.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -67,7 +67,6 @@ static grib_action_class _grib_action_class_print = {
     0,                            /* notify_change */
     0,                            /* reparse */
     &execute,                            /* execute */
-    0,                            /* compile */
 };
 
 grib_action_class* grib_action_class_print = &_grib_action_class_print;
diff --git a/src/action_class_put.c b/src/action_class_put.c
index 6bc6d9d..561d25d 100644
--- a/src/action_class_put.c
+++ b/src/action_class_put.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -67,7 +67,6 @@ static grib_action_class _grib_action_class_put = {
     0,                            /* notify_change */
     0,                            /* reparse */
     0,                            /* execute */
-    0,                            /* compile */
 };
 
 grib_action_class* grib_action_class_put = &_grib_action_class_put;
diff --git a/src/action_class_remove.c b/src/action_class_remove.c
index 028b93d..79cfd50 100644
--- a/src/action_class_remove.c
+++ b/src/action_class_remove.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -20,7 +20,7 @@
    CLASS      = action
    IMPLEMENTS = create_accessor
    IMPLEMENTS = dump
-   IMPLEMENTS = destroy; xref; compile
+   IMPLEMENTS = destroy; xref
    MEMBERS    = grib_arguments* args
    END_CLASS_DEF
 
@@ -39,7 +39,6 @@ or edit "action.class" and rerun ./make_class.pl
 static void init_class      (grib_action_class*);
 static void dump            (grib_action* d, FILE*,int);
 static void xref            (grib_action* d, FILE* f,const char* path);
-static void compile         (grib_action* a, grib_compiler* compiler);
 static void destroy         (grib_context*,grib_action*);
 static int create_accessor(grib_section*,grib_action*,grib_loader*);
 
@@ -68,7 +67,6 @@ static grib_action_class _grib_action_class_remove = {
     0,                            /* notify_change */
     0,                            /* reparse */
     0,                            /* execute */
-    &compile,                            /* compile */
 };
 
 grib_action_class* grib_action_class_remove = &_grib_action_class_remove;
@@ -93,14 +91,6 @@ grib_action* grib_action_create_remove( grib_context* context, grib_arguments *a
     return act;
 }
 
-static void compile(grib_action* act, grib_compiler* compiler)
-{
-    grib_action_remove* a  = (grib_action_remove*)act;
-    fprintf(compiler->out,"%s = grib_action_create_remove(ctx,",compiler->var);
-    grib_compile_arguments(a->args,compiler);
-    fprintf(compiler->out,");\n");
-}
-
 static void remove_accessor(grib_accessor *a)
 {
     grib_section* s = NULL;
diff --git a/src/action_class_rename.c b/src/action_class_rename.c
index 46a386f..877ff85 100644
--- a/src/action_class_rename.c
+++ b/src/action_class_rename.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -20,7 +20,7 @@
    CLASS      = action
    IMPLEMENTS = create_accessor
    IMPLEMENTS = dump
-   IMPLEMENTS = destroy; xref; compile
+   IMPLEMENTS = destroy; xref
    MEMBERS    = char* the_old
    MEMBERS    = char* the_new
    END_CLASS_DEF
@@ -40,7 +40,6 @@ or edit "action.class" and rerun ./make_class.pl
 static void init_class      (grib_action_class*);
 static void dump            (grib_action* d, FILE*,int);
 static void xref            (grib_action* d, FILE* f,const char* path);
-static void compile         (grib_action* a, grib_compiler* compiler);
 static void destroy         (grib_context*,grib_action*);
 static int create_accessor(grib_section*,grib_action*,grib_loader*);
 
@@ -70,7 +69,6 @@ static grib_action_class _grib_action_class_rename = {
     0,                            /* notify_change */
     0,                            /* reparse */
     0,                            /* execute */
-    &compile,                            /* compile */
 };
 
 grib_action_class* grib_action_class_rename = &_grib_action_class_rename;
@@ -96,11 +94,6 @@ grib_action* grib_action_create_rename( grib_context* context, char* the_old, ch
     return act;
 }
 
-static void compile(grib_action* act, grib_compiler* compiler)
-{
-    Assert(0);
-}
-
 static void rename_accessor(grib_accessor *a,char* name)
 {
     int id;
diff --git a/src/action_class_section.c b/src/action_class_section.c
index dabed33..bbcfb9e 100644
--- a/src/action_class_section.c
+++ b/src/action_class_section.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -66,7 +66,6 @@ static grib_action_class _grib_action_class_section = {
     &notify_change,                            /* notify_change */
     &reparse,                            /* reparse */
     0,                            /* execute */
-    0,                            /* compile */
 };
 
 grib_action_class* grib_action_class_section = &_grib_action_class_section;
@@ -104,7 +103,7 @@ static int notify_change(grib_action* act, grib_accessor * notified,
     grib_handle* tmp_handle;
     int doit = 0;
 
-    grib_action* la        = NULL;
+    grib_action* la = NULL;
 
     if (h->context->debug > 0) {
         char debug_str[1024] = {0,};
@@ -168,15 +167,15 @@ static int notify_change(grib_action* act, grib_accessor * notified,
     h->kid = tmp_handle;
     /* printf("tmp_handle- main %p %p\n",(void*)tmp_handle,(void*)h); */
 
-    grib_context_log(h->context,GRIB_LOG_DEBUG,"------------- CREATE TMP BLOCK ", act->name, notified->name);
+    grib_context_log(h->context,GRIB_LOG_DEBUG,"------------- CREATE TMP BLOCK act=%s notified=%s", act->name, notified->name);
     tmp_handle->root  = grib_section_create(tmp_handle,NULL);
 
     tmp_handle->use_trie=1;
 
     err=grib_create_accessor(tmp_handle->root, act, &loader);
     if (err) {
-        if (err == GRIB_NOT_FOUND) {
-            /* FIXME: Allow this error. Needed when changing some packingTypes */
+        if (err == GRIB_NOT_FOUND && strcmp(act->name, "dataValues")==0) {
+            /* FIXME: Allow this error. Needed when changing some packingTypes e.g. CCSDS to Simple */
             err = GRIB_SUCCESS;
         } else {
             return err;
diff --git a/src/action_class_set.c b/src/action_class_set.c
index 0374ef3..53b41a9 100644
--- a/src/action_class_set.c
+++ b/src/action_class_set.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -17,7 +17,7 @@
 
    START_CLASS_DEF
    CLASS      = action
-   IMPLEMENTS = dump;xref;compile
+   IMPLEMENTS = dump;xref
    IMPLEMENTS = destroy;execute
    MEMBERS    = grib_expression *expression
    MEMBERS    = char *name
@@ -39,7 +39,6 @@ or edit "action.class" and rerun ./make_class.pl
 static void init_class      (grib_action_class*);
 static void dump            (grib_action* d, FILE*,int);
 static void xref            (grib_action* d, FILE* f,const char* path);
-static void compile         (grib_action* a, grib_compiler* compiler);
 static void destroy         (grib_context*,grib_action*);
 static int execute(grib_action* a,grib_handle* h);
 
@@ -70,7 +69,6 @@ static grib_action_class _grib_action_class_set = {
     0,                            /* notify_change */
     0,                            /* reparse */
     &execute,                            /* execute */
-    &compile,                            /* compile */
 };
 
 grib_action_class* grib_action_class_set = &_grib_action_class_set;
@@ -106,16 +104,6 @@ grib_action* grib_action_create_set( grib_context* context,
     return act;
 }
 
-static void compile(grib_action* act, grib_compiler *compiler)
-{
-    grib_action_set* a  = (grib_action_set*)act;
-
-    fprintf(compiler->out,"%s = grib_action_create_set(ctx,",compiler->var);
-    fprintf(compiler->out,"\"%s\",", a->name);
-    grib_compile_expression(a->expression, compiler);
-    fprintf(compiler->out,",%d);\n", a->nofail);
-}
-
 static int execute(grib_action* a, grib_handle *h)
 {
     int ret=0;
diff --git a/src/action_class_set_darray.c b/src/action_class_set_darray.c
index 8ad52d6..6f7272e 100644
--- a/src/action_class_set_darray.c
+++ b/src/action_class_set_darray.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -67,7 +67,6 @@ static grib_action_class _grib_action_class_set_darray = {
     0,                            /* notify_change */
     0,                            /* reparse */
     &execute,                            /* execute */
-    0,                            /* compile */
 };
 
 grib_action_class* grib_action_class_set_darray = &_grib_action_class_set_darray;
diff --git a/src/action_class_set_iarray.c b/src/action_class_set_iarray.c
index 50fb092..fa915ef 100644
--- a/src/action_class_set_iarray.c
+++ b/src/action_class_set_iarray.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -67,7 +67,6 @@ static grib_action_class _grib_action_class_set_iarray = {
     0,                            /* notify_change */
     0,                            /* reparse */
     &execute,                            /* execute */
-    0,                            /* compile */
 };
 
 grib_action_class* grib_action_class_set_iarray = &_grib_action_class_set_iarray;
diff --git a/src/action_class_set_missing.c b/src/action_class_set_missing.c
index 4eec3f3..3abdf5a 100644
--- a/src/action_class_set_missing.c
+++ b/src/action_class_set_missing.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -64,7 +64,6 @@ static grib_action_class _grib_action_class_set_missing = {
     0,                            /* notify_change */
     0,                            /* reparse */
     &execute,                            /* execute */
-    0,                            /* compile */
 };
 
 grib_action_class* grib_action_class_set_missing = &_grib_action_class_set_missing;
diff --git a/src/action_class_set_sarray.c b/src/action_class_set_sarray.c
index d4bdd1d..ff8ac46 100644
--- a/src/action_class_set_sarray.c
+++ b/src/action_class_set_sarray.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -67,7 +67,6 @@ static grib_action_class _grib_action_class_set_sarray = {
     0,                            /* notify_change */
     0,                            /* reparse */
     &execute,                            /* execute */
-    0,                            /* compile */
 };
 
 grib_action_class* grib_action_class_set_sarray = &_grib_action_class_set_sarray;
diff --git a/src/action_class_switch.c b/src/action_class_switch.c
index 42062e2..9ec2b7b 100644
--- a/src/action_class_switch.c
+++ b/src/action_class_switch.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -73,7 +73,6 @@ static grib_action_class _grib_action_class_switch = {
     0,                            /* notify_change */
     0,                            /* reparse */
     &execute,                            /* execute */
-    0,                            /* compile */
 };
 
 grib_action_class* grib_action_class_switch = &_grib_action_class_switch;
@@ -84,7 +83,6 @@ static void init_class(grib_action_class* c)
 	c->create_accessor	=	(*(c->super))->create_accessor;
 	c->notify_change	=	(*(c->super))->notify_change;
 	c->reparse	=	(*(c->super))->reparse;
-	c->compile	=	(*(c->super))->compile;
 }
 /* END_CLASS_IMP */
 
diff --git a/src/action_class_template.c b/src/action_class_template.c
index 6f97e0c..a301605 100644
--- a/src/action_class_template.c
+++ b/src/action_class_template.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -25,7 +25,6 @@
    IMPLEMENTS = dump
    IMPLEMENTS = destroy
    IMPLEMENTS = reparse
-   IMPLEMENTS = compile
    MEMBERS    = int nofail
    MEMBERS    = char*           arg
    END_CLASS_DEF
@@ -44,7 +43,6 @@ or edit "action.class" and rerun ./make_class.pl
 
 static void init_class      (grib_action_class*);
 static void dump            (grib_action* d, FILE*,int);
-static void compile         (grib_action* a, grib_compiler* compiler);
 static void destroy         (grib_context*,grib_action*);
 static int create_accessor(grib_section*,grib_action*,grib_loader*);
 static grib_action* reparse(grib_action* a,grib_accessor* acc,int *doit);
@@ -77,7 +75,6 @@ static grib_action_class _grib_action_class_template = {
     0,                            /* notify_change */
     &reparse,                            /* reparse */
     0,                            /* execute */
-    &compile,                            /* compile */
 };
 
 grib_action_class* grib_action_class_template = &_grib_action_class_template;
@@ -108,22 +105,6 @@ grib_action* grib_action_create_template( grib_context* context,int nofail,const
     return act;
 }
 
-static void compile(grib_action* act, grib_compiler *compiler)
-{
-    grib_action_template* a  = (grib_action_template*)act;
-    fprintf(compiler->out,"%s = grib_action_create_template(ctx,", compiler->var);
-    fprintf(compiler->out,"%d,",a->nofail);
-    fprintf(compiler->out,"\"%s\",",act->name);
-    if(a->arg) {
-        fprintf(compiler->out,"\"%s\");",a->arg);
-    }
-    else
-    {
-        fprintf(compiler->out,"NULL);");
-    }    
-    fprintf(compiler->out,"\n");
-}    
-
 static void dump( grib_action* act, FILE* f, int lvl)
 {
     grib_action_template* a = ( grib_action_template*)act;
@@ -132,7 +113,8 @@ static void dump( grib_action* act, FILE* f, int lvl)
     grib_context_print(act->context,f,"Template %s  %s\n",act->name , a->arg );
 }
 
-grib_action* get_empty_template(grib_context* c,int *err) {
+grib_action* get_empty_template(grib_context* c,int *err)
+{
     char fname[]="empty_template.def";
     char* path=0;
 
@@ -147,7 +129,7 @@ grib_action* get_empty_template(grib_context* c,int *err) {
     }
 }
 
-static int  create_accessor(grib_section* p, grib_action* act, grib_loader *h )
+static int create_accessor(grib_section* p, grib_action* act, grib_loader *h)
 {
     int ret = GRIB_SUCCESS;
     grib_action_template* a = ( grib_action_template*)act;
@@ -178,7 +160,7 @@ static int  create_accessor(grib_section* p, grib_action* act, grib_loader *h )
     }
     as->flags |= GRIB_ACCESSOR_FLAG_HIDDEN;
     gs = as->sub_section;
-    gs->branch = la; /* Will be used to prevent unecessary reparse */
+    gs->branch = la; /* Will be used to prevent unnecessary reparse */
 
     grib_push_accessor(as,p->block);
 
diff --git a/src/action_class_transient_darray.c b/src/action_class_transient_darray.c
index eb46c0b..0d715d2 100644
--- a/src/action_class_transient_darray.c
+++ b/src/action_class_transient_darray.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -72,7 +72,6 @@ static grib_action_class _grib_action_class_transient_darray = {
     0,                            /* notify_change */
     0,                            /* reparse */
     &execute,                            /* execute */
-    0,                            /* compile */
 };
 
 grib_action_class* grib_action_class_transient_darray = &_grib_action_class_transient_darray;
@@ -82,7 +81,6 @@ static void init_class(grib_action_class* c)
 	c->create_accessor	=	(*(c->super))->create_accessor;
 	c->notify_change	=	(*(c->super))->notify_change;
 	c->reparse	=	(*(c->super))->reparse;
-	c->compile	=	(*(c->super))->compile;
 }
 /* END_CLASS_IMP */
 
diff --git a/src/action_class_trigger.c b/src/action_class_trigger.c
index 16d414c..c4a5e08 100644
--- a/src/action_class_trigger.c
+++ b/src/action_class_trigger.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -75,7 +75,6 @@ static grib_action_class _grib_action_class_trigger = {
     0,                            /* notify_change */
     &reparse,                            /* reparse */
     0,                            /* execute */
-    0,                            /* compile */
 };
 
 grib_action_class* grib_action_class_trigger = &_grib_action_class_trigger;
@@ -85,7 +84,6 @@ static void init_class(grib_action_class* c)
 	c->xref	=	(*(c->super))->xref;
 	c->notify_change	=	(*(c->super))->notify_change;
 	c->execute	=	(*(c->super))->execute;
-	c->compile	=	(*(c->super))->compile;
 }
 /* END_CLASS_IMP */
 
diff --git a/src/action_class_variable.c b/src/action_class_variable.c
index 820d315..24e5841 100644
--- a/src/action_class_variable.c
+++ b/src/action_class_variable.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -20,7 +20,6 @@
    CLASS      = action
    SUPER      = action_class_gen
    IMPLEMENTS = execute
-   IMPLEMENTS = compile
    END_CLASS_DEF
 
  */
@@ -36,7 +35,6 @@ or edit "action.class" and rerun ./make_class.pl
 */
 
 static void init_class      (grib_action_class*);
-static void compile         (grib_action* a, grib_compiler* compiler);
 static int execute(grib_action* a,grib_handle* h);
 
 
@@ -67,7 +65,6 @@ static grib_action_class _grib_action_class_variable = {
     0,                            /* notify_change */
     0,                            /* reparse */
     &execute,                            /* execute */
-    &compile,                            /* compile */
 };
 
 grib_action_class* grib_action_class_variable = &_grib_action_class_variable;
@@ -110,26 +107,4 @@ static int execute(grib_action* a, grib_handle *h)
 	return grib_create_accessor(h->root, a, NULL );
 }
 
-static void compile(grib_action* act, grib_compiler *compiler)
-{
-    grib_action_variable* a  = (grib_action_variable*)act;
-    fprintf(compiler->out,"%s = grib_action_create_variable(ctx,",compiler->var);
-    fprintf(compiler->out,"\"%s\",",act->name);
-    fprintf(compiler->out,"\"%s\",",act->op);
-    fprintf(compiler->out,"%ld,",a->len);
-    fprintf(compiler->out,"NULL,"); /* a->params */
-    fprintf(compiler->out,"NULL,"); /* a->default_value */
-    grib_compile_flags(compiler, act->flags);
-    fprintf(compiler->out,",");
-    if(act->name_space) {
-        fprintf(compiler->out,"\"%s\");",act->name_space);
-    }
-    else
-    {
-        fprintf(compiler->out,"NULL);");
-    }    
-    fprintf(compiler->out,"\n");
-}
-
-
 
diff --git a/src/action_class_when.c b/src/action_class_when.c
index dca224d..dd2cdd8 100644
--- a/src/action_class_when.c
+++ b/src/action_class_when.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -18,7 +18,7 @@
    START_CLASS_DEF
    CLASS      = action
    IMPLEMENTS = create_accessor
-   IMPLEMENTS = dump;xref;compile
+   IMPLEMENTS = dump;xref
    IMPLEMENTS = destroy;notify_change
    MEMBERS    = grib_expression *expression
    MEMBERS    = grib_action     *block_true
@@ -41,7 +41,6 @@ or edit "action.class" and rerun ./make_class.pl
 static void init_class      (grib_action_class*);
 static void dump            (grib_action* d, FILE*,int);
 static void xref            (grib_action* d, FILE* f,const char* path);
-static void compile         (grib_action* a, grib_compiler* compiler);
 static void destroy         (grib_context*,grib_action*);
 static int create_accessor(grib_section*,grib_action*,grib_loader*);
 static int notify_change(grib_action* a, grib_accessor* observer,grib_accessor* observed);
@@ -74,7 +73,6 @@ static grib_action_class _grib_action_class_when = {
     &notify_change,                            /* notify_change */
     0,                            /* reparse */
     0,                            /* execute */
-    &compile,                            /* compile */
 };
 
 grib_action_class* grib_action_class_when = &_grib_action_class_when;
@@ -111,27 +109,6 @@ grib_action* grib_action_create_when( grib_context* context,
     return act;
 }
 
-static void compile(grib_action* act, grib_compiler *compiler)
-{
-    grib_action_when* a  = (grib_action_when*)act;
-    char t[80];
-    char f[80];
-
-    if(a->block_true)
-        grib_compile_action_branch(a->block_true, compiler,t); 
-    else
-        strcpy(t,"NULL");
-
-    if(a->block_false)
-        grib_compile_action_branch(a->block_false, compiler,f);
-    else
-        strcpy(f,"NULL");
-
-    fprintf(compiler->out,"%s = grib_action_create_when(ctx,",compiler->var);
-    grib_compile_expression(a->expression, compiler);
-    fprintf(compiler->out,",%s,%s);\n", t,f);
-}
-
 static int create_accessor(grib_section* p, grib_action* act,grib_loader *h)
 {
     grib_action_when* self = (grib_action_when*)act;
diff --git a/src/action_class_while.c b/src/action_class_while.c
index fefc417..fd2b620 100644
--- a/src/action_class_while.c
+++ b/src/action_class_while.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -67,7 +67,6 @@ static grib_action_class _grib_action_class_while = {
     0,                            /* notify_change */
     0,                            /* reparse */
     0,                            /* execute */
-    0,                            /* compile */
 };
 
 grib_action_class* grib_action_class_while = &_grib_action_class_while;
@@ -78,7 +77,6 @@ static void init_class(grib_action_class* c)
 	c->notify_change	=	(*(c->super))->notify_change;
 	c->reparse	=	(*(c->super))->reparse;
 	c->execute	=	(*(c->super))->execute;
-	c->compile	=	(*(c->super))->compile;
 }
 /* END_CLASS_IMP */
 
diff --git a/src/action_class_write.c b/src/action_class_write.c
index f5fdfda..7be44c8 100644
--- a/src/action_class_write.c
+++ b/src/action_class_write.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -68,7 +68,6 @@ static grib_action_class _grib_action_class_write = {
     0,                            /* notify_change */
     0,                            /* reparse */
     &execute,                            /* execute */
-    0,                            /* compile */
 };
 
 grib_action_class* grib_action_class_write = &_grib_action_class_write;
@@ -110,7 +109,7 @@ static int execute(grib_action* act, grib_handle *h)
     int err = GRIB_SUCCESS;
     size_t size;
     const void* buffer = NULL;
-    const char* filename;
+    const char* filename = NULL;
     char string[1024] = { 0, };
 
     grib_file* of = NULL;
@@ -124,9 +123,16 @@ static int execute(grib_action* act, grib_handle *h)
         err = grib_recompose_name(h, NULL, a->name, string, 0);
         filename = string;
     } else {
-        filename = act->context->outfilename ?	act->context->outfilename : "filter.out";
+        if (act->context->outfilename) {
+            filename = act->context->outfilename;
+            err = grib_recompose_name(h, NULL, act->context->outfilename, string, 0);
+            if (!err) filename = string;
+        } else {
+            filename = "filter.out";
+        }
     }
 
+    Assert(filename);
     if (a->append) of = grib_file_open(filename, "a", &err);
     else           of = grib_file_open(filename, "w", &err);
 
diff --git a/src/bufr_keys_iterator.c b/src/bufr_keys_iterator.c
new file mode 100644
index 0000000..2c41779
--- /dev/null
+++ b/src/bufr_keys_iterator.c
@@ -0,0 +1,217 @@
+/*
+ * Copyright 2005-2017 ECMWF.
+ *
+ * This software is licensed under the terms of the Apache Licence Version 2.0
+ * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+ *
+ * In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
+ * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
+ */
+
+#include "grib_api_internal.h"
+
+grib_keys_iterator* codes_bufr_keys_iterator_new(grib_handle* h)
+{
+    grib_keys_iterator* ki=NULL;
+
+    if (!h) return NULL;
+
+    ki= (grib_keys_iterator*)grib_context_malloc_clear(h->context,sizeof(grib_keys_iterator));
+    if (!ki) return NULL;
+
+    ki->filter_flags = 0;
+    ki->handle       = h;
+    ki->i_curr_attribute=0;
+    ki->accessor_flags_only= GRIB_ACCESSOR_FLAG_DUMP;
+    ki->accessor_flags_skip= GRIB_ACCESSOR_FLAG_HIDDEN | GRIB_ACCESSOR_FLAG_READ_ONLY;
+
+    ki->at_start     = 1;
+    ki->match        = 0;
+
+    if(ki->seen==NULL ) ki->seen = grib_trie_new(h->context);
+
+    return ki;
+}
+
+grib_keys_iterator* codes_bufr_data_section_keys_iterator_new(grib_handle* h)
+{
+    grib_keys_iterator* ki=NULL;
+
+    if (!h) return NULL;
+
+    ki= (grib_keys_iterator*)grib_context_malloc_clear(h->context,sizeof(grib_keys_iterator));
+    if (!ki) return NULL;
+
+    ki->filter_flags = 0;
+    ki->handle       = h;
+    ki->i_curr_attribute=0;
+    ki->accessor_flags_only= GRIB_ACCESSOR_FLAG_BUFR_DATA | GRIB_ACCESSOR_FLAG_DUMP;
+    ki->accessor_flags_skip= GRIB_ACCESSOR_FLAG_HIDDEN | GRIB_ACCESSOR_FLAG_READ_ONLY;
+
+    ki->at_start     = 1;
+    ki->match        = 0;
+
+    if(ki->seen==NULL ) ki->seen = grib_trie_new(h->context);
+
+    return ki;
+}
+
+static void mark_seen(grib_keys_iterator* ki,const char* name)
+{
+    int* r=(int*)grib_trie_get(ki->seen,name);
+
+    if (r) (*r)++;
+    else {
+        r=(int*)grib_context_malloc(ki->handle->context,sizeof(int));
+        *r=1;
+        grib_trie_insert(ki->seen,name,(void*)r);
+    }
+}
+
+/*
+static int was_seen(grib_keys_iterator* ki,const char* name)
+{
+    return grib_trie_get(ki->seen,name) != NULL;
+}
+ */
+
+int codes_bufr_keys_iterator_rewind(grib_keys_iterator* ki)
+{
+    ki->at_start = 1;
+    return GRIB_SUCCESS;
+}
+
+static int skip(grib_keys_iterator* kiter)
+{
+    if(kiter->current->sub_section)
+        return 1;
+
+    if(kiter->current->flags & kiter->accessor_flags_skip)
+        return 1;
+
+    if(kiter->accessor_flags_only == (kiter->current->flags & kiter->accessor_flags_only))  {
+        mark_seen(kiter,kiter->current->name);
+        return 0;
+    } else  {
+        return 1;
+    }
+
+    mark_seen(kiter,kiter->current->name);
+
+    return 0;
+}
+
+static int next_attribute(grib_keys_iterator* kiter)
+{
+    int *r=0;
+    int i_curr_attribute;
+    if (!kiter->current) return 0;
+    if (!kiter->attributes) {
+        kiter->attributes=kiter->current->attributes;
+        kiter->prefix=0;
+        kiter->i_curr_attribute=0;
+    }
+    i_curr_attribute=kiter->i_curr_attribute-1;
+
+    while (kiter->i_curr_attribute < MAX_ACCESSOR_ATTRIBUTES && kiter->attributes[kiter->i_curr_attribute] ) {
+        if ((kiter->attributes[kiter->i_curr_attribute]->flags & GRIB_ACCESSOR_FLAG_DUMP) != 0
+                && (kiter->attributes[kiter->i_curr_attribute]->flags & GRIB_ACCESSOR_FLAG_READ_ONLY) ==0) break;
+        kiter->i_curr_attribute++;
+    }
+
+    if (kiter->attributes[kiter->i_curr_attribute]) {
+        if (!kiter->prefix) {
+            kiter->prefix=(char*)grib_context_malloc_clear(kiter->current->context,strlen(kiter->current->name)+10);
+            r=(int*)grib_trie_get(kiter->seen,kiter->current->name);
+            sprintf(kiter->prefix,"#%d#%s",*r,kiter->current->name);
+        }
+        kiter->i_curr_attribute++;
+        return 1;
+    } else {
+        char* prefix=0;
+        if (!kiter->prefix) return 0;
+        if (!kiter->attributes[i_curr_attribute]) {
+            kiter->prefix=0;
+            return 0;
+        }
+        prefix=(char*)grib_context_malloc_clear(kiter->current->context,strlen(kiter->prefix)+strlen(kiter->attributes[i_curr_attribute]->name)+3);
+        sprintf(prefix,"%s->%s",kiter->prefix,kiter->attributes[i_curr_attribute]->name);
+        grib_context_free(kiter->current->context,kiter->prefix);
+        kiter->prefix=prefix;
+        kiter->attributes=kiter->attributes[i_curr_attribute]->attributes;
+        kiter->i_curr_attribute=0;
+        return next_attribute(kiter);
+    }
+
+}
+
+int codes_bufr_keys_iterator_next(grib_keys_iterator* kiter)
+{
+    if(kiter->at_start)
+    {
+        kiter->current  = kiter->handle->root->block->first;
+        kiter->at_start = 0;
+        kiter->i_curr_attribute=0;
+        kiter->prefix=0;
+        kiter->attributes=0;
+    }
+    else
+    {
+        if (next_attribute(kiter)) {
+            return 1;
+        } else {
+            kiter->current = grib_next_accessor(kiter->current);
+            kiter->attributes=0;
+            if (kiter->prefix) {
+                grib_context_free(kiter->current->context,kiter->prefix);
+                kiter->prefix=0;
+            }
+            kiter->i_curr_attribute=0;
+        }
+    }
+
+    while(kiter->current && skip(kiter))
+        kiter->current = grib_next_accessor(kiter->current);
+
+    return kiter->current != NULL;
+}
+
+char* codes_bufr_keys_iterator_get_name(grib_keys_iterator* kiter)
+{
+    int *r=0;
+    char* ret=0;
+    Assert(kiter->current);
+
+    if (kiter->prefix) {
+        int iattribute=kiter->i_curr_attribute-1;
+        ret=(char*)grib_context_malloc_clear(kiter->handle->context,strlen(kiter->prefix)+strlen(kiter->attributes[iattribute]->name)+10);
+        sprintf(ret,"%s->%s",kiter->prefix,kiter->attributes[iattribute]->name);
+    } else {
+        ret=(char*)grib_context_malloc_clear(kiter->handle->context,strlen(kiter->current->name)+10);
+
+        if (kiter->current->flags & GRIB_ACCESSOR_FLAG_BUFR_DATA) {
+            r=(int*)grib_trie_get(kiter->seen,kiter->current->name);
+            sprintf(ret,"#%d#%s",*r,kiter->current->name);
+        } else {
+            sprintf(ret,"%s",kiter->current->name);
+        }
+    }
+    return ret;
+}
+
+grib_accessor* codes_bufr_keys_iterator_get_accessor(grib_keys_iterator* kiter)
+{
+    return kiter->current;
+}
+
+int codes_bufr_keys_iterator_delete( grib_keys_iterator* kiter)
+{
+    if (kiter) {
+        if(kiter->seen)
+            grib_trie_delete(kiter->seen);
+        if (kiter->name_space)
+            grib_context_free(kiter->handle->context,kiter->name_space);
+        grib_context_free(kiter->handle->context,kiter);
+    }
+    return 0;
+}
diff --git a/src/bufr_util.c b/src/bufr_util.c
new file mode 100644
index 0000000..a0403a9
--- /dev/null
+++ b/src/bufr_util.c
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2005-2017 ECMWF.
+ *
+ * This software is licensed under the terms of the Apache Licence Version 2.0
+ * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+ *
+ * In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
+ * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
+ */
+
+#include "grib_api_internal.h"
+
+/* Return the rank of the key using list of keys (For BUFR keys) */
+/* The argument 'keys' is an input as well as output from each call */
+int compute_bufr_key_rank(grib_handle* h, grib_string_list* keys, const char* key)
+{
+    grib_string_list* next=keys;
+    grib_string_list* prev=keys;
+    int theRank=0;
+    size_t size=0;
+    grib_context* c=h->context;
+    Assert(h->product_kind == PRODUCT_BUFR);
+
+    while (next && next->value && strcmp(next->value,key)) {
+        prev=next;
+        next=next->next;
+    }
+    if (!next) {
+        prev->next=(grib_string_list*)grib_context_malloc_clear(c,sizeof(grib_string_list));
+        next=prev->next;
+    }
+    if (!next->value) {
+        next->value=strdup(key);
+        next->count=0;
+    }
+
+    next->count++;
+    theRank=next->count;
+    if (theRank==1) {
+        /* If the count is 1 it could mean two things: */
+        /*   This is the first instance of the key and there is another one */
+        /*   This is the first and only instance of the key */
+        /* So we check if there is a second one of this key, */
+        /* If not, then rank is zero i.e. this is the only instance */
+        char* s=(char*)grib_context_malloc_clear(c,strlen(key)+5);
+        sprintf(s,"#2#%s",key);
+        if (grib_get_size(h,s,&size)==GRIB_NOT_FOUND) theRank=0;
+        grib_context_free(c, s);
+    }
+
+    return theRank;
+}
+
+char** codes_bufr_copy_data_return_copied_keys(grib_handle* hin,grib_handle* hout, size_t* nkeys, int* err)
+{
+    grib_keys_iterator* kiter=NULL;
+    char* name=0;
+    char** keys=NULL;
+    grib_sarray* k=0;
+
+    if (hin==NULL || hout==NULL) {
+        *err = GRIB_NULL_HANDLE;
+        return NULL;
+    }
+
+    kiter=codes_bufr_data_section_keys_iterator_new(hin);
+    if (!kiter) return NULL;
+    k=grib_sarray_new(hin->context, 50, 10);
+
+    while(codes_bufr_keys_iterator_next(kiter))
+    {
+        name = codes_bufr_keys_iterator_get_name(kiter);
+        /* if the copy fails we want to keep copying without any errors.
+           This is because the copy can be between structures that are not
+           identical and we want to copy what can be copied and skip what
+           cannot be copied because is not in the output handle
+         */
+        *err=codes_copy_key(hin, hout, name, 0);
+        if (*err==0) k=grib_sarray_push(hin->context, k, name);
+    }
+    *nkeys=grib_sarray_used_size(k);
+    keys=grib_sarray_get_array(hin->context, k);
+    grib_sarray_delete(hin->context, k);
+    if (*nkeys > 0) {
+        /* Do the pack if something was copied */
+        *err=grib_set_long(hout, "pack", 1);
+    }
+    grib_keys_iterator_delete(kiter);
+    return keys;
+}
+
+int codes_bufr_copy_data(grib_handle* hin, grib_handle* hout)
+{
+    grib_keys_iterator* kiter=NULL;
+    char* name=0;
+    int err=0;
+    int nkeys=0;
+
+    if (hin==NULL || hout==NULL) {
+        return GRIB_NULL_HANDLE;
+    }
+
+    kiter=codes_bufr_data_section_keys_iterator_new(hin);
+    if (!kiter) return GRIB_INTERNAL_ERROR;
+
+    while(codes_bufr_keys_iterator_next(kiter))
+    {
+        name = codes_bufr_keys_iterator_get_name(kiter);
+        /* if the copy fails we want to keep copying without any error messages.
+           This is because the copy can be between structures that are not
+           identical and we want to copy what can be copied and skip what
+           cannot be copied because is not in the output handle
+         */
+        err=codes_copy_key(hin, hout, name, 0);
+        if (err==0) nkeys++;
+        grib_context_free(hin->context,name);
+    }
+
+    if (nkeys > 0) {
+        /* Do the pack if something was copied */
+        err=grib_set_long(hout, "pack", 1);
+    }
+
+    grib_keys_iterator_delete(kiter);
+    return err;
+}
diff --git a/src/codes_memfs.c b/src/codes_memfs.c
index c404c34..8bcd63b 100644
--- a/src/codes_memfs.c
+++ b/src/codes_memfs.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/compile.c b/src/compile.c
deleted file mode 100644
index 54bd6f2..0000000
--- a/src/compile.c
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright 2005-2016 ECMWF.
- *
- * This software is licensed under the terms of the Apache Licence Version 2.0
- * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
- *
- * In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
- * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
- */
-
-/***************************************************************************
- *   Jean Baptiste Filippi - 01.11.2005                                                           *
- *                                                                         *
- ***************************************************************************/
-
-#include "grib_api_internal.h"
-
-
-#define COMPILE_FLAGS(z) if(flags&z) { flags ^= ~z; fprintf(c->out,"%s%s",sep,#z);sep="|";  }
-
-void grib_compile_flags(grib_compiler* c,long flags)
-{
-    char *sep = "";
-
-    fprintf(c->out,"0x%ld",flags);
-    return;
-
-    if(flags == 0) {
-        fprintf(c->out,"0");
-        return;
-    }
-
-    COMPILE_FLAGS(GRIB_ACCESSOR_FLAG_READ_ONLY);
-    COMPILE_FLAGS(GRIB_ACCESSOR_FLAG_DUMP);
-    COMPILE_FLAGS(GRIB_ACCESSOR_FLAG_EDITION_SPECIFIC);
-    COMPILE_FLAGS(GRIB_ACCESSOR_FLAG_CAN_BE_MISSING);
-    COMPILE_FLAGS(GRIB_ACCESSOR_FLAG_HIDDEN);
-    COMPILE_FLAGS(GRIB_ACCESSOR_FLAG_CONSTRAINT);
-    COMPILE_FLAGS(GRIB_ACCESSOR_FLAG_OVERRIDE);
-    COMPILE_FLAGS(GRIB_ACCESSOR_FLAG_NO_COPY);
-    COMPILE_FLAGS(GRIB_ACCESSOR_FLAG_COPY_OK);
-    COMPILE_FLAGS(GRIB_ACCESSOR_FLAG_FUNCTION);
-    COMPILE_FLAGS(GRIB_ACCESSOR_FLAG_DATA);
-    COMPILE_FLAGS(GRIB_ACCESSOR_FLAG_NO_FAIL);
-    COMPILE_FLAGS(GRIB_ACCESSOR_FLAG_TRANSIENT);
-    COMPILE_FLAGS(GRIB_ACCESSOR_FLAG_STRING_TYPE);
-    COMPILE_FLAGS(GRIB_ACCESSOR_FLAG_LONG_TYPE);
-    COMPILE_FLAGS(GRIB_ACCESSOR_FLAG_LOWERCASE);
-
-    if(flags) {
-        fprintf(stderr,"Unknown flags %lx\n", flags);
-        Assert(0);
-    }
-}
-
-void grib_compile_action_branch(grib_action* a,grib_compiler* c, char* name)
-{
-    int first = 1;
-    char var[80];
-    char tmp[80];
-    const char* save = c->var;
-    int n = c->cnt++;
-    c->var = tmp;
-    if(c->cnt >= c->max) {
-        fprintf(stderr,"Not enough variables %d\n",c->max);
-        Assert(0);
-    }
-    sprintf(var,"a[%d]", n);
-    while(a)
-    {
-        if(first) sprintf(tmp,"%s",var); else sprintf(tmp,"b[%d]->next",n); 
-        grib_compile(a,c);
-        fprintf(c->out,"b[%d] = %s;\n",n, c->var);
-        a=a->next;
-        first = 0;
-    }
-    c->var = save;
-
-    if(name) strcpy(name, var);
-}
-
-void grib_compile_expression(grib_expression* e, grib_compiler *compiler)
-{
-    if(!e)
-    {
-        fprintf(compiler->out,"NULL");
-    }
-    else
-    {
-        grib_expression_compile(e,compiler);
-    }
-}
-
-void grib_compile_arguments(grib_arguments* a, grib_compiler *compiler)
-{
-    if(!a)
-        fprintf(compiler->out,"NULL");
-    else {
-        fprintf(compiler->out, "grib_arguments_new(ctx,");
-        grib_compile_expression(a->expression, compiler);
-        fprintf(compiler->out, ",");
-        grib_compile_arguments(a->next,compiler);
-        fprintf(compiler->out, ")");
-    }
-}
diff --git a/src/eccodes.c b/src/eccodes.c
index 07bf933..6b7394b 100644
--- a/src/eccodes.c
+++ b/src/eccodes.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -29,6 +29,10 @@ const char* codes_get_git_sha1()
 {
     return grib_get_git_sha1();
 }
+const char* codes_get_package_name(void)
+{
+    return grib_get_package_name();
+}
 void codes_print_api_version(FILE* out)
 {
     grib_print_api_version(out);
@@ -61,7 +65,7 @@ void codes_check(const char* call,const char*  file,int line,int e,const char* m
 
 /* Fieldsets */
 /******************************************************************************/
-grib_fieldset *codes_fieldset_new_from_files(grib_context *c, char *filenames[], int nfiles, char **keys, int nkeys, char *where_string, char *order_by_string, int *err)
+grib_fieldset *codes_fieldset_new_from_files(grib_context *c, char *filenames[], int nfiles, char **keys, int nkeys, const char *where_string, const char *order_by_string, int *err)
 {
     return grib_fieldset_new_from_files(c, filenames, nfiles, keys, nkeys, where_string, order_by_string, err);
 }
@@ -151,7 +155,7 @@ int codes_write_message(grib_handle* h,const char* file,const char* mode)
 {
     return grib_write_message(h,file,mode);
 }
-grib_handle* codes_handle_new_from_message(grib_context* c, void* data, size_t data_len)
+grib_handle* codes_handle_new_from_message(grib_context* c, const void* data, size_t data_len)
 {
     return grib_handle_new_from_message(c,data,data_len);
 }
@@ -175,7 +179,7 @@ grib_handle* codes_handle_new_from_partial_message_copy(grib_context* c, const v
 {
     return grib_handle_new_from_partial_message_copy(c,data,size);
 }
-grib_handle* codes_handle_new_from_partial_message(grib_context* c,void* data, size_t buflen)
+grib_handle* codes_handle_new_from_partial_message(grib_context* c, const void* data, size_t buflen)
 {
     return grib_handle_new_from_partial_message(c,data,buflen);
 }
diff --git a/src/eccodes.h b/src/eccodes.h
index eb53f24..a417bed 100644
--- a/src/eccodes.h
+++ b/src/eccodes.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -119,6 +119,10 @@ Log mode for information for processing information
 \see codes_keys_iterator_new */
 #define CODES_KEYS_ITERATOR_SKIP_FUNCTION          GRIB_KEYS_ITERATOR_SKIP_FUNCTION
 
+/*!  only keys present in the dump
+\ingroup keys_iterator
+\see codes_keys_iterator_new */
+#define CODES_KEYS_ITERATOR_DUMP_ONLY          GRIB_KEYS_ITERATOR_DUMP_ONLY
 
 typedef struct grib_values            codes_values;
 typedef struct grib_key_value_list    codes_key_value_list;
@@ -175,7 +179,7 @@ typedef struct grib_util_packing_spec codes_util_packing_spec;
 typedef struct grib_util_grid_spec    codes_util_grid_spec;
 
 
-codes_fieldset *codes_fieldset_new_from_files(codes_context *c, char *filenames[], int nfiles, char **keys, int nkeys, char *where_string, char *order_by_string, int *err);
+codes_fieldset *codes_fieldset_new_from_files(codes_context *c, char *filenames[], int nfiles, char **keys, int nkeys, const char *where_string, const char *order_by_string, int *err);
 
 void codes_fieldset_delete(codes_fieldset* set);
 void codes_fieldset_rewind(codes_fieldset* set);
@@ -415,7 +419,7 @@ codes_string_list* codes_grib_util_get_mars_param(const char* param_id);
 * @param data_len    : the length of the message in number of bytes
 * @return            the new handle, NULL if the message is invalid or a problem is encountered
 */
-codes_handle* codes_handle_new_from_message(codes_context* c, void* data, size_t data_len);
+codes_handle* codes_handle_new_from_message(codes_context* c, const void* data, size_t data_len);
 
 /**
 *  Create a handle from a user message in memory. The message will not be freed at the end.
@@ -753,7 +757,7 @@ int codes_get_double(codes_handle* h, const char* key, double* value
 *
 * @param h           : the handle to get the data from
 * @param key         : the key to be searched
-* @param i           : zero based index
+* @param i           : zero-based index
 * @param value       : the address of a double where the data will be retrieved
 * @return            0 if OK, integer value on error
 */
@@ -764,22 +768,22 @@ int codes_get_double_element(codes_handle* h, const char* key, int i, double* va
 *
 * @param h           : the handle to get the data from
 * @param key         : the key to be searched
-* @param i           : zero based array of indexes
+* @param i           : zero-based array of indexes
 * @param size        : size of the i and value arrays
-* @param value       : the address of a double where the data will be retrieved
+* @param value       : the double array for the data values
 * @return            0 if OK, integer value on error
 */
-int codes_get_double_elements(codes_handle* h, const char* key, int* i, long size,double* value);
+int codes_get_double_elements(codes_handle* h, const char* key, int* i, long size, double* value);
 
 /**
 *  Get a string value from a key, if several keys of the same name are present, the last one is returned
 * @see  codes_set_string
 *
-* @param h           : the handle to get the data from
-* @param key         : the key to be searched
-* @param mesg       : the address of a string where the data will be retrieved
-* @param length      : the address of a size_t that contains allocated length of the string on input, and that contains the actual length of the string on output
-* @return            0 if OK, integer value on error
+* @param h         : the handle to get the data from
+* @param key       : the key to be searched
+* @param mesg      : the address of a string where the data will be retrieved
+* @param length    : the address of a size_t that contains allocated length of the string on input, and that contains the actual length of the string on output
+* @return          0 if OK, integer value on error
 */
 int codes_get_string(codes_handle* h, const char* key, char* mesg, size_t *length  );
 
@@ -1073,6 +1077,13 @@ long codes_get_api_version(void);
 const char* codes_get_git_sha1(void);
 
 /**
+*  Get the package name
+*
+*  @return character string with package name
+*/
+const char* codes_get_package_name(void);
+
+/**
 *  Prints the API version
 *
 */
@@ -1093,12 +1104,24 @@ attributes or by the namespace they belong to.
 *                         and namespace
 */
 codes_keys_iterator* codes_keys_iterator_new(codes_handle* h,unsigned long filter_flags, const char* name_space);
+codes_keys_iterator* codes_bufr_keys_iterator_new(codes_handle* h);
+codes_keys_iterator* codes_bufr_data_section_keys_iterator_new(codes_handle* h);
+
+/* codes_bufr_copy_data copies all the values in the data section that are present in the same position in the data tree
+ * and with the same number of values to the output handle. Should not exit with error if the output handle has a different
+ * structure as the aim is to copy what is possible to be copied.
+ * This will allow the user to add something to a message by creating a new message with additions or changes to the
+ * unexpandedDescriptors and copying what is possible to copy from the original message. */
+char **codes_bufr_copy_data_return_copied_keys(grib_handle *hin, grib_handle *hout, size_t *nkeys, int *err);
+int codes_bufr_copy_data(grib_handle* hin, grib_handle* hout);
+
 
 /*! Step to the next iterator.
 *  @param kiter         : valid codes_keys_iterator
 *  @return              1 if next iterator exists, 0 if no more elements to iterate on
 */
 int codes_keys_iterator_next(codes_keys_iterator *kiter);
+int codes_bufr_keys_iterator_next(codes_keys_iterator *kiter);
 
 
 /*! get the key name from the iterator
@@ -1119,6 +1142,8 @@ int codes_keys_iterator_delete( codes_keys_iterator* kiter);
 */
 int codes_keys_iterator_rewind(codes_keys_iterator* kiter);
 
+char* codes_bufr_keys_iterator_get_name(codes_keys_iterator* kiter);
+
 int codes_keys_iterator_set_flags(codes_keys_iterator *kiter,unsigned long flags);
 
 int codes_keys_iterator_get_long(codes_keys_iterator *kiter, long *v, size_t *len);
@@ -1148,7 +1173,7 @@ void codes_check(const char* call,const char*  file,int line,int e,const char* m
 
 int codes_set_values(codes_handle* h, codes_values* codes_values, size_t arg_count);
 codes_handle* codes_handle_new_from_partial_message_copy(codes_context* c, const void* data, size_t size);
-codes_handle* codes_handle_new_from_partial_message(codes_context* c,void* data, size_t buflen);
+codes_handle* codes_handle_new_from_partial_message(codes_context* c, const void* data, size_t buflen);
 int codes_is_missing(codes_handle* h, const char* key, int* err);
 int codes_is_defined(codes_handle* h, const char* key);
 int codes_set_missing(codes_handle* h, const char* key);
@@ -1220,141 +1245,139 @@ codes_handle *codes_grib_util_set_spec(codes_handle *h,
 Error codes returned by the eccodes functions.
 */
 /*! @{*/
-
 /** No error */
-#define CODES_SUCCESS            GRIB_SUCCESS
+#define CODES_SUCCESS		GRIB_SUCCESS
 /** End of resource reached */
-#define CODES_END_OF_FILE        GRIB_END_OF_FILE
+#define CODES_END_OF_FILE		GRIB_END_OF_FILE
 /** Internal error */
-#define CODES_INTERNAL_ERROR     GRIB_INTERNAL_ERROR
+#define CODES_INTERNAL_ERROR		GRIB_INTERNAL_ERROR
 /** Passed buffer is too small */
-#define CODES_BUFFER_TOO_SMALL   GRIB_BUFFER_TOO_SMALL
+#define CODES_BUFFER_TOO_SMALL		GRIB_BUFFER_TOO_SMALL
 /** Function not yet implemented */
-#define CODES_NOT_IMPLEMENTED    GRIB_NOT_IMPLEMENTED
+#define CODES_NOT_IMPLEMENTED		GRIB_NOT_IMPLEMENTED
 /** Missing 7777 at end of message */
-#define CODES_7777_NOT_FOUND     GRIB_7777_NOT_FOUND
+#define CODES_7777_NOT_FOUND		GRIB_7777_NOT_FOUND
 /** Passed array is too small */
-#define CODES_ARRAY_TOO_SMALL    GRIB_ARRAY_TOO_SMALL
+#define CODES_ARRAY_TOO_SMALL		GRIB_ARRAY_TOO_SMALL
 /** File not found */
-#define CODES_FILE_NOT_FOUND     GRIB_FILE_NOT_FOUND
+#define CODES_FILE_NOT_FOUND		GRIB_FILE_NOT_FOUND
 /** Code not found in code table */
-#define CODES_CODE_NOT_FOUND_IN_TABLE GRIB_CODE_NOT_FOUND_IN_TABLE
+#define CODES_CODE_NOT_FOUND_IN_TABLE		GRIB_CODE_NOT_FOUND_IN_TABLE
 /** Array size mismatch */
-#define CODES_WRONG_ARRAY_SIZE    GRIB_WRONG_ARRAY_SIZE
+#define CODES_WRONG_ARRAY_SIZE		GRIB_WRONG_ARRAY_SIZE
 /** Key/value not found */
-#define CODES_NOT_FOUND           GRIB_NOT_FOUND
+#define CODES_NOT_FOUND		GRIB_NOT_FOUND
 /** Input output problem */
-#define CODES_IO_PROBLEM          GRIB_IO_PROBLEM
+#define CODES_IO_PROBLEM		GRIB_IO_PROBLEM
 /** Message invalid */
-#define CODES_INVALID_MESSAGE     GRIB_INVALID_MESSAGE
+#define CODES_INVALID_MESSAGE		GRIB_INVALID_MESSAGE
 /** Decoding invalid */
-#define CODES_DECODING_ERROR      GRIB_DECODING_ERROR
+#define CODES_DECODING_ERROR		GRIB_DECODING_ERROR
 /** Encoding invalid */
-#define CODES_ENCODING_ERROR      GRIB_ENCODING_ERROR
+#define CODES_ENCODING_ERROR		GRIB_ENCODING_ERROR
 /** Code cannot unpack because of string too small */
-#define CODES_NO_MORE_IN_SET     GRIB_NO_MORE_IN_SET
+#define CODES_NO_MORE_IN_SET		GRIB_NO_MORE_IN_SET
 /** Problem with calculation of geographic attributes */
-#define CODES_GEOCALCULUS_PROBLEM  GRIB_GEOCALCULUS_PROBLEM
-/** Out of memory */
-#define CODES_OUT_OF_MEMORY        GRIB_OUT_OF_MEMORY
+#define CODES_GEOCALCULUS_PROBLEM		GRIB_GEOCALCULUS_PROBLEM
+/** Memory allocation error */
+#define CODES_OUT_OF_MEMORY		GRIB_OUT_OF_MEMORY
 /** Value is read only */
-#define CODES_READ_ONLY            GRIB_READ_ONLY
+#define CODES_READ_ONLY		GRIB_READ_ONLY
 /** Invalid argument */
-#define CODES_INVALID_ARGUMENT     GRIB_INVALID_ARGUMENT
+#define CODES_INVALID_ARGUMENT		GRIB_INVALID_ARGUMENT
 /** Null handle */
-#define CODES_NULL_HANDLE          GRIB_NULL_HANDLE
+#define CODES_NULL_HANDLE		GRIB_NULL_HANDLE
 /** Invalid section number */
-#define CODES_INVALID_SECTION_NUMBER  GRIB_INVALID_SECTION_NUMBER
+#define CODES_INVALID_SECTION_NUMBER		GRIB_INVALID_SECTION_NUMBER
 /** Value cannot be missing */
-#define CODES_VALUE_CANNOT_BE_MISSING GRIB_VALUE_CANNOT_BE_MISSING
+#define CODES_VALUE_CANNOT_BE_MISSING		GRIB_VALUE_CANNOT_BE_MISSING
 /** Wrong message length */
-#define CODES_WRONG_LENGTH        GRIB_WRONG_LENGTH
+#define CODES_WRONG_LENGTH		GRIB_WRONG_LENGTH
 /** Invalid key type */
-#define CODES_INVALID_TYPE        GRIB_INVALID_TYPE
+#define CODES_INVALID_TYPE		GRIB_INVALID_TYPE
 /** Unable to set step */
-#define CODES_WRONG_STEP          GRIB_WRONG_STEP
+#define CODES_WRONG_STEP		GRIB_WRONG_STEP
 /** Wrong units for step (step must be integer) */
-#define CODES_WRONG_STEP_UNIT     GRIB_WRONG_STEP_UNIT
+#define CODES_WRONG_STEP_UNIT		GRIB_WRONG_STEP_UNIT
 /** Invalid file id */
-#define CODES_INVALID_FILE        GRIB_INVALID_FILE
+#define CODES_INVALID_FILE		GRIB_INVALID_FILE
 /** Invalid grib id */
-#define CODES_INVALID_GRIB        GRIB_INVALID_GRIB
+#define CODES_INVALID_GRIB		GRIB_INVALID_GRIB
 /** Invalid index id */
-#define CODES_INVALID_INDEX       GRIB_INVALID_INDEX
+#define CODES_INVALID_INDEX		GRIB_INVALID_INDEX
 /** Invalid iterator id */
-#define CODES_INVALID_ITERATOR    GRIB_INVALID_ITERATOR
+#define CODES_INVALID_ITERATOR		GRIB_INVALID_ITERATOR
 /** Invalid keys iterator id */
-#define CODES_INVALID_KEYS_ITERATOR  GRIB_INVALID_KEYS_ITERATOR
+#define CODES_INVALID_KEYS_ITERATOR		GRIB_INVALID_KEYS_ITERATOR
 /** Invalid nearest id */
-#define CODES_INVALID_NEAREST     GRIB_INVALID_NEAREST
+#define CODES_INVALID_NEAREST		GRIB_INVALID_NEAREST
 /** Invalid order by */
-#define CODES_INVALID_ORDERBY     GRIB_INVALID_ORDERBY
+#define CODES_INVALID_ORDERBY		GRIB_INVALID_ORDERBY
 /** Missing a key from the fieldset */
-#define CODES_MISSING_KEY         GRIB_MISSING_KEY
+#define CODES_MISSING_KEY		GRIB_MISSING_KEY
 /** The point is out of the grid area */
-#define CODES_OUT_OF_AREA         GRIB_OUT_OF_AREA
+#define CODES_OUT_OF_AREA		GRIB_OUT_OF_AREA
 /** Concept no match */
-#define CODES_CONCEPT_NO_MATCH    GRIB_CONCEPT_NO_MATCH
+#define CODES_CONCEPT_NO_MATCH		GRIB_CONCEPT_NO_MATCH
 /** Hash array no match */
-#define CODES_HASH_ARRAY_NO_MATCH GRIB_HASH_ARRAY_NO_MATCH
+#define CODES_HASH_ARRAY_NO_MATCH		GRIB_HASH_ARRAY_NO_MATCH
 /** Definitions files not found */
-#define CODES_NO_DEFINITIONS      GRIB_NO_DEFINITIONS
+#define CODES_NO_DEFINITIONS		GRIB_NO_DEFINITIONS
 /** Wrong type while packing */
-#define CODES_WRONG_TYPE          GRIB_WRONG_TYPE
+#define CODES_WRONG_TYPE		GRIB_WRONG_TYPE
 /** End of resource */
-#define CODES_END                 GRIB_END
+#define CODES_END		GRIB_END
 /** Unable to code a field without values */
-#define CODES_NO_VALUES           GRIB_NO_VALUES
+#define CODES_NO_VALUES		GRIB_NO_VALUES
 /** Grid description is wrong or inconsistent */
-#define CODES_WRONG_GRID          GRIB_WRONG_GRID
+#define CODES_WRONG_GRID		GRIB_WRONG_GRID
 /** End of index reached */
-#define CODES_END_OF_INDEX        GRIB_END_OF_INDEX
+#define CODES_END_OF_INDEX		GRIB_END_OF_INDEX
 /** Null index */
-#define CODES_NULL_INDEX          GRIB_NULL_INDEX
+#define CODES_NULL_INDEX		GRIB_NULL_INDEX
 /** End of resource reached when reading message */
-#define CODES_PREMATURE_END_OF_FILE  GRIB_PREMATURE_END_OF_FILE
+#define CODES_PREMATURE_END_OF_FILE		GRIB_PREMATURE_END_OF_FILE
 /** An internal array is too small */
-#define CODES_INTERNAL_ARRAY_TOO_SMALL  GRIB_INTERNAL_ARRAY_TOO_SMALL
+#define CODES_INTERNAL_ARRAY_TOO_SMALL		GRIB_INTERNAL_ARRAY_TOO_SMALL
 /** Message is too large for the current architecture */
-#define CODES_MESSAGE_TOO_LARGE   GRIB_MESSAGE_TOO_LARGE
+#define CODES_MESSAGE_TOO_LARGE		GRIB_MESSAGE_TOO_LARGE
 /** Constant field */
-#define CODES_CONSTANT_FIELD      GRIB_CONSTANT_FIELD
+#define CODES_CONSTANT_FIELD		GRIB_CONSTANT_FIELD
 /** Switch unable to find a matching case */
-#define CODES_SWITCH_NO_MATCH     GRIB_SWITCH_NO_MATCH
+#define CODES_SWITCH_NO_MATCH		GRIB_SWITCH_NO_MATCH
 /** Underflow */
-#define CODES_UNDERFLOW           GRIB_UNDERFLOW
+#define CODES_UNDERFLOW		GRIB_UNDERFLOW
 /** Message malformed */
-#define CODES_MESSAGE_MALFORMED   GRIB_MESSAGE_MALFORMED
+#define CODES_MESSAGE_MALFORMED		GRIB_MESSAGE_MALFORMED
 /** Index is corrupted */
-#define CODES_CORRUPTED_INDEX     GRIB_CORRUPTED_INDEX
+#define CODES_CORRUPTED_INDEX		GRIB_CORRUPTED_INDEX
 /** Invalid number of bits per value */
-#define CODES_INVALID_BPV         GRIB_INVALID_BPV
+#define CODES_INVALID_BPV		GRIB_INVALID_BPV
 /** Edition of two messages is different */
-#define CODES_DIFFERENT_EDITION   GRIB_DIFFERENT_EDITION
+#define CODES_DIFFERENT_EDITION		GRIB_DIFFERENT_EDITION
 /** Value is different */
-#define CODES_VALUE_DIFFERENT     GRIB_VALUE_DIFFERENT
+#define CODES_VALUE_DIFFERENT		GRIB_VALUE_DIFFERENT
 /** Invalid key value */
-#define CODES_INVALID_KEY_VALUE   GRIB_INVALID_KEY_VALUE
+#define CODES_INVALID_KEY_VALUE		GRIB_INVALID_KEY_VALUE
 /** String is smaller than requested */
-#define CODES_STRING_TOO_SMALL    GRIB_STRING_TOO_SMALL
+#define CODES_STRING_TOO_SMALL		GRIB_STRING_TOO_SMALL
 /** Wrong type conversion */
-#define CODES_WRONG_CONVERSION    GRIB_WRONG_CONVERSION
+#define CODES_WRONG_CONVERSION		GRIB_WRONG_CONVERSION
 /** Missing BUFR table entry for descriptor */
-#define CODES_MISSING_BUFR_ENTRY  GRIB_MISSING_BUFR_ENTRY
+#define CODES_MISSING_BUFR_ENTRY		GRIB_MISSING_BUFR_ENTRY
 /** Null pointer */
-#define CODES_NULL_POINTER        GRIB_NULL_POINTER
+#define CODES_NULL_POINTER		GRIB_NULL_POINTER
 /** Attribute is already present, cannot add */
-#define CODES_ATTRIBUTE_CLASH     GRIB_ATTRIBUTE_CLASH
+#define CODES_ATTRIBUTE_CLASH		GRIB_ATTRIBUTE_CLASH
 /** Too many attributes. Increase MAX_ACCESSOR_ATTRIBUTES */
-#define CODES_TOO_MANY_ATTRIBUTES GRIB_TOO_MANY_ATTRIBUTES
+#define CODES_TOO_MANY_ATTRIBUTES		GRIB_TOO_MANY_ATTRIBUTES
 /** Attribute not found. */
-#define CODES_ATTRIBUTE_NOT_FOUND GRIB_ATTRIBUTE_NOT_FOUND
+#define CODES_ATTRIBUTE_NOT_FOUND		GRIB_ATTRIBUTE_NOT_FOUND
 /** Edition not supported. */
-#define CODES_UNSUPPORTED_EDITION GRIB_UNSUPPORTED_EDITION
+#define CODES_UNSUPPORTED_EDITION		GRIB_UNSUPPORTED_EDITION
 /** Value out of coding range */
-#define CODES_OUT_OF_RANGE        GRIB_OUT_OF_RANGE
+#define CODES_OUT_OF_RANGE		GRIB_OUT_OF_RANGE
 /** Size of bitmap is incorrect */
-#define CODES_WRONG_BITMAP_SIZE   GRIB_WRONG_BITMAP_SIZE
-
+#define CODES_WRONG_BITMAP_SIZE		GRIB_WRONG_BITMAP_SIZE
 /*! @}*/
 #endif
diff --git a/src/eccodes_version.h.in b/src/eccodes_version.h.in
index 5fe0315..9b57fe3 100644
--- a/src/eccodes_version.h.in
+++ b/src/eccodes_version.h.in
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/eccodes_windef.h b/src/eccodes_windef.h
index d6325f5..94bf5af 100644
--- a/src/eccodes_windef.h
+++ b/src/eccodes_windef.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/encode_double_array.c b/src/encode_double_array.c
index 9529f04..e019ed3 100644
--- a/src/encode_double_array.c
+++ b/src/encode_double_array.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/errors.pl b/src/errors.pl
index 1cdde7d..1f1244b 100755
--- a/src/errors.pl
+++ b/src/errors.pl
@@ -1,5 +1,5 @@
 #!/usr/bin/perl
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -13,12 +13,110 @@ use strict; use warnings;
 
 my $internal = get_internal_errors();
 my $public = get_public_errors();
+#print "DUMP,\t", Data::Dumper->Dump([\$public], [" "]);
 
 write_public($public);
 #write_internal($internal);
 write_C_errors($public,$internal);
 write_F90_errors($public);
 write_python_errors($public);
+write_python_exceptions($public);
+
+sub write_python_exceptions {
+    my $errdict = shift;
+    my %errmap = (); # code -> class name
+    open(H,">errors.py.new") or die "errors.py.new: $!";
+
+    my $header = <<'END_HEADER';
+"""
+Exception class hierarchy
+"""
+
+import gribapi_swig as _internal
+
+
+class GribInternalError(Exception):
+    """
+    @brief Wrap errors coming from the C API in a Python exception object.
+
+    Base class for all exceptions
+    """
+
+    def __init__(self, value):
+        # Call the base class constructor with the parameters it needs
+        Exception.__init__(self, value)
+        if type(value) is int:
+            err, self.msg = _internal.grib_c_get_error_string(value, 1024)
+            assert err == 0
+        else:
+            self.msg = value
+
+    def __str__(self):
+        return self.msg
+
+
+END_HEADER
+    print H $header;
+
+    foreach (sort {$a<=>$b} keys %{$errdict}){
+        my $code = $_;
+        my $name = $errdict->{$_}{name};
+        my $text = $errdict->{$_}{text};
+        # Convert name e.g. GRIB_WRONG_ARRAY_SIZE -> WrongArraySizeError
+        $name =~ s/GRIB_//;         # Remove GRIB_
+        my $name_lc = $name;
+        $name_lc =~ s/_/ /g;        # Remove underscores
+        $name_lc = lc $name_lc;     # lowercase
+        $name_lc =~ s/(\w+)/\u$1/g; # First letter uppercase
+        $name_lc =~ s/ //g;         # Remove spaces
+        $name = $name_lc;
+        if ($name !~ /Error$/) {    # Append Error (unless already there)
+            $name = $name . "Error";
+        }
+        $name = 'FunctionNotImplementedError' if ($name eq 'NotImplementedError');
+        $name = 'MessageEndNotFoundError'     if ($name eq '7777NotFoundError');
+        $name = 'IOProblemError'              if ($name eq 'IoProblemError');
+        $name = 'MessageInvalidError'         if ($name eq 'InvalidMessageError');
+        $name = 'GeocalculusError'            if ($name eq 'GeocalculusProblemError');
+        $name = 'InvalidOrderByError'         if ($name eq 'InvalidOrderbyError');
+        $name = 'InvalidBitsPerValueError'    if ($name eq 'InvalidBpvError');
+        $name = 'KeyValueNotFoundError'       if ($name eq 'NotFoundError');
+        $name = 'MemoryAllocationError'       if ($name eq 'OutOfMemoryError');
+
+        if ($code != 0) { # Ignore SUCCESS
+            print H "class ${name}(GribInternalError):\n";  ## $name,$_;
+            print H "    \"\"\"${text}.\"\"\"\n";
+
+            $errmap{$code} = $name; # store for next loop
+        }
+    }
+
+    print H "\nERROR_MAP = {\n";
+    my $i = 0;
+    my $size = keys %errmap;
+    for my $code (sort { $a <=> $b } keys %errmap) {
+        next if ($code == 0);
+        $i++;
+        my $ktext = sprintf("%-3d", $code);
+        print H "    $ktext : $errmap{$code}";
+        print H ",\n" if ($i < $size);
+    }
+    print H "\n}\n\n";
+
+    # Footer
+    my $footer = <<'END_FOOTER';
+
+def raise_grib_error(errid):
+    """
+    Raise the GribInternalError corresponding to ``errid``.
+    """
+    raise ERROR_MAP[errid](errid)
+END_FOOTER
+    print H $footer;
+
+    close(H);
+}
+
 
 sub write_python_errors {
     my $errdict = shift;
@@ -45,15 +143,19 @@ sub write_python_errors {
 sub write_F90_errors {
     my $errdict = shift;
 
-    open(F,">grib_api_constants.h.new") or die "grib_api_constants.h.new: $!";
+    open(F1,">grib_api_constants.h.new") or die "grib_api_constants.h.new: $!";
+    open(F2,">eccodes_constants.h.new") or die "eccodes_constants.h.new: $!";
 
     foreach (sort {$a<=>$b} keys %{$errdict}){
-        printf F "  integer, parameter,public :: %-50s = %d\n",
-            $errdict->{$_}{name},$_;
+        my $name = $errdict->{$_}{name};
+        printf F1 "  integer, parameter,public :: %-50s = %d\n", $name,$_;
+        (my $eccodes_name = $name) =~ s/GRIB_/CODES_/;
+        printf F2 "  integer, parameter,public :: %-50s = %d\n", $eccodes_name,$_;
     }
-    printf F "  integer, parameter,public :: %-50s = %d\n","GRIB_NULL",-1;
-
-    close(F);
+    printf F1 "  integer, parameter,public :: %-50s = %d\n","GRIB_NULL",-1;
+    printf F2 "  integer, parameter,public :: %-50s = %d\n","CODES_NULL",-1;
+    close(F1);
+    close(F2);
 }
 
 sub write_C_errors {
@@ -86,28 +188,47 @@ sub write_public {
     my $errdict = shift;
 
     open(GAH,"<grib_api.h") or die "grib_api.h: $!";
-    open(H,">grib_api.h.new") or die "grib_api.h.new: $!";
+    open(ECH,"<eccodes.h") or die "eccodes.h: $!";
+
+    open(H1,">grib_api.h.new") or die "grib_api.h.new: $!";
+    open(H2,">eccodes.h.new") or die "eccodes.h.new: $!";
+
     open(IN,"<grib_api.h.in") or die "grib_api.h.in: $!";
 
     foreach (<GAH>) {
         last if /This part is automatically generated/;
-        print H;
+        print H1;
+    }
+    foreach (<ECH>) {
+        last if /This part is automatically generated/;
+        print H2;
     }
 
     foreach (<IN>) {
         if (/^!ERRORS/) {
             foreach my $code (reverse sort {$a<=>$b} keys %{$errdict}) {
                 my $desc = $errdict->{$code};
-                print H "/** $desc->{text} */\n";
-                print H "#define $desc->{name}\t\t$code\n";
+                my $name = $desc->{name};
+                print H1 "/** $desc->{text} */\n";
+                print H1 "#define ${name}\t\t$code\n";
+
+                print H2 "/** $desc->{text} */\n";
+                (my $ecc_name = $name) =~ s/GRIB_/CODES_/;
+                print H2 "#define ${ecc_name}\t\t${name}\n";
             }
         } else {
-            print H;
+            print H1;
+            # For eccodes.h, replace grib_api with eccodes
+            s/grib_errors_H/eccodes_errors_H/ if (/grib_errors_H/);
+            s/grib_api functions/eccodes functions/ if (/returned by the grib_api functions/);
+            print H2;
         }
     }
 
     close(GAH);
-    close(H);
+    close(ECH);
+    close(H1);
+    close(H2);
     close(IN);
 }
 
diff --git a/src/expression.class b/src/expression.class
index 378155b..ccd113b 100644
--- a/src/expression.class
+++ b/src/expression.class
@@ -7,7 +7,6 @@ static void        init(grib_expression* e);
 static void        destroy(grib_context*,grib_expression* e);
 
 static void        print(grib_context*,grib_expression*,grib_handle*);
-static void        compile(grib_expression*,grib_compiler*);
 static void        add_dependency(grib_expression* e, grib_accessor* observer);
 static string get_name(grib_expression* e);
 
@@ -33,7 +32,6 @@ static grib_expression_class _grib_expression_class_NAME = {
     &init,                     /* constructor               */
     &destroy,                  /* destructor                */
     &print,                 
-    &compile,                 
     &add_dependency,       
 
 	&native_type,
diff --git a/src/extrules.am b/src/extrules.am
index 99b4d14..7da2a36 100644
--- a/src/extrules.am
+++ b/src/extrules.am
@@ -3,10 +3,13 @@
 
 grib_errors.c : grib_errors.txt errors.pl
 	./errors.pl
-	cmp grib_errors.c grib_errors.c.new || (cp grib_errors.c.new grib_errors.c)
-	cmp grib_api.h grib_api.h.new       || (cp grib_api.h.new grib_api.h)
-	cmp ../fortran/grib_api_constants.h grib_api_constants.h.new || (cp grib_api_constants.h.new ../fortran/grib_api_constants.h)
-	cmp ../python/grib_errors.h grib_errors.h.new || (cp grib_errors.h.new ../python/grib_errors.h)
+	cmp -s grib_errors.c grib_errors.c.new || (cp grib_errors.c.new grib_errors.c)
+	cmp -s grib_api.h grib_api.h.new       || (cp grib_api.h.new grib_api.h)
+	cmp -s eccodes.h eccodes.h.new         || (mv eccodes.h.new eccodes.h)
+	cmp -s ../fortran/grib_api_constants.h grib_api_constants.h.new || (mv grib_api_constants.h.new ../fortran/grib_api_constants.h)
+	cmp -s ../fortran/eccodes_constants.h  eccodes_constants.h.new  || (mv eccodes_constants.h.new  ../fortran/eccodes_constants.h)
+	cmp -s ../python/grib_errors.h grib_errors.h.new || (mv grib_errors.h.new ../python/grib_errors.h)
+	cmp -s ../python/gribapi/errors.py errors.py.new || (mv errors.py.new ../python/gribapi/errors.py)
 
 
 proto:;-chmod +w grib_api_prototypes.h; mkptypes -A $(libeccodes_la_prototypes) $(libeccodes_extra_prototypes) > temp && mv temp grib_api_prototypes.h;rm -f temp
diff --git a/src/functions.c b/src/functions.c
index b096b1f..80e6005 100644
--- a/src/functions.c
+++ b/src/functions.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib2c.pl b/src/grib2c.pl
index c3c521f..20278bc 100755
--- a/src/grib2c.pl
+++ b/src/grib2c.pl
@@ -1,5 +1,5 @@
 #!/usr/bin/perl
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_2order_packer_simple.c b/src/grib_2order_packer_simple.c
index f576750..6815239 100644
--- a/src/grib_2order_packer_simple.c
+++ b/src/grib_2order_packer_simple.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -10,54 +10,59 @@
 
 #include "grib_api_internal.h"
 
-static unsigned long calc_pow_2(unsigned long op){
-  unsigned long a = 1;
-  while(op--) a*=2;
-  return a;
+static unsigned long calc_pow_2(unsigned long op)
+{
+    unsigned long a = 1;
+    while(op--) a*=2;
+    return a;
 }
 
-static int calc_bits_needed(unsigned long spread){
-  int nbit = 0;
-  if (spread == 0) return nbit;
-  while (spread>0){
-    spread/=2;
-    nbit++;
-  }
-  return nbit;
+static int calc_bits_needed(unsigned long spread)
+{
+    int nbit = 0;
+    if (spread == 0) return nbit;
+    while (spread>0){
+        spread/=2;
+        nbit++;
+    }
+    return nbit;
 }
 
-static int find_next_group(const unsigned long* vals, size_t len, unsigned long w, unsigned long l,unsigned long* nbits, unsigned long* groupsize, long* r_val){
-  long lmin = 0;
-  long lmax = 0;
-
-  size_t i = 0;
-  if  (len <=0 ) return GRIB_ARRAY_TOO_SMALL;
-  lmin = vals[0];
-  lmax = lmin;
-
-  while(i < len){
-    if(vals[i] < lmin) lmin = vals[i];
-    if(vals[i] > lmax) lmax = vals[i];
-    Assert((lmax-lmin) >= 0);
-    *nbits = calc_bits_needed(lmax-lmin);
-    *r_val = lmin;
-    i++;
-    *groupsize = i;
-
-    if(*groupsize > l-2) return GRIB_SUCCESS;
-    if(*nbits     > w-2) return GRIB_SUCCESS;
-  }
-
-  return GRIB_SUCCESS;
+static int find_next_group(const unsigned long* vals, size_t len, unsigned long w, unsigned long l,unsigned long* nbits, unsigned long* groupsize, long* r_val)
+{
+    long lmin = 0;
+    long lmax = 0;
+
+    size_t i = 0;
+    if  (len <=0 ) return GRIB_ARRAY_TOO_SMALL;
+    lmin = vals[0];
+    lmax = lmin;
+
+    while(i < len) {
+        if      (vals[i] > lmax) lmax = vals[i];
+        else if (vals[i] < lmin) lmin = vals[i];
+        Assert((lmax-lmin) >= 0);
+        *nbits = calc_bits_needed(lmax-lmin);
+        *r_val = lmin;
+        i++;
+        *groupsize = i;
+
+        if(*groupsize > l-2) return GRIB_SUCCESS;
+        if(*nbits     > w-2) return GRIB_SUCCESS;
+    }
+
+    return GRIB_SUCCESS;
 }
 
-void grib_free_second_order_groups(grib_context *c,second_order_packed* sp){
-  if(!sp) return;
-  grib_context_free(c,sp->array_of_group_size);
-  grib_context_free(c,sp->array_of_group_refs);
-  grib_context_free(c,sp->array_of_group_width);
-  grib_context_free(c,sp);
+void grib_free_second_order_groups(grib_context *c,second_order_packed* sp)
+{
+    if(!sp) return;
+    grib_context_free(c,sp->array_of_group_size);
+    grib_context_free(c,sp->array_of_group_refs);
+    grib_context_free(c,sp->array_of_group_width);
+    grib_context_free(c,sp);
 }
+
 second_order_packed* grib_get_second_order_groups(grib_context *c, const unsigned long* vals, size_t len)
 {
     second_order_packed* s = (second_order_packed*)grib_context_malloc_clear(c,sizeof(second_order_packed));
@@ -73,31 +78,30 @@ second_order_packed* grib_get_second_order_groups(grib_context *c, const unsigne
     s->nbits_per_widths       = 4;
     s->size_of_group_array    = 0;
 
-  while(find_next_group(group_val, nv, calc_pow_2(s->nbits_per_widths), calc_pow_2(s->nbits_per_group_size ), &nbit_per_group, &size_of_group,  &ref_of_group) == GRIB_SUCCESS){
-    s->size_of_group_array += 1;
-    nv                   -= size_of_group;
-    group_val            += size_of_group;
+    while(find_next_group(group_val, nv, calc_pow_2(s->nbits_per_widths), calc_pow_2(s->nbits_per_group_size ), &nbit_per_group, &size_of_group,  &ref_of_group) == GRIB_SUCCESS){
+        s->size_of_group_array += 1;
+        nv                   -= size_of_group;
+        group_val            += size_of_group;
         s->packed_byte_count += size_of_group*nbit_per_group;
-  }
+    }
     s->packed_byte_count     =  ((s->packed_byte_count+7)/8);
 
     s->array_of_group_size  = (unsigned long*)grib_context_malloc_clear(c,sizeof(unsigned long)*s->size_of_group_array);
     s->array_of_group_width = (unsigned long*)grib_context_malloc_clear(c,sizeof(unsigned long)*s->size_of_group_array);
     s->array_of_group_refs  = (long*)grib_context_malloc_clear(c,sizeof( long)*s->size_of_group_array);
 
-     group_val = vals;
-     nv = len;
+    group_val = vals;
+    nv = len;
 
-  while(find_next_group(group_val, nv, calc_pow_2(s->nbits_per_widths), calc_pow_2(s->nbits_per_group_size ), &nbit_per_group, &size_of_group,  &ref_of_group) == GRIB_SUCCESS){
-    nv                   -= size_of_group;
-    group_val            += size_of_group;
+    while(find_next_group(group_val, nv, calc_pow_2(s->nbits_per_widths), calc_pow_2(s->nbits_per_group_size ), &nbit_per_group, &size_of_group,  &ref_of_group) == GRIB_SUCCESS){
+        nv                   -= size_of_group;
+        group_val            += size_of_group;
         Assert(i<s->size_of_group_array);
-    s->array_of_group_size[i]  = size_of_group;
-    s->array_of_group_width[i] = nbit_per_group;
-    s->array_of_group_refs[i]  = ref_of_group;
-    i++;
-
-  }
+        s->array_of_group_size[i]  = size_of_group;
+        s->array_of_group_width[i] = nbit_per_group;
+        s->array_of_group_refs[i]  = ref_of_group;
+        i++;
+    }
 
-  return s;
+    return s;
 }
diff --git a/src/grib_accessor.c b/src/grib_accessor.c
index 4b9ee51..1242ea8 100644
--- a/src/grib_accessor.c
+++ b/src/grib_accessor.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -503,6 +503,7 @@ void grib_accessor_delete(grib_context *ct, grib_accessor* a)
         }
         c = s;
     }
+    /*printf("Debug: grib_accessor_delete a=%p (%s)\n", (void*)a, a->name);*/
     grib_context_free(ct,a);
 }
 
@@ -779,7 +780,7 @@ grib_accessors_list* grib_accessors_list_create(grib_context* c)
     return (grib_accessors_list*)grib_context_malloc_clear(c,sizeof(grib_accessors_list));
 }
 
-void grib_accessors_list_push(grib_accessors_list* al,grib_accessor* a)
+void grib_accessors_list_push(grib_accessors_list* al,grib_accessor* a,int rank)
 {
     grib_accessors_list* last;
     grib_context* c=a->context;
@@ -789,9 +790,11 @@ void grib_accessors_list_push(grib_accessors_list* al,grib_accessor* a)
         last->next=(grib_accessors_list*)grib_context_malloc_clear(c,sizeof(grib_accessors_list));
         last->next->accessor=a;
         last->next->prev=last;
+        last->next->rank=rank;
         al->last=last->next;
     } else {
         al->accessor=a;
+        al->rank=rank;
         al->last=al;
     }
 }
diff --git a/src/grib_accessor_class.c b/src/grib_accessor_class.c
index b3ab70b..173fcde 100644
--- a/src/grib_accessor_class.c
+++ b/src/grib_accessor_class.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -222,12 +222,12 @@ void grib_push_accessor(grib_accessor* a, grib_block_of_accessors* l)
     }
     l->last = a;
 
-
     if (grib_handle_of_accessor(a)->use_trie) {
         if (*(a->all_names[0]) != '_') {
             id=grib_hash_keys_get_id(a->context->keys,a->all_names[0]);
-
-
+#ifdef DEBUG
+            Assert(id >=0 && id < ACCESSORS_ARRAY_SIZE);
+#endif
             a->same=grib_handle_of_accessor(a)->accessors[id];
             link_same_attributes(a,a->same);
             grib_handle_of_accessor(a)->accessors[id]=a;
diff --git a/src/grib_accessor_class_abstract_long_vector.c b/src/grib_accessor_class_abstract_long_vector.c
index 58f58f7..f858b80 100644
--- a/src/grib_accessor_class_abstract_long_vector.c
+++ b/src/grib_accessor_class_abstract_long_vector.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_abstract_vector.c b/src/grib_accessor_class_abstract_vector.c
index 90997d6..f2cba51 100644
--- a/src/grib_accessor_class_abstract_vector.c
+++ b/src/grib_accessor_class_abstract_vector.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_apply_operators.c b/src/grib_accessor_class_apply_operators.c
index b181792..df5eef9 100644
--- a/src/grib_accessor_class_apply_operators.c
+++ b/src/grib_accessor_class_apply_operators.c
@@ -1,5 +1,5 @@
 /*
-* Copyright 2005-2016 ECMWF.
+* Copyright 2005-2017 ECMWF.
 *
 * This software is licensed under the terms of the Apache Licence Version 2.0
 * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -182,635 +182,639 @@ static void init_class(grib_accessor_class* c)
 
 #define MAX_DELAYED_REPLICATION_COUNT 1000
 
-static void self_clear(grib_context* c,grib_accessor_apply_operators* self) {
-  size_t i=0;
-  if (!self->expandedAOSize) return;
-
-  grib_context_free(c,self->expandedAO);
-  grib_context_free(c,self->scaleAO);
-  grib_context_free(c,self->referenceAO);
-  grib_context_free(c,self->widthAO);
-  grib_context_free(c,self->bitmapNumber);
-  grib_context_free(c,self->associatedBitmapNumber);
-  grib_context_free(c,self->associatedBitmapIndex);
-  grib_context_free(c,self->associatedInfoNumber);
-
-  for (i=0;i<self->expandedAOSize;i++) {
-    if (!self->abbreviations[i]) break;
-    grib_context_free(c,self->abbreviations[i]);
-    grib_context_free(c,self->types[i]);
-    grib_context_free(c,self->names[i]);
-    grib_context_free(c,self->units[i]);
-  }
-  grib_context_free(c,self->abbreviations);
-  grib_context_free(c,self->types);
-  grib_context_free(c,self->names);
-  grib_context_free(c,self->units);
+static void self_clear(grib_context* c,grib_accessor_apply_operators* self)
+{
+    size_t i=0;
+    if (!self->expandedAOSize) return;
+
+    grib_context_free(c,self->expandedAO);
+    grib_context_free(c,self->scaleAO);
+    grib_context_free(c,self->referenceAO);
+    grib_context_free(c,self->widthAO);
+    grib_context_free(c,self->bitmapNumber);
+    grib_context_free(c,self->associatedBitmapNumber);
+    grib_context_free(c,self->associatedBitmapIndex);
+    grib_context_free(c,self->associatedInfoNumber);
+
+    for (i=0;i<self->expandedAOSize;i++) {
+        if (!self->abbreviations[i]) break;
+        grib_context_free(c,self->abbreviations[i]);
+        grib_context_free(c,self->types[i]);
+        grib_context_free(c,self->names[i]);
+        grib_context_free(c,self->units[i]);
+    }
+    grib_context_free(c,self->abbreviations);
+    grib_context_free(c,self->types);
+    grib_context_free(c,self->names);
+    grib_context_free(c,self->units);
 }
 
 static void init(grib_accessor* a, const long len , grib_arguments* args )
 {
-  grib_accessor_apply_operators* self = (grib_accessor_apply_operators*)a;
-  int n=0;
-  self->expandedDescriptors=grib_arguments_get_name(grib_handle_of_accessor(a),args,n++);
-  self->abbreviation=grib_arguments_get_name(grib_handle_of_accessor(a),args,n++);
-  self->type=grib_arguments_get_name(grib_handle_of_accessor(a),args,n++);
-  self->name=grib_arguments_get_name(grib_handle_of_accessor(a),args,n++);
-  self->unit=grib_arguments_get_name(grib_handle_of_accessor(a),args,n++);
-  self->expandedScale=grib_arguments_get_name(grib_handle_of_accessor(a),args,n++);
-  self->expandedReference=grib_arguments_get_name(grib_handle_of_accessor(a),args,n++);
-  self->expandedWidth=grib_arguments_get_name(grib_handle_of_accessor(a),args,n++);
-  self->index=grib_arguments_get_long(grib_handle_of_accessor(a),args,n++);
-  self->do_compute=1;
-  a->length = 0;
-  self->scaleAO=0;
-  self->expandedAOSize=0;
+    grib_accessor_apply_operators* self = (grib_accessor_apply_operators*)a;
+    int n=0;
+    self->expandedDescriptors=grib_arguments_get_name(grib_handle_of_accessor(a),args,n++);
+    self->abbreviation=grib_arguments_get_name(grib_handle_of_accessor(a),args,n++);
+    self->type=grib_arguments_get_name(grib_handle_of_accessor(a),args,n++);
+    self->name=grib_arguments_get_name(grib_handle_of_accessor(a),args,n++);
+    self->unit=grib_arguments_get_name(grib_handle_of_accessor(a),args,n++);
+    self->expandedScale=grib_arguments_get_name(grib_handle_of_accessor(a),args,n++);
+    self->expandedReference=grib_arguments_get_name(grib_handle_of_accessor(a),args,n++);
+    self->expandedWidth=grib_arguments_get_name(grib_handle_of_accessor(a),args,n++);
+    self->index=grib_arguments_get_long(grib_handle_of_accessor(a),args,n++);
+    self->do_compute=1;
+    a->length = 0;
+    self->scaleAO=0;
+    self->expandedAOSize=0;
 }
 
-
 static void dump(grib_accessor* a, grib_dumper* dumper)
 {
-  int type=get_native_type(a);
+    int type=get_native_type(a);
 
-  switch (type) {
+    switch (type) {
     case GRIB_TYPE_LONG:
-      grib_dump_long(dumper,a,NULL);
-      break;
+        grib_dump_long(dumper,a,NULL);
+        break;
     case GRIB_TYPE_DOUBLE:
-      grib_dump_double(dumper,a,NULL);
-      break;
+        grib_dump_double(dumper,a,NULL);
+        break;
     case GRIB_TYPE_STRING:
-      grib_dump_string_array(dumper,a,NULL);
-      break;
-  }
+        grib_dump_string_array(dumper,a,NULL);
+        break;
+    }
 }
 
-static int  get_native_type(grib_accessor* a){
-  int type=GRIB_TYPE_LONG;
-  if (a->flags & GRIB_ACCESSOR_FLAG_STRING_TYPE)
-    type=GRIB_TYPE_STRING;
-  return type;
+static int  get_native_type(grib_accessor* a)
+{
+    int type=GRIB_TYPE_LONG;
+    if (a->flags & GRIB_ACCESSOR_FLAG_STRING_TYPE)
+        type=GRIB_TYPE_STRING;
+    return type;
 }
 
-size_t compute_size_AO(long* descriptors,size_t numberOfDescriptors) {
-        int i=0;
-        size_t sizeAO=numberOfDescriptors;
-        int extraElement=0;
-        int X,F,Y;
-
-	for (i=0;i<numberOfDescriptors;i++) {
-		F=descriptors[i]/100000;
-		X=(descriptors[i]-F*100000)/1000;
-		Y=(descriptors[i]-F*100000)%1000;
-                if (F==0 && X!=31) sizeAO+=extraElement;
-                if (F==2 && X==4) extraElement= Y ? 1 : 0;
-        }
-        return sizeAO;
-
+size_t compute_size_AO(long* descriptors,size_t numberOfDescriptors)
+{
+    int i=0;
+    size_t sizeAO=numberOfDescriptors;
+    int extraElement=0;
+    int X,F,Y;
+
+    for (i=0;i<numberOfDescriptors;i++) {
+        F=descriptors[i]/100000;
+        X=(descriptors[i]-F*100000)/1000;
+        Y=(descriptors[i]-F*100000)%1000;
+        if (F==0 && X!=31) sizeAO+=extraElement;
+        if (F==2 && X==4) extraElement= Y ? 1 : 0;
+    }
+    return sizeAO;
 }
 
-static void set_bitmap_number(long* descriptors,int *useDefinedBitmap,size_t* i,int* bitmapNumber) {
-  switch (descriptors[(*i)+1]) {
+static void set_bitmap_number(long* descriptors,int *useDefinedBitmap,size_t* i,int* bitmapNumber)
+{
+    switch (descriptors[(*i)+1]) {
     case 236000:
-      *useDefinedBitmap=1;
-      (*bitmapNumber)++;
-      (*i)++;
-      break;
+        *useDefinedBitmap=1;
+        (*bitmapNumber)++;
+        (*i)++;
+        break;
     case 237000:
-      if (! *useDefinedBitmap) (*bitmapNumber)++;
-      (*i)++;
-      break;
+        if (! *useDefinedBitmap) (*bitmapNumber)++;
+        (*i)++;
+        break;
     case 237255:
-      *useDefinedBitmap=0;
-      break;
+        *useDefinedBitmap=0;
+        break;
     default:
-      (*bitmapNumber)++;
-  }
+        (*bitmapNumber)++;
+    }
 }
 
 static void computeDelayedReplication(grib_accessor_apply_operators* self,
-    long* delayedReplication,long* delayedReplicationIndex,long delayedReplicationCount,long index) {
-  long i=0;
-  for (i=0;i<delayedReplicationCount;i++) {
-    if (delayedReplication[i]>0) {
-      self->expandedAO[delayedReplicationIndex[i]]-=1000;
-      delayedReplication[i]--;
+        long* delayedReplication,long* delayedReplicationIndex,long delayedReplicationCount,long index)
+{
+    long i=0;
+    for (i=0;i<delayedReplicationCount;i++) {
+        if (delayedReplication[i]>0) {
+            self->expandedAO[delayedReplicationIndex[i]]-=1000;
+            delayedReplication[i]--;
+        }
     }
-  }
 }
 
-static int apply_operators(grib_accessor* a) {
-	grib_accessor_apply_operators* self = (grib_accessor_apply_operators*)a;
-	grib_context* c=a->context;
-	grib_handle* h=grib_handle_of_accessor(a);
-  int useDefinedBitmap;
-	long* descriptors=0;
-	long* scale=0;
-	long* width=0;
-	long* reference=0;
-  char** abbreviations=0;
-  char** names=0;
-  char** types=0;
-  char** units=0;
-  int bitmapNumber=0;
-  double referenceValueFactor=1;
-  int X,F,Y;
-  long extraWidth=0,extraScale=0,localDescriptorWidth=0;
-	size_t size=0,sizeAO=0,iq=0,numberOfDescriptors;
-	size_t i=0,j=0,ielement=0;
-	int err=0;
-  char* missing="???";
-	long associatedFieldWidth=0;
-	char* firstOrderStatisticsAbbreviation="firstOrderStatistics";
-	char* differenceStatisticsAbbreviation="differenceStatistics";
-	char* associatedFieldAbbreviation="associatedField";
-	char* substitutedValueAbbreviation="substitutedValue";
-	char* associatedFieldName="associated field";
-	char* associatedFieldType="long";
-	char* associatedFieldUnit="CODE TABLE 31021";
-	long associatedFieldDescriptor=99999;
-  long delayedReplication[MAX_DELAYED_REPLICATION_COUNT]={0,};
-  long delayedReplicationIndex[MAX_DELAYED_REPLICATION_COUNT]={0,};
-  long delayedReplicationCount=0;
-  long iassociatedInfoNumber=0;
-  int id=0;
-
-
-  if (!self->do_compute) return GRIB_SUCCESS;
-  self_clear(c,self);
-
-	err=grib_get_size(grib_handle_of_accessor(a),self->expandedDescriptors,&size);
-	if (err) return err;
-  numberOfDescriptors=size;
-
-	descriptors=(long*)grib_context_malloc_clear(c,sizeof(long)*size);
-	scale=(long*)grib_context_malloc_clear(c,sizeof(long)*size);
-	reference=(long*)grib_context_malloc_clear(c,sizeof(long)*size);
-	width=(long*)grib_context_malloc_clear(c,sizeof(long)*size);
-
-	abbreviations=(char**)grib_context_malloc_clear(c,sizeof(char*)*size);
-	types=(char**)grib_context_malloc_clear(c,sizeof(char*)*size);
-	names=(char**)grib_context_malloc_clear(c,sizeof(char*)*size);
-	units=(char**)grib_context_malloc_clear(c,sizeof(char*)*size);
-
-	err=grib_get_string_array(h,self->abbreviation,abbreviations,&size);
-	if (err) return err;
-	err=grib_get_string_array(h,self->type,types,&size);
-	if (err) return err;
-	err=grib_get_string_array(h,self->name,names,&size);
-	if (err) return err;
-	err=grib_get_string_array(h,self->unit,units,&size);
-	if (err) return err;
-
-	err=grib_get_long_array(h,self->expandedDescriptors,descriptors,&size);
-	if (err) return err;
-	err=grib_get_long_array(h,self->expandedScale,scale,&size);
-	if (err) return err;
-	err=grib_get_long_array(h,self->expandedReference,reference,&size);
-	if (err) return err;
-	err=grib_get_long_array(h,self->expandedWidth,width,&size);
-	if (err) return err;
-
-  sizeAO=compute_size_AO(descriptors,numberOfDescriptors);
-	self->expandedAO=(long*)grib_context_malloc_clear(c,sizeof(long)*sizeAO);
-	self->scaleAO=(long*)grib_context_malloc_clear(c,sizeof(long)*sizeAO);
-	self->referenceAO=(double*)grib_context_malloc_clear(c,sizeof(double)*sizeAO);
-	self->widthAO=(long*)grib_context_malloc_clear(c,sizeof(long)*sizeAO);
-	self->bitmapNumber=(long*)grib_context_malloc_clear(c,sizeof(long)*sizeAO);
-	self->associatedBitmapNumber=(long*)grib_context_malloc_clear(c,sizeof(long)*sizeAO);
-	self->associatedBitmapIndex=(long*)grib_context_malloc_clear(c,sizeof(long)*sizeAO);
-	self->associatedInfoNumber=(long*)grib_context_malloc_clear(c,sizeof(long)*sizeAO);
-	self->abbreviations=(char**)grib_context_malloc_clear(c,sizeof(char*)*sizeAO);
-	self->types=(char**)grib_context_malloc_clear(c,sizeof(char*)*sizeAO);
-	self->names=(char**)grib_context_malloc_clear(c,sizeof(char*)*sizeAO);
-	self->units=(char**)grib_context_malloc_clear(c,sizeof(char*)*sizeAO);
-
-	j=0;
-  ielement=0;
-  iassociatedInfoNumber=0;
-	for (i=0;i<numberOfDescriptors;i++) {
-		F=descriptors[i]/100000;
-		X=(descriptors[i]-F*100000)/1000;
-		Y=(descriptors[i]-F*100000)%1000;
-
-		if ( F==2 ) {
-		    /*operators*/
-		    switch (X) {
-          case 1:
-            extraWidth = Y ? Y-128 : 0;
-            computeDelayedReplication(self,delayedReplication,delayedReplicationIndex,delayedReplicationCount,i);
-            break;
-          case 2:
-            extraScale = Y ? Y-128 : 0;
-            computeDelayedReplication(self,delayedReplication,delayedReplicationIndex,delayedReplicationCount,i);
-            break;
-          case 4:
-            /* associated field*/
-            associatedFieldWidth=Y;
-            computeDelayedReplication(self,delayedReplication,delayedReplicationIndex,delayedReplicationCount,i);
-            break;
-          case 6:
-            /*signify data width*/
-            localDescriptorWidth=Y;
-            computeDelayedReplication(self,delayedReplication,delayedReplicationIndex,delayedReplicationCount,i);
-            break;
-          case 7:
-            if (Y) {
-              extraScale = Y;
-              referenceValueFactor=grib_power(Y,10);
-              extraWidth=((10*Y)+2)/3;
-            } else {
-              extraWidth=0;
-              extraScale=0;
-              referenceValueFactor=1;
-            }
-            computeDelayedReplication(self,delayedReplication,delayedReplicationIndex,delayedReplicationCount,i);
-            break;
-          case 22:
-            /*quality information follows*/
-            iq=1;
-            set_bitmap_number(descriptors,&useDefinedBitmap,&i,&bitmapNumber);
-            iassociatedInfoNumber=bitmapNumber;
-            computeDelayedReplication(self,delayedReplication,delayedReplicationIndex,delayedReplicationCount,i);
-            break;
-          case 23:
-            /*substituted values*/
-            switch (Y) {
-              case 0:
-                iq=1;
-                set_bitmap_number(descriptors,&useDefinedBitmap,&i,&bitmapNumber);
-                iassociatedInfoNumber=bitmapNumber;
+static int apply_operators(grib_accessor* a)
+{
+    grib_accessor_apply_operators* self = (grib_accessor_apply_operators*)a;
+    grib_context* c=a->context;
+    grib_handle* h=grib_handle_of_accessor(a);
+    int useDefinedBitmap;
+    long* descriptors=0;
+    long* scale=0;
+    long* width=0;
+    long* reference=0;
+    char** abbreviations=0;
+    char** names=0;
+    char** types=0;
+    char** units=0;
+    int bitmapNumber=0;
+    double referenceValueFactor=1;
+    int X,F,Y;
+    long extraWidth=0,extraScale=0,localDescriptorWidth=0;
+    size_t size=0,sizeAO=0,iq=0,numberOfDescriptors;
+    size_t i=0,j=0,ielement=0;
+    int err=0;
+    char* missing="???";
+    long associatedFieldWidth=0;
+    char* firstOrderStatisticsAbbreviation="firstOrderStatistics";
+    char* differenceStatisticsAbbreviation="differenceStatistics";
+    char* associatedFieldAbbreviation="associatedField";
+    char* substitutedValueAbbreviation="substitutedValue";
+    char* associatedFieldName="associated field";
+    char* associatedFieldType="long";
+    char* associatedFieldUnit="CODE TABLE 31021";
+    long associatedFieldDescriptor=99999;
+    long delayedReplication[MAX_DELAYED_REPLICATION_COUNT]={0,};
+    long delayedReplicationIndex[MAX_DELAYED_REPLICATION_COUNT]={0,};
+    long delayedReplicationCount=0;
+    long iassociatedInfoNumber=0;
+    int id=0;
+
+    if (!self->do_compute) return GRIB_SUCCESS;
+    self_clear(c,self);
+
+    err=grib_get_size(grib_handle_of_accessor(a),self->expandedDescriptors,&size);
+    if (err) return err;
+    numberOfDescriptors=size;
+
+    descriptors=(long*)grib_context_malloc_clear(c,sizeof(long)*size);
+    scale=(long*)grib_context_malloc_clear(c,sizeof(long)*size);
+    reference=(long*)grib_context_malloc_clear(c,sizeof(long)*size);
+    width=(long*)grib_context_malloc_clear(c,sizeof(long)*size);
+
+    abbreviations=(char**)grib_context_malloc_clear(c,sizeof(char*)*size);
+    types=(char**)grib_context_malloc_clear(c,sizeof(char*)*size);
+    names=(char**)grib_context_malloc_clear(c,sizeof(char*)*size);
+    units=(char**)grib_context_malloc_clear(c,sizeof(char*)*size);
+
+    err=grib_get_string_array(h,self->abbreviation,abbreviations,&size);
+    if (err) return err;
+    err=grib_get_string_array(h,self->type,types,&size);
+    if (err) return err;
+    err=grib_get_string_array(h,self->name,names,&size);
+    if (err) return err;
+    err=grib_get_string_array(h,self->unit,units,&size);
+    if (err) return err;
+
+    err=grib_get_long_array(h,self->expandedDescriptors,descriptors,&size);
+    if (err) return err;
+    err=grib_get_long_array(h,self->expandedScale,scale,&size);
+    if (err) return err;
+    err=grib_get_long_array(h,self->expandedReference,reference,&size);
+    if (err) return err;
+    err=grib_get_long_array(h,self->expandedWidth,width,&size);
+    if (err) return err;
+
+    sizeAO=compute_size_AO(descriptors,numberOfDescriptors);
+    self->expandedAO=(long*)grib_context_malloc_clear(c,sizeof(long)*sizeAO);
+    self->scaleAO=(long*)grib_context_malloc_clear(c,sizeof(long)*sizeAO);
+    self->referenceAO=(double*)grib_context_malloc_clear(c,sizeof(double)*sizeAO);
+    self->widthAO=(long*)grib_context_malloc_clear(c,sizeof(long)*sizeAO);
+    self->bitmapNumber=(long*)grib_context_malloc_clear(c,sizeof(long)*sizeAO);
+    self->associatedBitmapNumber=(long*)grib_context_malloc_clear(c,sizeof(long)*sizeAO);
+    self->associatedBitmapIndex=(long*)grib_context_malloc_clear(c,sizeof(long)*sizeAO);
+    self->associatedInfoNumber=(long*)grib_context_malloc_clear(c,sizeof(long)*sizeAO);
+    self->abbreviations=(char**)grib_context_malloc_clear(c,sizeof(char*)*sizeAO);
+    self->types=(char**)grib_context_malloc_clear(c,sizeof(char*)*sizeAO);
+    self->names=(char**)grib_context_malloc_clear(c,sizeof(char*)*sizeAO);
+    self->units=(char**)grib_context_malloc_clear(c,sizeof(char*)*sizeAO);
+
+    j=0;
+    ielement=0;
+    iassociatedInfoNumber=0;
+    for (i=0;i<numberOfDescriptors;i++) {
+        F=descriptors[i]/100000;
+        X=(descriptors[i]-F*100000)/1000;
+        Y=(descriptors[i]-F*100000)%1000;
+
+        if ( F==2 ) {
+            /*operators*/
+            switch (X) {
+            case 1:
+                extraWidth = Y ? Y-128 : 0;
+                computeDelayedReplication(self,delayedReplication,delayedReplicationIndex,delayedReplicationCount,i);
                 break;
-              case 255:
-                self->expandedAO[j]=descriptors[i];
-                self->associatedBitmapIndex[j]=iq;
-                self->associatedBitmapNumber[j]=bitmapNumber;
-                self->abbreviations[j]=grib_context_strdup(c,substitutedValueAbbreviation);
-                self->types[j]=grib_context_strdup(c,missing);
-                self->names[j]=grib_context_strdup(c,missing);
-                self->units[j]=grib_context_strdup(c,missing);
-                iq++;
-                j++;
+            case 2:
+                extraScale = Y ? Y-128 : 0;
+                computeDelayedReplication(self,delayedReplication,delayedReplicationIndex,delayedReplicationCount,i);
                 break;
-              default :
-                grib_context_log(c,GRIB_LOG_FATAL,"operator %d not implemented", (int)descriptors[i]);
-            }
-            break;
-          case 24:
-            /*first order statistical operators values*/
-            switch (Y) {
-              case 0:
-                iq=1;
-                set_bitmap_number(descriptors,&useDefinedBitmap,&i,&bitmapNumber);
-                iassociatedInfoNumber=bitmapNumber;
+            case 4:
+                /* associated field*/
+                associatedFieldWidth=Y;
+                computeDelayedReplication(self,delayedReplication,delayedReplicationIndex,delayedReplicationCount,i);
                 break;
-              case 255:
-                self->expandedAO[j]=descriptors[i];
-                self->associatedBitmapIndex[j]=iq;
-                self->associatedBitmapNumber[j]=bitmapNumber;
-                self->abbreviations[j]=grib_context_strdup(c,firstOrderStatisticsAbbreviation);
-                self->types[j]=grib_context_strdup(c,missing);
-                self->names[j]=grib_context_strdup(c,missing);
-                self->units[j]=grib_context_strdup(c,missing);
-                iq++;
-                j++;
+            case 6:
+                /*signify data width*/
+                localDescriptorWidth=Y;
+                computeDelayedReplication(self,delayedReplication,delayedReplicationIndex,delayedReplicationCount,i);
                 break;
-              default :
-                grib_context_log(c,GRIB_LOG_FATAL,"operator %d not implemented", (int)descriptors[i]);
-            }
-            break;
-          case 25:
-            /*difference statistical operators values*/
-            switch (Y) {
-              case 0:
+            case 7:
+                if (Y) {
+                    extraScale = Y;
+                    referenceValueFactor=grib_power(Y,10);
+                    extraWidth=((10*Y)+2)/3;
+                } else {
+                    extraWidth=0;
+                    extraScale=0;
+                    referenceValueFactor=1;
+                }
+                computeDelayedReplication(self,delayedReplication,delayedReplicationIndex,delayedReplicationCount,i);
+                break;
+            case 22:
+                /*quality information follows*/
                 iq=1;
                 set_bitmap_number(descriptors,&useDefinedBitmap,&i,&bitmapNumber);
                 iassociatedInfoNumber=bitmapNumber;
+                computeDelayedReplication(self,delayedReplication,delayedReplicationIndex,delayedReplicationCount,i);
+                break;
+            case 23:
+                /*substituted values*/
+                switch (Y) {
+                case 0:
+                    iq=1;
+                    set_bitmap_number(descriptors,&useDefinedBitmap,&i,&bitmapNumber);
+                    iassociatedInfoNumber=bitmapNumber;
+                    break;
+                case 255:
+                    self->expandedAO[j]=descriptors[i];
+                    self->associatedBitmapIndex[j]=iq;
+                    self->associatedBitmapNumber[j]=bitmapNumber;
+                    self->abbreviations[j]=grib_context_strdup(c,substitutedValueAbbreviation);
+                    self->types[j]=grib_context_strdup(c,missing);
+                    self->names[j]=grib_context_strdup(c,missing);
+                    self->units[j]=grib_context_strdup(c,missing);
+                    iq++;
+                    j++;
+                    break;
+                default :
+                    grib_context_log(c,GRIB_LOG_FATAL,"operator %d not implemented", (int)descriptors[i]);
+                }
                 break;
-              case 255:
-                self->expandedAO[j]=descriptors[i];
+                case 24:
+                    /*first order statistical operators values*/
+                    switch (Y) {
+                    case 0:
+                        iq=1;
+                        set_bitmap_number(descriptors,&useDefinedBitmap,&i,&bitmapNumber);
+                        iassociatedInfoNumber=bitmapNumber;
+                        break;
+                    case 255:
+                        self->expandedAO[j]=descriptors[i];
+                        self->associatedBitmapIndex[j]=iq;
+                        self->associatedBitmapNumber[j]=bitmapNumber;
+                        self->abbreviations[j]=grib_context_strdup(c,firstOrderStatisticsAbbreviation);
+                        self->types[j]=grib_context_strdup(c,missing);
+                        self->names[j]=grib_context_strdup(c,missing);
+                        self->units[j]=grib_context_strdup(c,missing);
+                        iq++;
+                        j++;
+                        break;
+                    default :
+                        grib_context_log(c,GRIB_LOG_FATAL,"operator %d not implemented", (int)descriptors[i]);
+                    }
+                    break;
+                    case 25:
+                        /*difference statistical operators values*/
+                        switch (Y) {
+                        case 0:
+                            iq=1;
+                            set_bitmap_number(descriptors,&useDefinedBitmap,&i,&bitmapNumber);
+                            iassociatedInfoNumber=bitmapNumber;
+                            break;
+                        case 255:
+                            self->expandedAO[j]=descriptors[i];
+                            self->associatedBitmapIndex[j]=iq;
+                            self->associatedBitmapNumber[j]=bitmapNumber;
+                            self->abbreviations[j]=grib_context_strdup(c,differenceStatisticsAbbreviation);
+                            self->types[j]=grib_context_strdup(c,missing);
+                            self->names[j]=grib_context_strdup(c,missing);
+                            self->units[j]=grib_context_strdup(c,missing);
+                            iq++;
+                            j++;
+                            break;
+                        default :
+                            grib_context_log(c,GRIB_LOG_FATAL,"operator %d not implemented", (int)descriptors[i]);
+                        }
+                        break;
+                        default:
+                            grib_context_log(c,GRIB_LOG_ERROR,"operator %d not implemented",(int)descriptors[i]);
+            }
+        } else if ( F==1 ) {
+            self->expandedAO[j]=descriptors[i];
+            self->abbreviations[j]=grib_context_strdup(c,missing);
+            self->types[j]=grib_context_strdup(c,missing);
+            self->names[j]=grib_context_strdup(c,missing);
+            self->units[j]=grib_context_strdup(c,missing);
+            delayedReplication[delayedReplicationCount]=X;
+            delayedReplicationIndex[delayedReplicationCount]=j;
+            delayedReplicationCount++;
+            Assert(delayedReplicationCount<=MAX_DELAYED_REPLICATION_COUNT);
+            j++;
+        } else {
+            if (localDescriptorWidth) {
+                if (scale[ielement]==GRIB_MISSING_LONG) scale[ielement] = 0 ;
+                if (reference[ielement]==GRIB_MISSING_LONG) reference[ielement]=0;
+                if (width[ielement]==GRIB_MISSING_LONG) width[ielement]=localDescriptorWidth;
+                localDescriptorWidth=0;
+            }
+            if (associatedFieldWidth && X!=31) {
+                self->scaleAO[j]=0;
+                self->referenceAO[j]=0;
+                self->widthAO[j]=associatedFieldWidth;
+                self->abbreviations[j]=grib_context_strdup(c,associatedFieldAbbreviation);
+                self->names[j]=grib_context_strdup(c,associatedFieldName);
+                self->types[j]=grib_context_strdup(c,associatedFieldType);
+                self->units[j]=grib_context_strdup(c,associatedFieldUnit);
+                self->expandedAO[j]=associatedFieldDescriptor;
+
+                for (id=0;id<delayedReplicationCount;id++) delayedReplication[id]--;
+                j++;
+            }
+            if (!strncmp(units[ielement],"CODE",4) || !strncmp(units[ielement],"FLAG",4)) {
+                self->scaleAO[j]=scale[ielement];
+                self->associatedInfoNumber[j]=iassociatedInfoNumber;
+                self->referenceAO[j]=reference[ielement];
+                self->widthAO[j]=width[ielement];
+            } else {
+                self->scaleAO[j]=extraScale+scale[ielement];
+                self->associatedInfoNumber[j]=iassociatedInfoNumber;
+                self->referenceAO[j]=reference[ielement]*referenceValueFactor;
+                self->widthAO[j]=width[ielement]+extraWidth;
+            }
+            self->abbreviations[j]=abbreviations[ielement];
+            self->names[j]=names[ielement];
+            self->types[j]=types[ielement];
+            self->units[j]=units[ielement];
+            self->expandedAO[j]=descriptors[i];
+            /* quality information*/
+            if (X==33) {
                 self->associatedBitmapIndex[j]=iq;
                 self->associatedBitmapNumber[j]=bitmapNumber;
-                self->abbreviations[j]=grib_context_strdup(c,differenceStatisticsAbbreviation);
-                self->types[j]=grib_context_strdup(c,missing);
-                self->names[j]=grib_context_strdup(c,missing);
-                self->units[j]=grib_context_strdup(c,missing);
                 iq++;
-                j++;
-                break;
-              default :
-                grib_context_log(c,GRIB_LOG_FATAL,"operator %d not implemented", (int)descriptors[i]);
             }
-            break;
-          default:
-            grib_context_log(c,GRIB_LOG_ERROR,"operator %d not implemented",(int)descriptors[i]);
-		    }
-		} else if ( F==1 ) {
-			self->expandedAO[j]=descriptors[i];
-      self->abbreviations[j]=grib_context_strdup(c,missing);
-      self->types[j]=grib_context_strdup(c,missing);
-      self->names[j]=grib_context_strdup(c,missing);
-      self->units[j]=grib_context_strdup(c,missing);
-      delayedReplication[delayedReplicationCount]=X;
-      delayedReplicationIndex[delayedReplicationCount]=j;
-      delayedReplicationCount++;
-      Assert(delayedReplicationCount<=MAX_DELAYED_REPLICATION_COUNT);
-      j++;
-		} else {
-      if (localDescriptorWidth) {
-        if (scale[ielement]==GRIB_MISSING_LONG) scale[ielement] = 0 ;
-        if (reference[ielement]==GRIB_MISSING_LONG) reference[ielement]=0;
-        if (width[ielement]==GRIB_MISSING_LONG) width[ielement]=localDescriptorWidth;
-        localDescriptorWidth=0;
-      }
-			if (associatedFieldWidth && X!=31) {
-				self->scaleAO[j]=0;
-				self->referenceAO[j]=0;
-				self->widthAO[j]=associatedFieldWidth;
-				self->abbreviations[j]=grib_context_strdup(c,associatedFieldAbbreviation);
-				self->names[j]=grib_context_strdup(c,associatedFieldName);
-				self->types[j]=grib_context_strdup(c,associatedFieldType);
-				self->units[j]=grib_context_strdup(c,associatedFieldUnit);
-			  self->expandedAO[j]=associatedFieldDescriptor;
-
-        for (id=0;id<delayedReplicationCount;id++) delayedReplication[id]--;
-				j++;
-			}
-      if (!strncmp(units[ielement],"CODE",4) || !strncmp(units[ielement],"FLAG",4)) {
-        self->scaleAO[j]=scale[ielement];
-        self->associatedInfoNumber[j]=iassociatedInfoNumber;
-        self->referenceAO[j]=reference[ielement];
-        self->widthAO[j]=width[ielement];
-      } else {
-        self->scaleAO[j]=extraScale+scale[ielement];
-        self->associatedInfoNumber[j]=iassociatedInfoNumber;
-        self->referenceAO[j]=reference[ielement]*referenceValueFactor;
-        self->widthAO[j]=width[ielement]+extraWidth;
-      }
-        self->abbreviations[j]=abbreviations[ielement];
-        self->names[j]=names[ielement];
-        self->types[j]=types[ielement];
-        self->units[j]=units[ielement];
-        self->expandedAO[j]=descriptors[i];
-      /* quality information*/
-      if (X==33) {
-        self->associatedBitmapIndex[j]=iq;
-        self->associatedBitmapNumber[j]=bitmapNumber;
-        iq++;
-      }
-      /* bitmap */
-      if (X==31 && Y==31) { self->bitmapNumber[j]=bitmapNumber; }
-
-      for (id=0;id<delayedReplicationCount;id++) delayedReplication[id]--;
-      j++;
-      ielement++;
-    }
+            /* bitmap */
+            if (X==31 && Y==31) { self->bitmapNumber[j]=bitmapNumber; }
+
+            for (id=0;id<delayedReplicationCount;id++) delayedReplication[id]--;
+            j++;
+            ielement++;
+        }
 
-	}
-  self->expandedAOSize=j;
-
-  /*{
-  int mycount=1;
-  printf("+++++++++++++++++++++++++++++\n");
-  for (i=0;i<self->expandedAOSize;i++) {
-    printf("%.6ld ",self->expandedAO[i]);
-    if (mycount>15) {mycount=0;printf("\n");}
-    mycount++;
-  }
-  printf("\n");
-  }
-  */
-
-	grib_context_free(c,abbreviations);
-	grib_context_free(c,names);
-	grib_context_free(c,types);
-	grib_context_free(c,units);
-	grib_context_free(c,descriptors);
-	grib_context_free(c,scale);
-	grib_context_free(c,reference);
-	grib_context_free(c,width);
-  self->do_compute=0;
-
-	return err;
+    }
+    self->expandedAOSize=j;
+
+    /* {
+        int mycount=1;
+        printf("+++++++++++++++++++++++++++++\n");
+        for (i=0;i<self->expandedAOSize;i++) {
+            printf("%.6ld ",self->expandedAO[i]);
+            if (mycount>15) {mycount=0;printf("\n");}
+            mycount++;
+        }
+        printf("\n");
+    } */
+
+    grib_context_free(c,abbreviations);
+    grib_context_free(c,names);
+    grib_context_free(c,types);
+    grib_context_free(c,units);
+    grib_context_free(c,descriptors);
+    grib_context_free(c,scale);
+    grib_context_free(c,reference);
+    grib_context_free(c,width);
+    self->do_compute=0;
+
+    return err;
 }
 
-static void long_to_string(grib_context* c,long* v,size_t len,char** val) {
-      size_t i;
-      char tmp[1024]={0,};
-      for (i=0;i<len;i++) {
-           sprintf(tmp,"%ld",v[i]);
-           val[i]=grib_context_strdup(c,tmp);
-      }
+static void long_to_string(grib_context* c,long* v,size_t len,char** val)
+{
+    size_t i;
+    char tmp[1024]={0,};
+    for (i=0;i<len;i++) {
+        sprintf(tmp,"%ld",v[i]);
+        val[i]=grib_context_strdup(c,tmp);
+    }
 }
 
-static void double_to_string(grib_context* c,double* v,size_t len,char** val) {
-      size_t i;
-      char tmp[1024]={0,};
-      for (i=0;i<len;i++) {
-           sprintf(tmp,"%g",v[i]);
-           val[i]=grib_context_strdup(c,tmp);
-      }
+static void double_to_string(grib_context* c,double* v,size_t len,char** val)
+{
+    size_t i;
+    char tmp[1024]={0,};
+    for (i=0;i<len;i++) {
+        sprintf(tmp,"%g",v[i]);
+        val[i]=grib_context_strdup(c,tmp);
+    }
 }
 
 static int unpack_string_array (grib_accessor* a, char** val, size_t *len)
 {
-  grib_accessor_apply_operators* self = (grib_accessor_apply_operators*)a;
-  int ret=0;
-  int i=0;
-  grib_context* c=a->context; 
-
-  ret=apply_operators(a);
-  if (ret) return ret;
-
-  if(*len < self->expandedAOSize)
-  {
-    grib_context_log(a->context, GRIB_LOG_ERROR,
-		    " wrong size (%ld) for %s it contains %d values ",*len, a->name , self->expandedAOSize);
-    *len = 0;
-    return GRIB_ARRAY_TOO_SMALL;
-  }
-
-  *len = self->expandedAOSize;
-  switch (self->index) {
+    grib_accessor_apply_operators* self = (grib_accessor_apply_operators*)a;
+    int ret=0;
+    int i=0;
+    grib_context* c=a->context;
+
+    ret=apply_operators(a);
+    if (ret) return ret;
+
+    if(*len < self->expandedAOSize)
+    {
+        grib_context_log(a->context, GRIB_LOG_ERROR,
+                " wrong size (%ld) for %s it contains %d values ",*len, a->name , self->expandedAOSize);
+        *len = 0;
+        return GRIB_ARRAY_TOO_SMALL;
+    }
+
+    *len = self->expandedAOSize;
+    switch (self->index) {
     case 0:
-            long_to_string(a->context,self->expandedAO,self->expandedAOSize,val);
-            break;
+        long_to_string(a->context,self->expandedAO,self->expandedAOSize,val);
+        break;
     case 1:
-            long_to_string(a->context,self->scaleAO,self->expandedAOSize,val);
-            break;
+        long_to_string(a->context,self->scaleAO,self->expandedAOSize,val);
+        break;
     case 2:
-            double_to_string(a->context,self->referenceAO,self->expandedAOSize,val);
-            break;
+        double_to_string(a->context,self->referenceAO,self->expandedAOSize,val);
+        break;
     case 3:
-            long_to_string(a->context,self->widthAO,self->expandedAOSize,val);
-            break;
+        long_to_string(a->context,self->widthAO,self->expandedAOSize,val);
+        break;
     case 4:
-            long_to_string(a->context,self->bitmapNumber,self->expandedAOSize,val);
-            break;
+        long_to_string(a->context,self->bitmapNumber,self->expandedAOSize,val);
+        break;
     case 5:
-            long_to_string(a->context,self->associatedBitmapNumber,self->expandedAOSize,val);
-            break;
+        long_to_string(a->context,self->associatedBitmapNumber,self->expandedAOSize,val);
+        break;
     case 6:
-            long_to_string(a->context,self->associatedBitmapIndex,self->expandedAOSize,val);
-            break;
+        long_to_string(a->context,self->associatedBitmapIndex,self->expandedAOSize,val);
+        break;
     case 7:
-          for (i=0;i<self->expandedAOSize;i++)
+        for (i=0;i<self->expandedAOSize;i++)
             val[i]=grib_context_strdup(c,self->abbreviations[i]);
-          break;
+        break;
     case 8:
-          for (i=0;i<self->expandedAOSize;i++)
+        for (i=0;i<self->expandedAOSize;i++)
             val[i]=grib_context_strdup(c,self->types[i]);
-          break;
+        break;
     case 9:
-          for (i=0;i<self->expandedAOSize;i++)
+        for (i=0;i<self->expandedAOSize;i++)
             val[i]=grib_context_strdup(c,self->names[i]);
-          break;
+        break;
     case 10:
-          for (i=0;i<self->expandedAOSize;i++)
+        for (i=0;i<self->expandedAOSize;i++)
             val[i]=grib_context_strdup(c,self->units[i]);
-          break;
+        break;
     case 11:
-            long_to_string(a->context,self->associatedInfoNumber,self->expandedAOSize,val);
-            break;
-	default:
-          Assert(0);
-  }
+        long_to_string(a->context,self->associatedInfoNumber,self->expandedAOSize,val);
+        break;
+    default:
+        Assert(0);
+    }
 
-  return GRIB_SUCCESS;
+    return GRIB_SUCCESS;
 }
 
-static int    unpack_long   (grib_accessor* a, long* val, size_t *len)
+static int unpack_long(grib_accessor* a, long* val, size_t *len)
 {
-  grib_accessor_apply_operators* self = (grib_accessor_apply_operators*)a;
-  int ret=0;
-  size_t i;
-
-  ret=apply_operators(a);
-  if (ret) return ret;
-
-  if(*len < self->expandedAOSize)
-  {
-    grib_context_log(a->context, GRIB_LOG_ERROR,
-		    " wrong size (%ld) for %s it contains %d values ",*len, a->name , self->expandedAOSize);
-    *len = 0;
-    return GRIB_ARRAY_TOO_SMALL;
-  }
-
-  *len = self->expandedAOSize;
-  switch (self->index) {
+    grib_accessor_apply_operators* self = (grib_accessor_apply_operators*)a;
+    int ret=0;
+    size_t i;
+
+    ret=apply_operators(a);
+    if (ret) return ret;
+
+    if(*len < self->expandedAOSize)
+    {
+        grib_context_log(a->context, GRIB_LOG_ERROR,
+                " wrong size (%ld) for %s it contains %d values ",*len, a->name , self->expandedAOSize);
+        *len = 0;
+        return GRIB_ARRAY_TOO_SMALL;
+    }
+
+    *len = self->expandedAOSize;
+    switch (self->index) {
     case 0:
-      for (i=0;i<*len;i++) val[i]=self->expandedAO[i];
-		  break;
+        for (i=0;i<*len;i++) val[i]=self->expandedAO[i];
+        break;
     case 1:
-      for (i=0;i<*len;i++) val[i]=self->scaleAO[i];
-		  break;
+        for (i=0;i<*len;i++) val[i]=self->scaleAO[i];
+        break;
     case 2:
-      for (i=0;i<*len;i++) val[i]=self->referenceAO[i];
-		  break;
+        for (i=0;i<*len;i++) val[i]=self->referenceAO[i];
+        break;
     case 3:
-      for (i=0;i<*len;i++) val[i]=self->widthAO[i];
-		  break;
+        for (i=0;i<*len;i++) val[i]=self->widthAO[i];
+        break;
     case 4:
-      for (i=0;i<*len;i++) val[i]=self->bitmapNumber[i];
-		  break;
+        for (i=0;i<*len;i++) val[i]=self->bitmapNumber[i];
+        break;
     case 5:
-      for (i=0;i<*len;i++) val[i]=self->associatedBitmapNumber[i];
-		  break;
+        for (i=0;i<*len;i++) val[i]=self->associatedBitmapNumber[i];
+        break;
     case 6:
-      for (i=0;i<*len;i++) val[i]=self->associatedBitmapIndex[i];
-		  break;
+        for (i=0;i<*len;i++) val[i]=self->associatedBitmapIndex[i];
+        break;
     case 11:
-      for (i=0;i<*len;i++) val[i]=self->associatedInfoNumber[i];
-		  break;
-	default:
-		Assert(0);
-  }
+        for (i=0;i<*len;i++) val[i]=self->associatedInfoNumber[i];
+        break;
+    default:
+        Assert(0);
+    }
 
-  return GRIB_SUCCESS;
+    return GRIB_SUCCESS;
 }
 
-static int    unpack_double   (grib_accessor* a, double* val, size_t *len)
+static int unpack_double(grib_accessor* a, double* val, size_t *len)
 {
-  grib_accessor_apply_operators* self = (grib_accessor_apply_operators*)a;
-  int ret=0;
-  size_t i;
-
-  ret=apply_operators(a);
-  if (ret) return ret;
-
-  if(*len < self->expandedAOSize)
-  {
-    grib_context_log(a->context, GRIB_LOG_ERROR,
-		    " wrong size (%ld) for %s it contains %d values ",*len, a->name , self->expandedAOSize);
-    *len = 0;
-    return GRIB_ARRAY_TOO_SMALL;
-  }
-
-  *len = self->expandedAOSize;
-  switch (self->index) {
-	case 0:
-                  for (i=0;i<*len;i++) val[i]=self->expandedAO[i];
-		  break;
-	case 1:
-                  for (i=0;i<*len;i++) val[i]=self->scaleAO[i];
-		  break;
-	case 2:
-                  for (i=0;i<*len;i++) val[i]=self->referenceAO[i];
-		  break;
-	case 3:
-                  for (i=0;i<*len;i++) val[i]=self->widthAO[i];
-		  break;
-	case 4:
-                  for (i=0;i<*len;i++) val[i]=self->bitmapNumber[i];
-		  break;
-	case 5:
-                  for (i=0;i<*len;i++) val[i]=self->associatedBitmapNumber[i];
-		  break;
-	case 6:
-                  for (i=0;i<*len;i++) val[i]=self->associatedBitmapIndex[i];
-		  break;
-	default: 
-		Assert(0);
-  }
-
-  return GRIB_SUCCESS;
+    grib_accessor_apply_operators* self = (grib_accessor_apply_operators*)a;
+    int ret=0;
+    size_t i;
+
+    ret=apply_operators(a);
+    if (ret) return ret;
+
+    if(*len < self->expandedAOSize)
+    {
+        grib_context_log(a->context, GRIB_LOG_ERROR,
+                " wrong size (%ld) for %s it contains %d values ",*len, a->name , self->expandedAOSize);
+        *len = 0;
+        return GRIB_ARRAY_TOO_SMALL;
+    }
+
+    *len = self->expandedAOSize;
+    switch (self->index) {
+    case 0:
+        for (i=0;i<*len;i++) val[i]=self->expandedAO[i];
+        break;
+    case 1:
+        for (i=0;i<*len;i++) val[i]=self->scaleAO[i];
+        break;
+    case 2:
+        for (i=0;i<*len;i++) val[i]=self->referenceAO[i];
+        break;
+    case 3:
+        for (i=0;i<*len;i++) val[i]=self->widthAO[i];
+        break;
+    case 4:
+        for (i=0;i<*len;i++) val[i]=self->bitmapNumber[i];
+        break;
+    case 5:
+        for (i=0;i<*len;i++) val[i]=self->associatedBitmapNumber[i];
+        break;
+    case 6:
+        for (i=0;i<*len;i++) val[i]=self->associatedBitmapIndex[i];
+        break;
+    default:
+        Assert(0);
+    }
+
+    return GRIB_SUCCESS;
 }
 
-static int    pack_long   (grib_accessor* a, const long* val, size_t *len)
+static int pack_long(grib_accessor* a, const long* val, size_t *len)
 {
-  grib_accessor_apply_operators* self = (grib_accessor_apply_operators*)a;
-  self->do_compute=1;
-  return GRIB_NOT_IMPLEMENTED;
+    grib_accessor_apply_operators* self = (grib_accessor_apply_operators*)a;
+    self->do_compute=1;
+    return GRIB_NOT_IMPLEMENTED;
 }
 
-static int    pack_double   (grib_accessor* a, const double* val, size_t *len)
+static int pack_double(grib_accessor* a, const double* val, size_t *len)
 {
-  grib_accessor_apply_operators* self = (grib_accessor_apply_operators*)a;
-  self->do_compute=1;
-  return GRIB_NOT_IMPLEMENTED;
+    grib_accessor_apply_operators* self = (grib_accessor_apply_operators*)a;
+    self->do_compute=1;
+    return GRIB_NOT_IMPLEMENTED;
 }
 
 static int value_count(grib_accessor* a,long* rlen)
 {
-  int ret=0;
-  grib_accessor_apply_operators* self = (grib_accessor_apply_operators*)a;
-  *rlen=0;
+    int ret=0;
+    grib_accessor_apply_operators* self = (grib_accessor_apply_operators*)a;
+    *rlen=0;
 
-  ret=apply_operators(a);
+    ret=apply_operators(a);
 
-  if (ret) {
-    grib_context_log(a->context,GRIB_LOG_ERROR,
-		    "%s unable to compute size",a->name);
-		    return ret;
-  }
+    if (ret) {
+        grib_context_log(a->context,GRIB_LOG_ERROR,
+                "%s unable to compute size",a->name);
+        return ret;
+    }
 
-  *rlen=self->expandedAOSize;
+    *rlen=self->expandedAOSize;
 
-  return ret;
+    return ret;
 }
 
 static void destroy(grib_context* c,grib_accessor* a)
 {
-  grib_accessor_apply_operators* self = (grib_accessor_apply_operators*)a; 
-  self_clear(c,self);
+    grib_accessor_apply_operators* self = (grib_accessor_apply_operators*)a;
+    self_clear(c,self);
 }
diff --git a/src/grib_accessor_class_array.c b/src/grib_accessor_class_array.c
index 881cbf8..19dc98e 100644
--- a/src/grib_accessor_class_array.c
+++ b/src/grib_accessor_class_array.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_ascii.c b/src/grib_accessor_class_ascii.c
index 343c62f..6fd84d3 100644
--- a/src/grib_accessor_class_ascii.c
+++ b/src/grib_accessor_class_ascii.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_assert.c b/src/grib_accessor_class_assert.c
index 1aae0f9..3f6c748 100644
--- a/src/grib_accessor_class_assert.c
+++ b/src/grib_accessor_class_assert.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_bit.c b/src/grib_accessor_class_bit.c
index 3e75f6f..31895b5 100644
--- a/src/grib_accessor_class_bit.c
+++ b/src/grib_accessor_class_bit.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_bitmap.c b/src/grib_accessor_class_bitmap.c
index 79319a2..6716d87 100644
--- a/src/grib_accessor_class_bitmap.c
+++ b/src/grib_accessor_class_bitmap.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_bits.c b/src/grib_accessor_class_bits.c
index 6b8e8c3..06f37fd 100644
--- a/src/grib_accessor_class_bits.c
+++ b/src/grib_accessor_class_bits.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -170,6 +170,7 @@ static void init(grib_accessor* a,const long l, grib_arguments* c)
     } else {
         self->referenceValuePresent=0;
     }
+    self->scale = 1;
     if (self->referenceValuePresent) {
         self->scale=grib_arguments_get_double(grib_handle_of_accessor(a),c,n++);
     }
@@ -177,7 +178,6 @@ static void init(grib_accessor* a,const long l, grib_arguments* c)
     assert(self->len <= sizeof(long)*8);
 
     a->length=0;
-
 }
 
 static int unpack_long(grib_accessor* a, long* val, size_t *len)
@@ -252,7 +252,6 @@ static int pack_double(grib_accessor* a, const double* val, size_t *len)
 
     lval= round(*val * self->scale) - self->referenceValue;
     return grib_encode_unsigned_longb(p,lval,&start,length);
-
 }
 
 static int pack_long(grib_accessor* a, const long* val, size_t *len)
@@ -265,6 +264,12 @@ static int pack_long(grib_accessor* a, const long* val, size_t *len)
 
     if(*len != 1) return GRIB_WRONG_ARRAY_SIZE;
 
+    if (get_native_type(a) == GRIB_TYPE_DOUBLE) {
+        /* ECC-402 */
+        const double dVal = (double)(*val);
+        return pack_double(a, &dVal, len);
+    }
+
     start  = self->start;
     length = self->len;
 
@@ -288,7 +293,8 @@ static int pack_long(grib_accessor* a, const long* val, size_t *len)
     return grib_encode_unsigned_longb(p,*val,&start,length);
 }
 
-static int  get_native_type(grib_accessor* a){
+static int get_native_type(grib_accessor* a)
+{
     int type=GRIB_TYPE_BYTES;
     grib_accessor_bits* self = (grib_accessor_bits*)a;
 
@@ -298,17 +304,19 @@ static int  get_native_type(grib_accessor* a){
     if (a->flags & GRIB_ACCESSOR_FLAG_LONG_TYPE)
         type=GRIB_TYPE_LONG;
 
-    if (self->referenceValuePresent) 
+    if (self->referenceValuePresent)
         type=GRIB_TYPE_DOUBLE;
 
     return type;
 }
 
-static int unpack_string(grib_accessor*a , char*  v, size_t *len){
+static int unpack_string(grib_accessor*a , char*  v, size_t *len)
+{
     int ret=0;
     double dval=0;
     long lval=0;
     size_t llen=1;
+    grib_accessor_class* super = NULL;
 
     switch (get_native_type(a)) {
     case GRIB_TYPE_LONG:
@@ -324,26 +332,27 @@ static int unpack_string(grib_accessor*a , char*  v, size_t *len){
         break;
 
     default:
-        Assert(0);
+        super = *(a->cclass->super);
+        ret = super->unpack_string(a,v,len);
     }
     return ret;
 }
 
-static long byte_count(grib_accessor* a){
-  grib_context_log(a->context,GRIB_LOG_DEBUG,"byte_count of %s = %ld",a->name,a->length);
-  return a->length;
-
+static long byte_count(grib_accessor* a)
+{
+    grib_context_log(a->context,GRIB_LOG_DEBUG,"byte_count of %s = %ld",a->name,a->length);
+    return a->length;
 }
 
-static int unpack_bytes (grib_accessor* a,unsigned char* buffer, size_t *len) {
-  if (*len < a->length) {
+static int unpack_bytes (grib_accessor* a,unsigned char* buffer, size_t *len)
+{
+    if (*len < a->length) {
+        *len = a->length;
+        return GRIB_ARRAY_TOO_SMALL;
+    }
     *len = a->length;
-    return GRIB_ARRAY_TOO_SMALL;
-  }
-  *len = a->length;
 
-  memcpy(buffer, grib_handle_of_accessor(a)->buffer->data + a->offset, *len);
+    memcpy(buffer, grib_handle_of_accessor(a)->buffer->data + a->offset, *len);
 
-  return GRIB_SUCCESS;
+    return GRIB_SUCCESS;
 }
-
diff --git a/src/grib_accessor_class_bits_per_value.c b/src/grib_accessor_class_bits_per_value.c
index cdbb81c..b4d80f4 100644
--- a/src/grib_accessor_class_bits_per_value.c
+++ b/src/grib_accessor_class_bits_per_value.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_blob.c b/src/grib_accessor_class_blob.c
index a51c6e0..ef06ea5 100644
--- a/src/grib_accessor_class_blob.c
+++ b/src/grib_accessor_class_blob.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_box.c b/src/grib_accessor_class_box.c
index 37bc139..b44e9c3 100644
--- a/src/grib_accessor_class_box.c
+++ b/src/grib_accessor_class_box.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_budgdate.c b/src/grib_accessor_class_budgdate.c
index 7beb3a8..4acb6c9 100644
--- a/src/grib_accessor_class_budgdate.c
+++ b/src/grib_accessor_class_budgdate.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_bufr_data.c b/src/grib_accessor_class_bufr_data.c
index f995ec8..ad44dc7 100644
--- a/src/grib_accessor_class_bufr_data.c
+++ b/src/grib_accessor_class_bufr_data.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_bufr_data_array.c b/src/grib_accessor_class_bufr_data_array.c
index 12fd09f..973a676 100644
--- a/src/grib_accessor_class_bufr_data_array.c
+++ b/src/grib_accessor_class_bufr_data_array.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -62,6 +62,9 @@
    MEMBERS    = int nInputShortReplications
    MEMBERS    = int iInputShortReplications
    MEMBERS    = grib_iarray* iss_list
+   MEMBERS    = grib_trie* dataAccessorsTrie
+   MEMBERS    = grib_trie* dataAccessorsRank
+   MEMBERS    = grib_sarray* tempStrings
 
    END_CLASS_DEF
 
@@ -133,6 +136,9 @@ typedef struct grib_accessor_bufr_data_array {
 	int nInputShortReplications;
 	int iInputShortReplications;
 	grib_iarray* iss_list;
+	grib_trie* dataAccessorsTrie;
+	grib_trie* dataAccessorsRank;
+	grib_sarray* tempStrings;
 } grib_accessor_bufr_data_array;
 
 extern grib_accessor_class* grib_accessor_class_gen;
@@ -225,9 +231,7 @@ static void init_class(grib_accessor_class* c)
 /* Set the error code, if it is bad and we should fail (default case), return */
 /* variable 'err' is assumed to be pointer to int */
 /* If BUFRDC mode is enabled, then we tolerate problems like wrong data section length */
-#define CHECK_END_DATA_RETURN(ctx,b,size)     {*err=check_end_data(ctx,b,size); if (*err!=0 && ctx->bufrdc_mode==0) return; }
-#define CHECK_END_DATA_RETURN_0(ctx,b,size)   {*err=check_end_data(ctx,b,size); if (*err!=0 && ctx->bufrdc_mode==0) return 0; }
-#define CHECK_END_DATA_RETURN_ERR(ctx,b,size) {*err=check_end_data(ctx,b,size); if (*err!=0 && ctx->bufrdc_mode==0) return *err; }
+#define CHECK_END_DATA_RETURN(ctx,b,size,retval) {*err=check_end_data(ctx,b,size); if (*err!=0 && ctx->bufrdc_mode==0) return retval; }
 
 static int process_elements(grib_accessor* a,int flag,long onlySubset,long startSubset,long endSubset);
 
@@ -289,6 +293,8 @@ static void init(grib_accessor* a,const long v, grib_arguments* params)
     cancel_bitmap(self);
     self->expanded=0;
     self->expandedAccessor=0;
+    self->dataAccessorsTrie=0;
+    self->dataAccessorsRank=0;
 
     a->length=0;
     self->bitsToEndData=get_length(a)*8;
@@ -324,7 +330,7 @@ static void self_clear(grib_context* c,grib_accessor_bufr_data_array* self)
     grib_vdarray_delete_content(c,self->numericValues);
     grib_vdarray_delete(c,self->numericValues);
     if(self->stringValues) {
-        /* grib_vsarray_delete_content(c,self->stringValues); */
+        grib_vsarray_delete_content(c,self->stringValues);
         grib_vsarray_delete(c,self->stringValues);
     }
     grib_viarray_delete_content(c,self->elementsDescriptorsIndex);
@@ -388,6 +394,12 @@ grib_accessors_list* accessor_bufr_data_array_get_dataAccessors(grib_accessor* a
     return self->dataAccessors;
 }
 
+grib_trie* accessor_bufr_data_array_get_dataAccessorsTrie(grib_accessor* a)
+{
+    grib_accessor_bufr_data_array *self =(grib_accessor_bufr_data_array*)a;
+    return self->dataAccessorsTrie;
+}
+
 void accessor_bufr_data_array_set_unpackMode(grib_accessor* a,int unpackMode)
 {
     grib_accessor_bufr_data_array *self =(grib_accessor_bufr_data_array*)a;
@@ -404,6 +416,7 @@ static int get_descriptors(grib_accessor* a)
     if (!self->expandedAccessor)
         self->expandedAccessor=grib_find_accessor(grib_handle_of_accessor(a),self->expandedDescriptorsName);
     self->expanded=grib_accessor_class_expanded_descriptors_get_expanded(self->expandedAccessor,&ret);
+    if (ret != GRIB_SUCCESS) return ret;
 
     numberOfDescriptors=grib_bufr_descriptors_array_used_size(self->expanded);
     self->canBeMissing=(int*)grib_context_malloc_clear(c,numberOfDescriptors*sizeof(int));
@@ -417,9 +430,11 @@ static int get_descriptors(grib_accessor* a)
     return ret;
 }
 
-static void decode_string_array(grib_context* c,unsigned char* data,long* pos, bufr_descriptor* bd,
-        grib_accessor_bufr_data_array* self,int *err)
+static int decode_string_array(grib_context* c, unsigned char* data, long* pos, bufr_descriptor* bd,
+        grib_accessor_bufr_data_array* self)
 {
+    int ret=0;
+    int* err = &ret;
     char* sval=0;
     int j,modifiedWidth,width;
     grib_sarray* sa=grib_sarray_new(c,self->numberOfSubsets,10);
@@ -427,26 +442,26 @@ static void decode_string_array(grib_context* c,unsigned char* data,long* pos, b
     modifiedWidth= bd->width;
 
     sval=(char*)grib_context_malloc_clear(c,modifiedWidth/8+1);
-    CHECK_END_DATA_RETURN(c,self,modifiedWidth);
+    CHECK_END_DATA_RETURN(c, self, modifiedWidth, *err);
     if (*err) {
       grib_sarray_push(c,sa,sval);
       grib_vsarray_push(c,self->stringValues,sa);
-      return;
+      return ret;
     }
     grib_decode_string(data,pos,modifiedWidth/8,sval);
-    CHECK_END_DATA_RETURN(c,self,6);
+    CHECK_END_DATA_RETURN(c, self, 6, *err);
     if (*err) {
       grib_sarray_push(c,sa,sval);
       grib_vsarray_push(c,self->stringValues,sa);
-      return;
+      return ret;
     }
     width=grib_decode_unsigned_long(data,pos,6);
     if (width) {
-        CHECK_END_DATA_RETURN(c,self,width*8*self->numberOfSubsets);
+        CHECK_END_DATA_RETURN(c, self, width*8*self->numberOfSubsets, *err);
       if (*err) {
         grib_sarray_push(c,sa,sval);
         grib_vsarray_push(c,self->stringValues,sa);
-        return;
+        return ret;
       }
       grib_context_free(c,sval);
       for (j=0;j<self->numberOfSubsets;j++) {
@@ -458,6 +473,7 @@ static void decode_string_array(grib_context* c,unsigned char* data,long* pos, b
       grib_sarray_push(c,sa,sval);
     }
     grib_vsarray_push(c,self->stringValues,sa);
+    return ret;
 }
 
 static grib_darray* decode_double_array(grib_context* c,unsigned char* data,long* pos,
@@ -476,7 +492,7 @@ static grib_darray* decode_double_array(grib_context* c,unsigned char* data,long
     modifiedFactor= bd->factor;
     modifiedWidth= bd->width;
 
-    CHECK_END_DATA_RETURN_0(c,self,modifiedWidth+6);
+    CHECK_END_DATA_RETURN(c, self, modifiedWidth+6, NULL);
     if (*err) {
       dval=GRIB_MISSING_DOUBLE;
       lval=0;
@@ -492,7 +508,7 @@ static grib_darray* decode_double_array(grib_context* c,unsigned char* data,long
     grib_context_log(c, GRIB_LOG_DEBUG,"BUFR data decoding: \tlocalWidth=%ld",localWidth);
     ret=grib_darray_new(c,100,100);
     if (localWidth) {
-        CHECK_END_DATA_RETURN_0(c,self,localWidth*self->numberOfSubsets);
+        CHECK_END_DATA_RETURN(c, self, localWidth*self->numberOfSubsets, NULL);
         if (*err) {
           dval=GRIB_MISSING_DOUBLE;
           lval=0;
@@ -583,12 +599,13 @@ static int encode_double_array(grib_context* c,grib_buffer* buff,long* pos, bufr
     double localRange,modifiedFactor,inverseFactor;
     size_t ii;
     int nvals = 0;
-    double min,max,maxAllowed,minAllowed;
+    double min=0,max=0,maxAllowed,minAllowed;
     double* v=NULL;
     double* values=NULL;
     int thereIsAMissing=0;
     int is_constant;
     double val0;
+    const int dont_fail_if_out_of_range = c->bufr_set_to_missing_if_out_of_range;/* ECC-379 */
 
     if (self->iss_list==NULL) return GRIB_INTERNAL_ERROR;
 
@@ -608,7 +625,7 @@ static int encode_double_array(grib_context* c,grib_buffer* buff,long* pos, bufr
     v=dvalues->v;
 
     /* is constant */
-    if (grib_darray_is_constant(dvalues)) {
+    if (grib_darray_is_constant(dvalues,modifiedFactor*.5)) {
         localWidth=0;
         grib_buffer_set_ulength_bits(c,buff,buff->ulength_bits+modifiedWidth);
         if (*v == GRIB_MISSING_DOUBLE) {
@@ -623,7 +640,7 @@ static int encode_double_array(grib_context* c,grib_buffer* buff,long* pos, bufr
     }
 
     if (nvals>grib_darray_used_size(dvalues)) return GRIB_ARRAY_TOO_SMALL;
-    values=grib_context_malloc_clear(c,sizeof(double)*nvals);
+    values=(double*)grib_context_malloc_clear(c,sizeof(double)*nvals);
     val0=dvalues->v[self->iss_list->v[0]];
     is_constant=1;
     for (i=0;i<nvals;i++) {
@@ -653,8 +670,31 @@ static int encode_double_array(grib_context* c,grib_buffer* buff,long* pos, bufr
         v++;
         ii++;
     }
-    min=*v;
-    max=*v;
+    /* ECC-379: First determine if we need to change any out-of-range value */
+    if (dont_fail_if_out_of_range) {
+        while (ii<nvals) {
+            /* Turn out-of-range values into 'missing' */
+            if (*v!=GRIB_MISSING_DOUBLE && (*v < minAllowed || *v > maxAllowed)) {
+                grib_context_log(c, GRIB_LOG_ERROR, "encode_double_array: %s. Value at index %ld (%g) out of range (minAllowed=%g, maxAllowed=%g)."
+                                                    "Setting it to missing value\n",
+                                                    bd->shortName, (long)ii, *v, minAllowed, maxAllowed);
+                *v = GRIB_MISSING_DOUBLE;
+            }
+            ii++;
+            v++;
+        }
+    }
+    /* Determine min and max values. */
+    /* Note: value[0] could be missing so cannot set min/max to this.
+     * Find first value which is non-missing as a starting point */
+    for (i=0;i<nvals;i++) {
+        if (values[i] != GRIB_MISSING_DOUBLE) {
+            min = max = values[i];
+            break;
+        }
+    }
+    ii=0;
+    v=values;
     while (ii<nvals) {
         if (*v<min && *v!=GRIB_MISSING_DOUBLE) min=*v;
         if (*v>max && *v!=GRIB_MISSING_DOUBLE) max=*v;
@@ -662,9 +702,9 @@ static int encode_double_array(grib_context* c,grib_buffer* buff,long* pos, bufr
         ii++;
         v++;
     }
-    if (max>maxAllowed && max!=GRIB_MISSING_DOUBLE) 
+    if (max>maxAllowed && max!=GRIB_MISSING_DOUBLE)
         return GRIB_OUT_OF_RANGE;
-    if (min<minAllowed && min!=GRIB_MISSING_DOUBLE) 
+    if (min<minAllowed && min!=GRIB_MISSING_DOUBLE)
         return GRIB_OUT_OF_RANGE;
 
     reference=round(min*inverseFactor);
@@ -678,7 +718,7 @@ static int encode_double_array(grib_context* c,grib_buffer* buff,long* pos, bufr
             localWidth++;
             allone=grib_power(localWidth,2)-1;
         }
-        if (localWidth == 1 ) localWidth++;
+        if (localWidth == 1) localWidth++;
     } else {
         if (thereIsAMissing==1) localWidth=1;
         else localWidth=0;
@@ -723,18 +763,30 @@ static int encode_double_value(grib_context* c,grib_buffer* buff,long* pos,bufr_
     int err=0;
     int modifiedWidth,modifiedReference;
     double modifiedFactor;
+    const int dont_fail_if_out_of_range = c->bufr_set_to_missing_if_out_of_range; /* ECC-379 */
 
     modifiedReference= bd->reference;
     modifiedFactor= bd->factor;
     modifiedWidth= bd->width;
+    maxAllowed=(grib_power(modifiedWidth,2)+modifiedReference)*modifiedFactor;
+    minAllowed=modifiedReference*modifiedFactor;
 
     grib_buffer_set_ulength_bits(c,buff,buff->ulength_bits+modifiedWidth);
     if (value==GRIB_MISSING_DOUBLE) {
         grib_set_bits_on(buff->data,pos,modifiedWidth);
-    } else {
-        maxAllowed=(grib_power(modifiedWidth,2)+modifiedReference)*modifiedFactor;
-        minAllowed=modifiedReference*modifiedFactor;
-        if (value>maxAllowed || value<minAllowed) return GRIB_OUT_OF_RANGE;
+    }
+    else if (value>maxAllowed || value<minAllowed) {
+        if (dont_fail_if_out_of_range) {
+            grib_context_log(c, GRIB_LOG_ERROR, "encode_double_value: %s. Value (%g) out of range (minAllowed=%g, maxAllowed=%g)."
+                                                "Setting it to missing value\n",
+                                                bd->shortName, value, minAllowed, maxAllowed);
+            value = GRIB_MISSING_DOUBLE;  /* Ignore the bad value and instead use 'missing' */
+            grib_set_bits_on(buff->data,pos,modifiedWidth);
+        } else {
+            return GRIB_OUT_OF_RANGE;
+        }
+    }
+    else {
         lval=round(value/modifiedFactor)-modifiedReference;
         grib_encode_unsigned_longb(buff->data,lval,pos,modifiedWidth);
     }
@@ -766,7 +818,7 @@ static char* decode_string_value(grib_context* c,unsigned char* data,long* pos,
 
     len= bd->width / 8;
 
-    CHECK_END_DATA_RETURN_0(c,self,bd->width);
+    CHECK_END_DATA_RETURN(c, self, bd->width, NULL);
     sval=(char*)grib_context_malloc_clear(c,len+1);
     if (*err) {*err=0; return sval;}
     grib_decode_string(data,pos,len,sval);
@@ -791,7 +843,7 @@ static double decode_double_value(grib_context* c,unsigned char* data,long* pos,
     modifiedFactor= bd->factor;
     modifiedWidth= bd->width;
 
-    CHECK_END_DATA_RETURN_0(c,self,modifiedWidth);
+    CHECK_END_DATA_RETURN(c, self, modifiedWidth, 0);
     if (*err) {*err=0; return GRIB_MISSING_DOUBLE;}
 
     lval=grib_decode_unsigned_long(data,pos,modifiedWidth);
@@ -821,7 +873,7 @@ static int decode_element(grib_context* c,grib_accessor_bufr_data_array* self,in
     if (bd->type==BUFR_DESCRIPTOR_TYPE_STRING) {
         /* string */
         if (self->compressedData) {
-            decode_string_array(c,data,pos,bd,self,&err);
+            err = decode_string_array(c,data,pos,bd,self);
             index=grib_vsarray_used_size(self->stringValues);
             dar=grib_darray_new(c,self->numberOfSubsets,10);
             index=self->numberOfSubsets*(index-1);
@@ -872,7 +924,7 @@ static int decode_replication(grib_context* c,grib_accessor_bufr_data_array* sel
             i,self->expanded->v[i]->code,self->expanded->v[i]->width);
     if (self->compressedData) {
         grib_context_log(c, GRIB_LOG_DEBUG,"BUFR data decoding: \tdelayed replication localReference width=%ld", descriptors[i]->width);
-        CHECK_END_DATA_RETURN_ERR(c,self,descriptors[i]->width+6);
+        CHECK_END_DATA_RETURN(c, self, descriptors[i]->width+6, *err);
         if (*err) {
           *numberOfRepetitions=0;
         } else {
@@ -888,7 +940,7 @@ static int decode_replication(grib_context* c,grib_accessor_bufr_data_array* sel
           }
         }
     } else {
-        CHECK_END_DATA_RETURN_ERR(c,self,descriptors[i]->width);
+        CHECK_END_DATA_RETURN(c, self, descriptors[i]->width, *err);
         if (*err) { 
           *numberOfRepetitions=0;
         } else {
@@ -1012,7 +1064,8 @@ static int encode_new_replication(grib_context* c,grib_accessor_bufr_data_array*
         }
         break;
     default:
-        Assert(0);
+        grib_context_log(c, GRIB_LOG_ERROR, "unsupported descriptor code %d\n", descriptors[i]->code);
+        return GRIB_INTERNAL_ERROR;
     }
 
     grib_context_log(c, GRIB_LOG_DEBUG,"BUFR data encoding replication: \twidth=%ld pos=%ld ulength=%ld ulength_bits=%ld",
@@ -1060,7 +1113,7 @@ static int encode_element(grib_context* c,grib_accessor_bufr_data_array* self,in
                         bd->shortName, bd->code, bd->width,
                         bd->scale, bd->reference);
                 for (j=0;j<grib_darray_used_size(self->numericValues->v[elementIndex]);j++)
-                    grib_context_log(c,GRIB_LOG_ERROR,"%g ",self->numericValues->v[elementIndex]->v[i]);
+                    grib_context_log(c,GRIB_LOG_ERROR,"value[%d]\t= %g", j,self->numericValues->v[elementIndex]->v[j]);
             }
         } else {
             if (self->numericValues->v[subsetIndex] == NULL) {
@@ -1134,7 +1187,8 @@ static int build_bitmap(grib_accessor_bufr_data_array *self,unsigned char* data,
                 *pos=ppos;
                 if (width) {
                     /* delayed replication number is not constant. NOT IMPLEMENTED */
-                    Assert(0);
+                    grib_context_log(c,GRIB_LOG_ERROR, "Delayed replication number is not constant");
+                    return GRIB_NOT_IMPLEMENTED;
                 } else {
                     bitmapSize=localReference*descriptors[i]->factor;
                 }
@@ -1159,7 +1213,7 @@ static int build_bitmap(grib_accessor_bufr_data_array *self,unsigned char* data,
         restart_bitmap(self);
         break;
     default :
-        grib_context_log(c,GRIB_LOG_ERROR,"unsupported operator %d\n",
+        grib_context_log(c,GRIB_LOG_ERROR,"build_bitmap: unsupported operator %d\n",
                 descriptors[iBitmapOperator]->code);
         return GRIB_INTERNAL_ERROR;
     }
@@ -1248,7 +1302,7 @@ static int build_bitmap_new_data(grib_accessor_bufr_data_array *self,unsigned ch
         self->bitmapCurrentElementsDescriptorsIndex=iel-1;
         break;
     default :
-        grib_context_log(c,GRIB_LOG_ERROR,"unsupported operator %d\n",
+        grib_context_log(c,GRIB_LOG_ERROR,"build_bitmap_new_data: unsupported operator %d\n",
                 descriptors[iBitmapOperator]->code);
         return GRIB_INTERNAL_ERROR;
     }
@@ -1459,8 +1513,9 @@ static grib_accessor* create_accessor_from_descriptor(grib_accessor* a,grib_acce
 {
     grib_accessor_bufr_data_array *self =(grib_accessor_bufr_data_array*)a;
     char code[10]={0,};
+    char* temp_str = NULL;
     int idx=0;
-    unsigned long flags=0;
+    unsigned long flags=GRIB_ACCESSOR_FLAG_READ_ONLY;
     grib_action operatorCreator = {0, };
     grib_accessor* elementAccessor=NULL;
     grib_action creator = {0, };
@@ -1487,7 +1542,9 @@ static grib_accessor* create_accessor_from_descriptor(grib_accessor* a,grib_acce
     switch (self->expanded->v[idx]->F) {
     case 0:
     case 1:
-        creator.name=grib_context_strdup(a->context,self->expanded->v[idx]->shortName);
+        creator.name=grib_context_strdup(a->context, self->expanded->v[idx]->shortName);
+        /* ECC-325: store alloc'd string (due to strdup) for clean up later */
+        grib_sarray_push(a->context, self->tempStrings, creator.name);
         elementAccessor = grib_accessor_factory(section, &creator, 0, NULL);
         if (self->canBeMissing[idx]) elementAccessor->flags |= GRIB_ACCESSOR_FLAG_CAN_BE_MISSING;
         if (self->expanded->v[idx]->code == 31000 || self->expanded->v[idx]->code == 31001 || self->expanded->v[idx]->code == 31002 || self->expanded->v[idx]->code == 31031)
@@ -1519,11 +1576,13 @@ static grib_accessor* create_accessor_from_descriptor(grib_accessor* a,grib_acce
         grib_accessor_add_attribute(elementAccessor,attribute,0);
 
         sprintf(code,"%06ld",self->expanded->v[idx]->code);
-        attribute=create_attribute_variable("code",section,GRIB_TYPE_STRING,grib_context_strdup(a->context,code),0,0,flags);
+        temp_str = grib_context_strdup(a->context,code);
+        attribute=create_attribute_variable("code",section,GRIB_TYPE_STRING,temp_str,0,0,flags);
         if (!attribute) return NULL;
+        grib_sarray_push(a->context, self->tempStrings, temp_str);/* ECC-325: store alloc'd string (due to strdup) for clean up later */
         grib_accessor_add_attribute(elementAccessor,attribute,0);
 
-        attribute=create_attribute_variable("units",section,GRIB_TYPE_STRING,self->expanded->v[idx]->units,0,0,GRIB_ACCESSOR_FLAG_DUMP);
+        attribute=create_attribute_variable("units",section,GRIB_TYPE_STRING,self->expanded->v[idx]->units,0,0,GRIB_ACCESSOR_FLAG_DUMP | flags);
         if (!attribute) return NULL;
         grib_accessor_add_attribute(elementAccessor,attribute,0);
 
@@ -1685,7 +1744,7 @@ static void grib_convert_to_attribute(grib_accessor* a)
     }
 }
 
-grib_iarray* set_subset_list(grib_context* c,grib_accessor_bufr_data_array *self,long onlySubset,long startSubset,long endSubset,long* subsetList,size_t subsetListSize)
+static grib_iarray* set_subset_list(grib_context* c,grib_accessor_bufr_data_array *self,long onlySubset,long startSubset,long endSubset,long* subsetList,size_t subsetListSize)
 {
     grib_iarray* list=grib_iarray_new(c,self->numberOfSubsets,10);
     long s;
@@ -1776,10 +1835,32 @@ static grib_accessor* accessor_or_attribute_with_same_name(grib_accessor* a,cons
     }
 }
 
+static int get_key_rank(grib_trie* accessorsRank,grib_accessor* a)
+{
+    int* r=(int*)grib_trie_get(accessorsRank,a->name);
+
+    if (r) (*r)++;
+    else {
+        r=(int*)grib_context_malloc(a->context,sizeof(int));
+        *r=1;
+        grib_trie_insert(accessorsRank,a->name,(void*)r);
+    }
+    return *r;
+}
+
+static void grib_data_accessors_trie_push(grib_trie* accessorsTrie, grib_accessor* a, int r)
+{
+    char* name=(char*)grib_context_malloc_clear(a->context, strlen(a->name)+20);
+    sprintf(name,"#%d#%s", r, a->name);
+    grib_trie_insert(accessorsTrie, name, a);
+    grib_context_free(a->context, name);
+}
+
 static int create_keys(grib_accessor* a,long onlySubset,long startSubset,long endSubset)
 {
     grib_accessor_bufr_data_array *self =(grib_accessor_bufr_data_array*)a;
     int err=0;
+    int rank;
     grib_accessor* elementAccessor=0;
     grib_accessor* associatedFieldAccessor=0;
     grib_accessor* associatedFieldSignificanceAccessor=0;
@@ -1823,11 +1904,26 @@ static int create_keys(grib_accessor* a,long onlySubset,long startSubset,long en
 
     if (self->dataAccessors) {
         grib_accessors_list_delete(c,self->dataAccessors);
-        /* grib_empty_section ( c,self->dataKeys ); */
-        /* grib_context_free ( c,self->dataKeys->block ); */
     }
     self->dataAccessors=grib_accessors_list_create(c);
 
+    if (self->dataAccessorsTrie) {
+        grib_trie_delete(self->dataAccessorsTrie);
+    }
+    self->dataAccessorsTrie=grib_trie_new(c);
+
+    if (self->dataAccessorsRank) {
+        grib_trie_delete(self->dataAccessorsRank);
+    }
+    self->dataAccessorsRank=grib_trie_new(c);
+
+    if (self->tempStrings) {
+        grib_sarray_delete_content(c, self->tempStrings);
+        grib_sarray_delete        (c, self->tempStrings);
+        self->tempStrings=NULL;
+    }
+    self->tempStrings = grib_sarray_new(c, self->numberOfSubsets, 10);
+
     end= self->compressedData ? 1 : self->numberOfSubsets;
     groupNumber=1;
 
@@ -1977,7 +2073,9 @@ static int create_keys(grib_accessor* a,long onlySubset,long startSubset,long en
                 grib_pack_long(asn,&subsetNumber,&len);
 
                 grib_push_accessor(asn,section->block);
-                grib_accessors_list_push(self->dataAccessors,asn);
+                rank=get_key_rank(self->dataAccessorsRank,asn);
+                grib_accessors_list_push(self->dataAccessors,asn,rank);
+                grib_data_accessors_trie_push(self->dataAccessorsTrie,asn,rank);
             }
             count++;
             elementAccessor=create_accessor_from_descriptor(a,associatedFieldAccessor,section,ide,iss,dump,count);
@@ -1992,7 +2090,9 @@ static int create_keys(grib_accessor* a,long onlySubset,long startSubset,long en
                     newAccessor->parent=groupSection;
                     newAccessor->name=grib_context_strdup(c,elementFromBitmap->name);
                     grib_push_accessor(newAccessor,groupSection->block);
-                    grib_accessors_list_push(self->dataAccessors,newAccessor);
+                    rank=get_key_rank(self->dataAccessorsRank,newAccessor);
+                    grib_accessors_list_push(self->dataAccessors,newAccessor,rank);
+                    grib_data_accessors_trie_push(self->dataAccessorsTrie,newAccessor,rank);
                 }
 
                 err=grib_accessor_add_attribute(accessor_or_attribute_with_same_name(elementFromBitmap,elementAccessor->name),elementAccessor,1);
@@ -2018,8 +2118,10 @@ static int create_keys(grib_accessor* a,long onlySubset,long startSubset,long en
                     break;
                 default:
                     grib_push_accessor(elementAccessor,section->block);
-                    grib_accessors_list_push(self->dataAccessors,elementAccessor);
+                    rank=get_key_rank(self->dataAccessorsRank,elementAccessor);
+                    grib_accessors_list_push(self->dataAccessors,elementAccessor,rank);
                     lastAccessorInList=grib_accessors_list_last(self->dataAccessors);
+                    grib_data_accessors_trie_push(self->dataAccessorsTrie,elementAccessor,rank);
                 }
             }
         }
@@ -2041,7 +2143,7 @@ static void set_input_replications(grib_handle* h,grib_accessor_bufr_data_array
     self->iInputShortReplications=0;
     if (grib_get_size(h,"inputDelayedDescriptorReplicationFactor",&nInputReplications)==0 && nInputReplications!=0) {
         if (self->inputReplications) grib_context_free(h->context,self->inputReplications);
-        self->inputReplications=grib_context_malloc_clear(h->context,sizeof(long)*nInputReplications);
+        self->inputReplications=(long*)grib_context_malloc_clear(h->context,sizeof(long)*nInputReplications);
         grib_get_long_array(h,"inputDelayedDescriptorReplicationFactor",self->inputReplications,&nInputReplications);
         /* default-> no input replications*/
         if (self->inputReplications[0]<0) self->nInputReplications=-1;
@@ -2049,7 +2151,7 @@ static void set_input_replications(grib_handle* h,grib_accessor_bufr_data_array
     }
     if (grib_get_size(h,"inputExtendedDelayedDescriptorReplicationFactor",&nInputExtendedReplications)==0 && nInputExtendedReplications!=0) {
         if (self->inputExtendedReplications) grib_context_free(h->context,self->inputExtendedReplications);
-        self->inputExtendedReplications=grib_context_malloc_clear(h->context,sizeof(long)*nInputExtendedReplications);
+        self->inputExtendedReplications=(long*)grib_context_malloc_clear(h->context,sizeof(long)*nInputExtendedReplications);
         grib_get_long_array(h,"inputExtendedDelayedDescriptorReplicationFactor",self->inputExtendedReplications,&nInputExtendedReplications);
         /* default-> no input replications*/
         if (self->inputExtendedReplications[0]<0) self->nInputExtendedReplications=-1;
@@ -2057,7 +2159,7 @@ static void set_input_replications(grib_handle* h,grib_accessor_bufr_data_array
     }
     if (grib_get_size(h,"inputShortDelayedDescriptorReplicationFactor",&nInputShortReplications)==0 && nInputShortReplications!=0) {
         if (self->inputShortReplications) grib_context_free(h->context,self->inputShortReplications);
-        self->inputShortReplications=grib_context_malloc_clear(h->context,sizeof(long)*nInputShortReplications);
+        self->inputShortReplications=(long*)grib_context_malloc_clear(h->context,sizeof(long)*nInputShortReplications);
         grib_get_long_array(h,"inputShortDelayedDescriptorReplicationFactor",self->inputShortReplications,&nInputShortReplications);
         /* default-> no input replications*/
         if (self->inputShortReplications[0]<0) self->nInputShortReplications=-1;
@@ -2072,7 +2174,7 @@ static void set_input_bitmap(grib_handle* h,grib_accessor_bufr_data_array *self)
     self->iInputBitmap=0;
     if (grib_get_size(h,"inputDataPresentIndicator",&nInputBitmap)==0 && nInputBitmap!=0) {
         if (self->inputBitmap) grib_context_free(h->context,self->inputBitmap);
-        self->inputBitmap=grib_context_malloc_clear(h->context,sizeof(long)*nInputBitmap);
+        self->inputBitmap=(double*)grib_context_malloc_clear(h->context,sizeof(double)*nInputBitmap);
         grib_get_double_array(h,"inputDataPresentIndicator",self->inputBitmap,&nInputBitmap);
         /* default-> no input bitmap*/
         if (self->inputBitmap[0]<0) self->nInputBitmap=-1;
@@ -2158,7 +2260,7 @@ static int process_elements(grib_accessor* a,int flag,long onlySubset,long start
         err=grib_get_size(grib_handle_of_accessor(a),"extractSubsetList",&subsetListSize);
         if (err) return err;
         if (subsetList) grib_context_free(c,subsetList);
-        subsetList=grib_context_malloc_clear(c,subsetListSize*sizeof(long));
+        subsetList=(long*)grib_context_malloc_clear(c,subsetListSize*sizeof(long));
         err=grib_get_long_array(grib_handle_of_accessor(a),"extractSubsetList",subsetList,&subsetListSize);
         if (err) return err;
         codec_replication=&encode_replication;
@@ -2194,7 +2296,6 @@ static int process_elements(grib_accessor* a,int flag,long onlySubset,long start
         grib_iarray_delete(self->iss_list);
         self->iss_list=0;
     }
-
     end= self->compressedData == 1 ? 1 : self->numberOfSubsets ;
 
     if (flag!=PROCESS_DECODE) {
@@ -2411,7 +2512,7 @@ static int process_elements(grib_accessor* a,int flag,long onlySubset,long start
                     elementIndex++;
                     break;
                 default :
-                    grib_context_log(c,GRIB_LOG_ERROR,"unsupported operator %d\n",descriptors[i]->X);
+                    grib_context_log(c,GRIB_LOG_ERROR,"process_elements: unsupported operator %d\n",descriptors[i]->X);
                     return GRIB_INTERNAL_ERROR;
                 }
                 break;
@@ -2559,4 +2660,10 @@ static void destroy(grib_context* c,grib_accessor* a)
     grib_accessor_bufr_data_array *self =(grib_accessor_bufr_data_array*)a;
     self_clear(c,self);
     if (self->dataAccessors) grib_accessors_list_delete(c,self->dataAccessors);
+    if (self->dataAccessorsTrie) grib_trie_delete_container(self->dataAccessorsTrie);
+    if (self->dataAccessorsRank) grib_trie_delete(self->dataAccessorsRank);
+    if (self->tempStrings) {
+        grib_sarray_delete_content(c, self->tempStrings);
+        grib_sarray_delete        (c, self->tempStrings);
+    }
 }
diff --git a/src/grib_accessor_class_bufr_data_element.c b/src/grib_accessor_class_bufr_data_element.c
index cf2479c..90a840c 100644
--- a/src/grib_accessor_class_bufr_data_element.c
+++ b/src/grib_accessor_class_bufr_data_element.c
@@ -1,5 +1,5 @@
 /**
-* Copyright 2005-2016 ECMWF
+* Copyright 2005-2017 ECMWF
 *
 * Licensed under the GNU Lesser General Public License which
 * incorporates the terms and conditions of version 3 of the GNU
@@ -257,6 +257,7 @@ static void init(grib_accessor* a, const long len, grib_arguments* params)
 {
 
     a->length = 0;
+    a->flags |= GRIB_ACCESSOR_FLAG_BUFR_DATA;
     /* a->flags |= GRIB_ACCESSOR_FLAG_READ_ONLY; */
 }
 
diff --git a/src/grib_accessor_class_bufr_elements_table.c b/src/grib_accessor_class_bufr_elements_table.c
index f87db16..57e93c6 100644
--- a/src/grib_accessor_class_bufr_elements_table.c
+++ b/src/grib_accessor_class_bufr_elements_table.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -15,6 +15,34 @@
 #include "grib_api_internal.h"
 #include <ctype.h>
 
+#if GRIB_PTHREADS
+static pthread_once_t once  = PTHREAD_ONCE_INIT;
+static pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
+
+static void thread_init() {
+    pthread_mutexattr_t attr;
+    pthread_mutexattr_init(&attr);
+    pthread_mutexattr_settype(&attr,PTHREAD_MUTEX_RECURSIVE);
+    pthread_mutex_init(&mutex1,&attr);
+    pthread_mutexattr_destroy(&attr);
+}
+#elif GRIB_OMP_THREADS
+static int once = 0;
+static omp_nest_lock_t mutex1;
+
+static void thread_init()
+{
+    GRIB_OMP_CRITICAL(lock_grib_accessor_class_bufr_elements_table_c)
+    {
+        if (once == 0)
+        {
+            omp_init_nest_lock(&mutex1);
+            once = 1;
+        }
+    }
+}
+#endif
+
 /*
    This is used by make_class.pl
 
@@ -152,56 +180,6 @@ static void init(grib_accessor* a, const long len, grib_arguments* params)
     a->flags |= GRIB_ACCESSOR_FLAG_READ_ONLY;
 }
 
-/* From https://stackoverflow.com/questions/32506614/manipulation-of-delimiters-within-arrays */
-/* Returns an array of strings the last of which is NULL */
-char** str_split(char* a_str, const char a_delim)
-{
-    char** result    = 0;
-    size_t count     = 0;
-    char* tmp        = a_str;
-    char* last_comma = 0;
-    char delim[2];
-    delim[0] = a_delim;
-    delim[1] = 0;
-
-    /* Count how many elements will be extracted. */
-    while (*tmp)
-    {
-        if (a_delim == *tmp)
-        {
-            count++;
-            last_comma = tmp;
-        }
-        tmp++;
-    }
-
-    /* Add space for trailing token. */
-    count += last_comma < (a_str + strlen(a_str) - 1);
-
-    /* Add space for terminating null string so caller
-       knows where the list of returned strings ends. */
-    count++;
-
-    result = (char**)malloc(sizeof(char*) * count);
-    Assert(result);
-    if (result)
-    {
-        size_t idx  = 0;
-        char* token = strtok(a_str, delim);
-
-        while (token)
-        {
-            Assert(idx < count);
-            *(result + idx++) = strdup(token);
-            token = strtok(0, delim);
-        }
-        Assert(idx == count - 1);
-        *(result + idx) = 0;
-    }
-
-    return result;
-}
-
 static grib_trie* load_bufr_elements_table(grib_accessor* a, int* err)
 {
     grib_accessor_bufr_elements_table* self = (grib_accessor_bufr_elements_table*)a;
@@ -210,10 +188,6 @@ static grib_trie* load_bufr_elements_table(grib_accessor* a, int* err)
     char line[1024]={0,};
     char masterDir[1024]={0,};
     char localDir[1024]={0,};
-    char name[1024]={0,};
-    char localName[1024]={0,};
-    char recomposed[1024]={0,};
-    char localRecomposed[1024]={0,};
     char dictName[1024]={0,};
     char *localFilename=0;
     char** list=0;
@@ -231,6 +205,8 @@ static grib_trie* load_bufr_elements_table(grib_accessor* a, int* err)
     if (self->localDir != NULL) grib_get_string(h,self->localDir,localDir,&len);
 
     if (*masterDir!=0) {
+        char name[1024]={0,};
+        char recomposed[1024]={0,};
         sprintf(name,"%s/%s",masterDir,self->dictionary);
         grib_recompose_name(h, NULL,name, recomposed,0);
         filename=grib_context_full_defs_path(c,recomposed);
@@ -239,6 +215,8 @@ static grib_trie* load_bufr_elements_table(grib_accessor* a, int* err)
     }
 
     if (*localDir!=0) {
+        char localRecomposed[1024]={0,};
+        char localName[1024]={0,};
         sprintf(localName,"%s/%s",localDir,self->dictionary);
         grib_recompose_name(h, NULL,localName, localRecomposed,0);
         localFilename=grib_context_full_defs_path(c,localRecomposed);
@@ -254,21 +232,24 @@ static grib_trie* load_bufr_elements_table(grib_accessor* a, int* err)
     } else {
         grib_context_log(c,GRIB_LOG_DEBUG,"found def file %s",filename);
     }
+    GRIB_MUTEX_INIT_ONCE(&once,&thread_init);
+    GRIB_MUTEX_LOCK(&mutex1);
+
     dictionary=(grib_trie*)grib_trie_get(c->lists,dictName);
     if (dictionary) {
         grib_context_log(c,GRIB_LOG_DEBUG,"using dictionary %s from cache",self->dictionary);
-        return dictionary;
+        goto the_end;
     } else {
         grib_context_log(c,GRIB_LOG_DEBUG,"using dictionary %s from file %s",self->dictionary,filename);
     }
 
     f=codes_fopen(filename,"r");
-    if (!f) {*err=GRIB_IO_PROBLEM; return NULL;}
+    if (!f) {*err=GRIB_IO_PROBLEM; dictionary=NULL; goto the_end;}
 
     dictionary=grib_trie_new(c);
 
     while(fgets(line,sizeof(line)-1,f)) {
-        list=str_split(line,'|');
+        list=string_split(line, "|");
         grib_trie_insert(dictionary,list[0],list);
     }
 
@@ -276,16 +257,19 @@ static grib_trie* load_bufr_elements_table(grib_accessor* a, int* err)
 
     if (localFilename!=0) {
         f=codes_fopen(localFilename,"r");
-        if (!f) {*err=GRIB_IO_PROBLEM; return NULL;}
+        if (!f) {*err=GRIB_IO_PROBLEM; dictionary=NULL; goto the_end;}
 
         while(fgets(line,sizeof(line)-1,f)) {
-            list=str_split(line,'|');
+            list=string_split(line, "|");
             grib_trie_insert(dictionary,list[0],list);
         }
 
         fclose(f);
     }
     grib_trie_insert(c->lists,dictName,dictionary);
+
+the_end:
+    GRIB_MUTEX_UNLOCK(&mutex1);
     return dictionary;
 }
 
diff --git a/src/grib_accessor_class_bufr_extract_area_subsets.c b/src/grib_accessor_class_bufr_extract_area_subsets.c
index d898b71..1f0f486 100644
--- a/src/grib_accessor_class_bufr_extract_area_subsets.c
+++ b/src/grib_accessor_class_bufr_extract_area_subsets.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -210,12 +210,12 @@ static int select_area(grib_accessor* a) {
     sprintf(latstr,"#%ld#latitude",latRank);
 
     n=numberOfSubsets;
-    lat=grib_context_malloc_clear(c,sizeof(double)*numberOfSubsets);
+    lat=(double*)grib_context_malloc_clear(c,sizeof(double)*numberOfSubsets);
     ret=grib_get_double_array(h,latstr,lat,&n);
     if (ret) return ret;
     if (n!=numberOfSubsets) return GRIB_INTERNAL_ERROR;
 
-    lon=grib_context_malloc_clear(c,sizeof(double)*numberOfSubsets);
+    lon=(double*)grib_context_malloc_clear(c,sizeof(double)*numberOfSubsets);
     ret=grib_get_double_array(h,lonstr,lon,&n);
     if (ret) return ret;
     if (n!=numberOfSubsets) return GRIB_INTERNAL_ERROR;
diff --git a/src/grib_accessor_class_bufr_extract_datetime_subsets.c b/src/grib_accessor_class_bufr_extract_datetime_subsets.c
index 574bd06..77ac0c3 100644
--- a/src/grib_accessor_class_bufr_extract_datetime_subsets.c
+++ b/src/grib_accessor_class_bufr_extract_datetime_subsets.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -233,7 +233,7 @@ static int select_datetime(grib_accessor* a)
         sprintf(secondstr,"#%ld#second",secondRank);
 
         n=numberOfSubsets;
-        year=grib_context_malloc_clear(c,sizeof(long)*numberOfSubsets);
+        year=(long*)grib_context_malloc_clear(c,sizeof(long)*numberOfSubsets);
         ret=grib_get_long_array(h,yearstr,year,&n);
         if (ret) return ret;
         if (n!=numberOfSubsets) {
@@ -243,7 +243,7 @@ static int select_datetime(grib_accessor* a)
         }
 
         n=numberOfSubsets;
-        month=grib_context_malloc_clear(c,sizeof(long)*numberOfSubsets);
+        month=(long*)grib_context_malloc_clear(c,sizeof(long)*numberOfSubsets);
         ret=grib_get_long_array(h,monthstr,month,&n);
         if (ret) return ret;
         if (n!=numberOfSubsets) {
@@ -253,7 +253,7 @@ static int select_datetime(grib_accessor* a)
         }
 
         n=numberOfSubsets;
-        day=grib_context_malloc_clear(c,sizeof(long)*numberOfSubsets);
+        day=(long*)grib_context_malloc_clear(c,sizeof(long)*numberOfSubsets);
         ret=grib_get_long_array(h,daystr,day,&n);
         if (ret) return ret;
         if (n!=numberOfSubsets) {
@@ -263,7 +263,7 @@ static int select_datetime(grib_accessor* a)
         }
 
         n=numberOfSubsets;
-        hour=grib_context_malloc_clear(c,sizeof(long)*numberOfSubsets);
+        hour=(long*)grib_context_malloc_clear(c,sizeof(long)*numberOfSubsets);
         ret=grib_get_long_array(h,hourstr,hour,&n);
         if (ret) return ret;
         if (n!=numberOfSubsets) {
@@ -273,7 +273,7 @@ static int select_datetime(grib_accessor* a)
         }
 
         n=numberOfSubsets;
-        minute=grib_context_malloc_clear(c,sizeof(long)*numberOfSubsets);
+        minute=(long*)grib_context_malloc_clear(c,sizeof(long)*numberOfSubsets);
         ret=grib_get_long_array(h,minutestr,minute,&n);
         if (ret) {
             ret=0;
@@ -287,7 +287,7 @@ static int select_datetime(grib_accessor* a)
         }
 
         n=numberOfSubsets;
-        second=grib_context_malloc_clear(c,sizeof(double)*numberOfSubsets);
+        second=(double*)grib_context_malloc_clear(c,sizeof(double)*numberOfSubsets);
         ret=grib_get_double_array(h,secondstr,second,&n);
         if (ret) {
             ret=0;
diff --git a/src/grib_accessor_class_bufr_extract_subsets.c b/src/grib_accessor_class_bufr_extract_subsets.c
index be3b004..9a65b3b 100644
--- a/src/grib_accessor_class_bufr_extract_subsets.c
+++ b/src/grib_accessor_class_bufr_extract_subsets.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_bufr_group.c b/src/grib_accessor_class_bufr_group.c
index e6c26f9..015af4b 100644
--- a/src/grib_accessor_class_bufr_group.c
+++ b/src/grib_accessor_class_bufr_group.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_bufr_has_delayed_replication.c b/src/grib_accessor_class_bufr_has_delayed_replication.c
index fc33bb9..2af6575 100644
--- a/src/grib_accessor_class_bufr_has_delayed_replication.c
+++ b/src/grib_accessor_class_bufr_has_delayed_replication.c
@@ -1,5 +1,5 @@
 /*
-* Copyright 2005-2016 ECMWF.
+* Copyright 2005-2017 ECMWF.
 *
 * This software is licensed under the terms of the Apache Licence Version 2.0
 * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_bufr_simple_thinning.c b/src/grib_accessor_class_bufr_simple_thinning.c
index 19aa979..8711540 100644
--- a/src/grib_accessor_class_bufr_simple_thinning.c
+++ b/src/grib_accessor_class_bufr_simple_thinning.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -185,6 +185,7 @@ static int apply_thinning(grib_accessor* a)
 
         ret=grib_get_long(h,self->simpleThinningSkip,&skip);
         if (ret) return ret;
+        if (skip <= 0) return GRIB_INVALID_KEY_VALUE;
 
         ret=grib_get_long(h,self->simpleThinningMissingRadius,&radius);
         if (ret) return ret;
diff --git a/src/grib_accessor_class_bufr_string_values.c b/src/grib_accessor_class_bufr_string_values.c
index 630c336..42da27e 100644
--- a/src/grib_accessor_class_bufr_string_values.c
+++ b/src/grib_accessor_class_bufr_string_values.c
@@ -1,5 +1,5 @@
 /*
-* Copyright 2005-2016 ECMWF.
+* Copyright 2005-2017 ECMWF.
 *
 * This software is licensed under the terms of the Apache Licence Version 2.0
 * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_bufrdc_expanded_descriptors.c b/src/grib_accessor_class_bufrdc_expanded_descriptors.c
index 80dee5d..6dadd38 100644
--- a/src/grib_accessor_class_bufrdc_expanded_descriptors.c
+++ b/src/grib_accessor_class_bufrdc_expanded_descriptors.c
@@ -1,5 +1,5 @@
 /*
-* Copyright 2005-2016 ECMWF.
+* Copyright 2005-2017 ECMWF.
 *
 * This software is licensed under the terms of the Apache Licence Version 2.0
 * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_bytes.c b/src/grib_accessor_class_bytes.c
index cf6aeaa..01f8ecf 100644
--- a/src/grib_accessor_class_bytes.c
+++ b/src/grib_accessor_class_bytes.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_change_scanning_direction.c b/src/grib_accessor_class_change_scanning_direction.c
index 32bb2fa..6cd7179 100644
--- a/src/grib_accessor_class_change_scanning_direction.c
+++ b/src/grib_accessor_class_change_scanning_direction.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_check_internal_version.c b/src/grib_accessor_class_check_internal_version.c
index dba4209..c43bcb6 100644
--- a/src/grib_accessor_class_check_internal_version.c
+++ b/src/grib_accessor_class_check_internal_version.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_codeflag.c b/src/grib_accessor_class_codeflag.c
index 67c4eeb..760f48f 100644
--- a/src/grib_accessor_class_codeflag.c
+++ b/src/grib_accessor_class_codeflag.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_codetable.c b/src/grib_accessor_class_codetable.c
index e67ff38..ddea1cf 100644
--- a/src/grib_accessor_class_codetable.c
+++ b/src/grib_accessor_class_codetable.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -44,21 +44,6 @@ static void thread_init()
 #endif
 
 /*
- * strcasecmp is not in the C standard. However, it's defined by
- * 4.4BSD, POSIX.1-2001. So we use our own
-*/
-int grib_strcasecmp(const char *s1, const char *s2)
-{
-   const unsigned char *us1 = (const unsigned char *)s1,
-                       *us2 = (const unsigned char *)s2;
-
-   while (tolower(*us1) == tolower(*us2++))
-      if (*us1++ == '\0')
-         return (0);
-   return (tolower(*us1) - tolower(*--us2));
-}
-
-/*
    This is used by make_class.pl
 
    START_CLASS_DEF
@@ -255,7 +240,7 @@ static int str_eq(const char* a, const char* b)
     return 0;
 }
 
-#ifdef DEBUG
+#ifdef DEBUGGING
 static void dump_codetable(grib_codetable* atable)
 {
     grib_codetable* next = NULL;
@@ -278,11 +263,9 @@ static grib_codetable* load_table(grib_accessor_codetable* self)
     grib_codetable* next=NULL ;
     grib_accessor* a=(grib_accessor*)self;
     char *filename=0;
-    char name[1024]={0,};
     char recomposed[1024]={0,};
     char localRecomposed[1024]={0,};
     char *localFilename=0;
-    char localName[1024]={0,};
     char masterDir[1024]={0,};
     char localDir[1024]={0,};
     size_t len=1024;
@@ -295,6 +278,7 @@ static grib_codetable* load_table(grib_accessor_codetable* self)
         grib_get_string(h,self->localDir,localDir,&len);
 
     if (*masterDir!=0) {
+        char name[1024]={0,};
         sprintf(name,"%s/%s",masterDir,self->tablename);
         grib_recompose_name(h, NULL,name, recomposed,0);
         filename=grib_context_full_defs_path(c,recomposed);
@@ -304,6 +288,7 @@ static grib_codetable* load_table(grib_accessor_codetable* self)
     }
 
     if (*localDir!=0) {
+        char localName[1024]={0,};
         sprintf(localName,"%s/%s",localDir,self->tablename);
         grib_recompose_name(h, NULL,localName, localRecomposed,0);
         localFilename=grib_context_full_defs_path(c,localRecomposed);
@@ -476,7 +461,6 @@ static int grib_load_codetable(grib_context* c,const char* filename,
         t->entries[code].abbreviation = grib_context_strdup_persistent(c,abbreviation);
         t->entries[code].title        = grib_context_strdup_persistent(c,title);
         t->entries[code].units        = grib_context_strdup_persistent(c,units);
-
     }
 
     fclose(f);
@@ -632,7 +616,7 @@ static int pack_string(grib_accessor* a, const char* buffer, size_t *len)
 
     typedef int (*cmpproc)(const char*, const char*);
 #ifndef ECCODES_ON_WINDOWS
-    cmpproc cmp = (a->flags & GRIB_ACCESSOR_FLAG_LOWERCASE) ? grib_strcasecmp : strcmp;
+    cmpproc cmp = (a->flags & GRIB_ACCESSOR_FLAG_LOWERCASE) ? strcmp_nocase : strcmp;
 #else
     /* Microsoft Windows Visual Studio support */
     cmpproc cmp = (a->flags & GRIB_ACCESSOR_FLAG_LOWERCASE) ? stricmp : strcmp;
@@ -697,23 +681,29 @@ static int pack_string(grib_accessor* a, const char* buffer, size_t *len)
 
 static int pack_expression(grib_accessor* a, grib_expression *e)
 {
-    const char* cval;
+    const char* cval=NULL;
     int ret=0;
     long lval=0;
     size_t len = 1;
-    char tmp[1024];
+    grib_handle* hand = grib_handle_of_accessor(a);
 
     if (strcmp(e->cclass->name,"long")==0) {
-        ret=grib_expression_evaluate_long(grib_handle_of_accessor(a),e,&lval);
+        ret=grib_expression_evaluate_long(hand,e,&lval);
+        /*if (hand->context->debug)
+            printf("ECCODES DEBUG grib_accessor_class_codetable::pack_expression %s %ld\n", a->name,lval);*/
+
         ret = grib_pack_long(a,&lval,&len);
     } else {
+        char tmp[1024];
         len = sizeof(tmp);
-        cval = grib_expression_evaluate_string(grib_handle_of_accessor(a),e,tmp,&len,&ret);
+        cval = grib_expression_evaluate_string(hand,e,tmp,&len,&ret);
         if (ret!=GRIB_SUCCESS) {
             grib_context_log(a->context,GRIB_LOG_ERROR,"grib_accessor_codetable.pack_expression: unable to evaluate string %s to be set in %s\n",grib_expression_get_name(e),a->name);
             return ret;
         }
         len = strlen(cval) + 1;
+        /*if (hand->context->debug)
+            printf("ECCODES DEBUG grib_accessor_class_codetable::pack_expression %s %s\n", a->name, cval);*/
         ret = grib_pack_string(a,cval,&len);
     }
     return ret;
diff --git a/src/grib_accessor_class_codetable_title.c b/src/grib_accessor_class_codetable_title.c
index 0968d4f..2fc5714 100644
--- a/src/grib_accessor_class_codetable_title.c
+++ b/src/grib_accessor_class_codetable_title.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_codetable_units.c b/src/grib_accessor_class_codetable_units.c
index 5a52091..6c39d02 100644
--- a/src/grib_accessor_class_codetable_units.c
+++ b/src/grib_accessor_class_codetable_units.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_concept.c b/src/grib_accessor_class_concept.c
index 0a51cf6..697b66e 100644
--- a/src/grib_accessor_class_concept.c
+++ b/src/grib_accessor_class_concept.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_constant.c b/src/grib_accessor_class_constant.c
index f9cafd7..704c527 100644
--- a/src/grib_accessor_class_constant.c
+++ b/src/grib_accessor_class_constant.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_count_file.c b/src/grib_accessor_class_count_file.c
index 14f91ad..ff0f3fc 100644
--- a/src/grib_accessor_class_count_file.c
+++ b/src/grib_accessor_class_count_file.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_count_missing.c b/src/grib_accessor_class_count_missing.c
index b0388a1..c014576 100644
--- a/src/grib_accessor_class_count_missing.c
+++ b/src/grib_accessor_class_count_missing.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_count_total.c b/src/grib_accessor_class_count_total.c
index 0f8c234..d3573da 100644
--- a/src/grib_accessor_class_count_total.c
+++ b/src/grib_accessor_class_count_total.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_data_2order_packing.c b/src/grib_accessor_class_data_2order_packing.c
index a9030d5..d334093 100644
--- a/src/grib_accessor_class_data_2order_packing.c
+++ b/src/grib_accessor_class_data_2order_packing.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_data_2order_packing_count.c b/src/grib_accessor_class_data_2order_packing_count.c
index ffe73d2..5dc692c 100644
--- a/src/grib_accessor_class_data_2order_packing_count.c
+++ b/src/grib_accessor_class_data_2order_packing_count.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_data_apply_bitmap.c b/src/grib_accessor_class_data_apply_bitmap.c
index 6b4e799..de90a01 100644
--- a/src/grib_accessor_class_data_apply_bitmap.c
+++ b/src/grib_accessor_class_data_apply_bitmap.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_data_apply_boustrophedonic.c b/src/grib_accessor_class_data_apply_boustrophedonic.c
index 6e8cb2f..388876f 100644
--- a/src/grib_accessor_class_data_apply_boustrophedonic.c
+++ b/src/grib_accessor_class_data_apply_boustrophedonic.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_data_apply_boustrophedonic_bitmap.c b/src/grib_accessor_class_data_apply_boustrophedonic_bitmap.c
index 0a940d9..d39fa8a 100644
--- a/src/grib_accessor_class_data_apply_boustrophedonic_bitmap.c
+++ b/src/grib_accessor_class_data_apply_boustrophedonic_bitmap.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_data_apply_gdsnotpresent.c b/src/grib_accessor_class_data_apply_gdsnotpresent.c
index 694e655..0730d60 100644
--- a/src/grib_accessor_class_data_apply_gdsnotpresent.c
+++ b/src/grib_accessor_class_data_apply_gdsnotpresent.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_data_ccsds_packing.c b/src/grib_accessor_class_data_ccsds_packing.c
index fd3a4dc..1e113f2 100644
--- a/src/grib_accessor_class_data_ccsds_packing.c
+++ b/src/grib_accessor_class_data_ccsds_packing.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -402,20 +402,14 @@ static int pack_double(grib_accessor* a, const double* val, size_t *len)
     if((err = grib_get_long_internal(grib_handle_of_accessor(a),self->number_of_data_points,&number_of_data_points)) != GRIB_SUCCESS)
         return err;
 
-
-
-
     d = grib_power(decimal_scale_factor,10) ;
 
-
     max = val[0];
     min = max;
     for(i=1;i< n_vals;i++)
     {
-        if (val[i] > max )
-            max = val[i];
-        if (val[i] < min )
-            min = val[i];
+        if      (val[i] > max) max = val[i];
+        else if (val[i] < min) min = val[i];
     }
     min *= d;
     max *= d;
@@ -470,7 +464,6 @@ static int pack_double(grib_accessor* a, const double* val, size_t *len)
         goto cleanup;
     }
 
-
     if((err = grib_set_double_internal(grib_handle_of_accessor(a),self->reference_value, reference_value)) != GRIB_SUCCESS)
         return err;
     {
diff --git a/src/grib_accessor_class_data_complex_packing.c b/src/grib_accessor_class_data_complex_packing.c
index 2e85e5f..19bff0a 100644
--- a/src/grib_accessor_class_data_complex_packing.c
+++ b/src/grib_accessor_class_data_complex_packing.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -9,6 +9,7 @@
  */
 
 #include "grib_api_internal.h"
+#include "grib_optimize_decimal_factor.h"
 #include <math.h>
 /*
    This is used by make_class.pl
@@ -70,6 +71,7 @@ typedef struct grib_accessor_data_complex_packing {
 	const char*  reference_value;
 	const char*  binary_scale_factor;
 	const char*  decimal_scale_factor;
+	const char*  optimize_scaling_factor;
 /* Members defined in data_complex_packing */
 	const char*  GRIBEX_sh_bug_present;
 	const char*  ieee_floats;
@@ -219,8 +221,7 @@ static int value_count(grib_accessor* a,long* count)
     return ret;
 }
 
-
-static int  unpack_double(grib_accessor* a, double* val, size_t *len)
+static int unpack_double_standard(grib_accessor* a, double* val, size_t *len)
 {
     grib_accessor_data_complex_packing* self =  (grib_accessor_data_complex_packing*)a;
     grib_handle* gh = grib_handle_of_accessor(a);
@@ -444,6 +445,224 @@ static int  unpack_double(grib_accessor* a, double* val, size_t *len)
     return ret;
 }
 
+static int unpack_double_optimised(grib_accessor* a, double* val, size_t *len)
+{
+    grib_accessor_data_complex_packing* self =  (grib_accessor_data_complex_packing*)a;
+    grib_handle* gh = grib_handle_of_accessor(a);
+
+    size_t i = 0;
+    int ret = GRIB_SUCCESS;
+    long   hcount = 0;
+    long   lcount = 0;
+    long   hpos = 0;
+    long   lup = 0;
+    long   mmax = 0;
+    long   n_vals = 0;
+    double *scals  = NULL;
+    double *pscals=NULL,*pval=NULL;
+
+    double s = 0;
+    double d = 0;
+    double laplacianOperator = 0;
+    unsigned char* buf = NULL;
+    unsigned char* hres = NULL;
+    unsigned char* lres = NULL;
+    unsigned long packed_offset;
+    long   lpos = 0;
+
+    long   maxv = 0;
+    long   GRIBEX_sh_bug_present =0;
+    long ieee_floats  = 0;
+
+    long   offsetdata           = 0;
+    long   bits_per_value          = 0;
+    double reference_value      = 0;
+    long   binary_scale_factor         = 0;
+    long   decimal_scale_factor = 0;
+
+    long   sub_j= 0;
+    long   sub_k= 0;
+    long   sub_m= 0;
+    long   pen_j= 0;
+    long   pen_k= 0;
+    long   pen_m= 0;
+
+    double operat= 0;
+    int bytes;
+    int err=0;
+
+    decode_float_proc decode_float = NULL;
+
+    err=grib_value_count(a,&n_vals);
+    if (err) return err;
+
+    if(*len < n_vals){
+        *len = n_vals;
+        return GRIB_ARRAY_TOO_SMALL;
+    }
+
+    if((ret = grib_get_long_internal(gh,self->offsetdata,&offsetdata))
+            != GRIB_SUCCESS)   return ret;
+    if((ret = grib_get_long_internal(gh,self->bits_per_value,&bits_per_value))
+            != GRIB_SUCCESS)   return ret;
+    if((ret = grib_get_double_internal(gh,self->reference_value,&reference_value))
+            != GRIB_SUCCESS)   return ret;
+    if((ret = grib_get_long_internal(gh,self->binary_scale_factor,&binary_scale_factor))
+            != GRIB_SUCCESS)           return ret;
+
+    if((ret = grib_get_long_internal(gh,self->decimal_scale_factor,&decimal_scale_factor))
+            != GRIB_SUCCESS)
+        return ret;
+
+    if((ret = grib_get_long_internal(gh,self->GRIBEX_sh_bug_present,&GRIBEX_sh_bug_present))
+            != GRIB_SUCCESS)
+        return ret;
+
+    if((ret = grib_get_long_internal(gh,self->ieee_floats,&ieee_floats)) != GRIB_SUCCESS)
+        return ret;
+
+    if((ret = grib_get_double_internal(gh,self->laplacianOperator,&laplacianOperator))
+            != GRIB_SUCCESS)
+        return ret;
+    if((ret = grib_get_long_internal(gh,self->sub_j,&sub_j)) != GRIB_SUCCESS)
+        return ret;
+    if((ret = grib_get_long_internal(gh,self->sub_k,&sub_k)) != GRIB_SUCCESS)
+        return ret;
+    if((ret = grib_get_long_internal(gh,self->sub_m,&sub_m)) != GRIB_SUCCESS)
+        return ret;
+    if((ret = grib_get_long_internal(gh,self->pen_j,&pen_j)) != GRIB_SUCCESS)
+        return ret;
+    if((ret = grib_get_long_internal(gh,self->pen_k,&pen_k)) != GRIB_SUCCESS)
+        return ret;
+    if((ret = grib_get_long_internal(gh,self->pen_m,&pen_m)) != GRIB_SUCCESS)
+        return ret;
+
+    self->dirty=0;
+
+    switch (ieee_floats) {
+    case 0:
+        decode_float=grib_long_to_ibm;
+        bytes=4;
+        break;
+    case 1:
+        decode_float=grib_long_to_ieee;
+        bytes=4;
+        break;
+    case 2:
+        decode_float=grib_long_to_ieee64;
+        bytes=8;
+        break;
+    default:
+        return GRIB_NOT_IMPLEMENTED;
+    }
+
+    Assert (sub_j == sub_k);
+    Assert (sub_j == sub_m);
+    Assert (pen_j == pen_k);
+    Assert (pen_j == pen_m);
+
+    buf = (unsigned char*)gh->buffer->data;
+
+    maxv = pen_j+1;
+
+    buf  += grib_byte_offset(a);
+    hres = buf;
+    lres = buf;
+
+    if (pen_j == sub_j) {
+        n_vals = (pen_j+1)*(pen_j+2);
+        d = grib_power(-decimal_scale_factor,10) ;
+        grib_ieee_decode_array(a->context,buf,n_vals,bytes,val);
+        if (d) {
+            for (i=0;i<n_vals;i++) val[i]*=d;
+        }
+        return 0;
+    }
+
+    packed_offset = grib_byte_offset(a) +  4*(sub_k+1)*(sub_k+2);
+
+    lpos = 8*(packed_offset-offsetdata);
+
+    s = grib_power(binary_scale_factor,2);
+    d = grib_power(-decimal_scale_factor,10) ;
+
+    scals   = (double*)grib_context_malloc(a->context,maxv*sizeof(double));
+    Assert(scals);
+
+    scals[0] = 0;
+    for(i=1;i<maxv;i++){
+        operat = pow(i*(i+1),laplacianOperator);
+        if(operat !=  0)
+            scals[i] = (1.0/operat);
+        else{
+            grib_context_log(a->context,GRIB_LOG_WARNING,
+                    "COMPLEX_PACKING : problem with operator div by zero at index %d of %d \n",
+                    i , maxv);
+            scals[i] = 0;
+        }
+    }
+
+    /*
+  printf("UNPACKING LAPLACE=%.20f\n",laplacianOperator);
+
+  printf("packed offset=%ld\n",packed_offset);
+  for(i=0;i<maxv;i++)
+    printf("scals[%d]=%g\n",i,scals[i]);*/
+
+    i=0;
+
+    while(maxv>0)
+    {
+        lup=mmax;
+        if(sub_k>=0)
+        {
+            for(hcount=0;hcount<sub_k+1;hcount++)
+            {
+                val[i++] =  decode_float(grib_decode_unsigned_long(hres,&hpos,32));
+                val[i++] =  decode_float(grib_decode_unsigned_long(hres,&hpos,32));
+
+                if (GRIBEX_sh_bug_present && hcount==sub_k){
+                    /*  bug in ecmwf data, last row (K+1)is scaled but should not */
+                    val[i-2] *= scals[lup];
+                    val[i-1] *= scals[lup];
+                }
+                lup++;
+            }
+            sub_k--;
+        }
+
+        pscals=scals+lup;
+        pval=val+i;
+#if FAST_BIG_ENDIAN
+        grib_decode_double_array_complex(lres,
+                &lpos,bits_per_value,
+                reference_value,s,pscals,(maxv-hcount)*2,pval);
+        i+=(maxv-hcount)*2;
+#else
+        (void)pscals; /* suppress gcc warning */
+        (void)pval;   /* suppress gcc warning */
+        for(lcount=hcount; lcount < maxv ; lcount++)
+        {
+            val[i++] =  d * (double) ((grib_decode_unsigned_long(lres, &lpos,
+                    bits_per_value)*s)+reference_value)*scals[lup];
+            val[i++] =  d * (double) ((grib_decode_unsigned_long(lres, &lpos,
+                    bits_per_value)*s)+reference_value)*scals[lup];
+            lup++;
+        }
+#endif
+
+        maxv--;
+        hcount=0;
+        mmax++;
+    }
+
+    Assert(*len >= i);
+    *len = i;
+
+    grib_context_free(a->context,scals);
+
+    return ret;
+}
 
 #define MAXVAL(a,b) a>b?a:b
 
@@ -550,9 +769,8 @@ static double calculate_pfactor(grib_context *ctx,const double* spectralField, l
     return pFactor;
 }
 
-
-static int pack_double(grib_accessor* a, const double* val, size_t *len) {
-
+static int pack_double_standard(grib_accessor* a, const double* val, size_t *len)
+{
     grib_accessor_data_complex_packing* self =  (grib_accessor_data_complex_packing*)a;
     grib_handle* gh = grib_handle_of_accessor(a);
 
@@ -586,6 +804,7 @@ static int pack_double(grib_accessor* a, const double* val, size_t *len) {
     double reference_value      = 0;
     long   binary_scale_factor         = 0;
     long   decimal_scale_factor = 0;
+    long   optimize_scaling_factor = 0;
     long   laplacianOperatorIsSet = 0;
 
     double laplacianOperator = 0;
@@ -615,6 +834,9 @@ static int pack_double(grib_accessor* a, const double* val, size_t *len) {
     if((ret = grib_get_long_internal(gh,self->decimal_scale_factor,&decimal_scale_factor)) != GRIB_SUCCESS)
         return ret;
 
+    if((ret = grib_get_long_internal(gh,self->optimize_scaling_factor,&optimize_scaling_factor)) != GRIB_SUCCESS)
+        return ret;
+
     if((ret = grib_get_long_internal(gh,self->GRIBEX_sh_bug_present,&GRIBEX_sh_bug_present)) != GRIB_SUCCESS)
         return ret;
 
@@ -641,7 +863,6 @@ static int pack_double(grib_accessor* a, const double* val, size_t *len) {
 
     self->dirty=1;
 
-
     switch (ieee_floats) {
     case 0:
         encode_float =grib_ibm_to_long;
@@ -719,7 +940,6 @@ static int pack_double(grib_accessor* a, const double* val, size_t *len) {
     for(i=1;i<maxv;i++)
         scals[i] = ((double)pow(i*(i+1),laplacianOperator));
 
-
     i=0;
 
     mmax = 0;
@@ -893,5 +1113,398 @@ static int pack_double(grib_accessor* a, const double* val, size_t *len) {
     grib_context_free(a->context,scals);
 
     return ret;
+}
+
+static int pack_double_optimised(grib_accessor* a, const double* val, size_t *len)
+{
+    grib_accessor_data_complex_packing* self =  (grib_accessor_data_complex_packing*)a;
+    grib_handle* gh = grib_handle_of_accessor(a);
+
+    size_t i = 0;
+    int ret = GRIB_SUCCESS;
+    long   hcount = 0;
+    long   lcount = 0;
+    long   hpos = 0;
+    long   lup = 0;
+    long   mmax = 0;
+    long   n_vals = 0;
+    double *scals  = NULL;
+
+    double s = 0;
+    double d = 0;
+
+    unsigned char* buf    = NULL;
+
+    size_t         buflen = 0;
+    size_t         hsize = 0;
+    size_t         lsize = 0;
+
+    unsigned char* hres = NULL;
+    unsigned char* lres = NULL;
 
+    long   lpos = 0;
+    long   maxv = 0;
+
+    long   offsetdata           = 0;
+    long   bits_per_value          = 0;
+    double reference_value      = 0;
+    long   binary_scale_factor         = 0;
+    long   decimal_scale_factor = 0;
+    long   optimize_scaling_factor = 0;
+    long   laplacianOperatorIsSet = 0;
+
+    double laplacianOperator = 0;
+    long   sub_j= 0;
+    long   sub_k= 0;
+    long   sub_m= 0;
+    long   pen_j= 0;
+    long   pen_k= 0;
+    long   pen_m= 0;
+    long   GRIBEX_sh_bug_present =0;
+    long   ieee_floats =0;
+    double min = 0;
+    double max = 0;
+    double current_val = 0;
+    short mixmax_unset = 0;
+    int bytes;
+
+    encode_float_proc encode_float = NULL;
+
+    if (*len ==0) return GRIB_NO_VALUES;
+
+    if((ret = grib_get_long_internal(gh,self->offsetdata,&offsetdata)) != GRIB_SUCCESS)
+        return ret;
+    if((ret = grib_get_long_internal(gh,self->bits_per_value,&bits_per_value)) != GRIB_SUCCESS)
+        return ret;
+
+    if((ret = grib_get_long_internal(gh,self->decimal_scale_factor,&decimal_scale_factor)) != GRIB_SUCCESS)
+        return ret;
+
+    if((ret = grib_get_long_internal(gh,self->optimize_scaling_factor,&optimize_scaling_factor)) != GRIB_SUCCESS)
+        return ret;
+
+    if((ret = grib_get_long_internal(gh,self->GRIBEX_sh_bug_present,&GRIBEX_sh_bug_present)) != GRIB_SUCCESS)
+        return ret;
+
+    if((ret = grib_get_long_internal(gh,self->ieee_floats,&ieee_floats)) != GRIB_SUCCESS)
+        return ret;
+
+    if((ret = grib_get_long_internal(gh,self->laplacianOperatorIsSet,&laplacianOperatorIsSet)) != GRIB_SUCCESS)
+        return ret;
+    if((ret = grib_get_double_internal(gh,self->laplacianOperator,&laplacianOperator)) != GRIB_SUCCESS)
+        return ret;
+
+    if((ret = grib_get_long_internal(gh,self->sub_j,&sub_j)) != GRIB_SUCCESS)
+        return ret;
+    if((ret = grib_get_long_internal(gh,self->sub_k,&sub_k)) != GRIB_SUCCESS)
+        return ret;
+    if((ret = grib_get_long_internal(gh,self->sub_m,&sub_m)) != GRIB_SUCCESS)
+        return ret;
+    if((ret = grib_get_long_internal(gh,self->pen_j,&pen_j)) != GRIB_SUCCESS)
+        return ret;
+    if((ret = grib_get_long_internal(gh,self->pen_k,&pen_k)) != GRIB_SUCCESS)
+        return ret;
+    if((ret = grib_get_long_internal(gh,self->pen_m,&pen_m)) != GRIB_SUCCESS)
+        return ret;
+
+    self->dirty=1;
+
+    switch (ieee_floats) {
+    case 0:
+        encode_float =grib_ibm_to_long;
+        bytes=4;
+        break;
+    case 1:
+        encode_float =grib_ieee_to_long;
+        bytes=4;
+        break;
+    case 2:
+        encode_float =grib_ieee64_to_long;
+        bytes=8;
+        break;
+    default:
+        return GRIB_NOT_IMPLEMENTED;
+    }
+
+    Assert (sub_j == sub_k); Assert( sub_j == sub_m);
+    Assert (pen_j == pen_k); Assert( pen_j == pen_m);
+
+    n_vals = (pen_j+1)*(pen_j+2);
+
+    if(*len != n_vals){
+        grib_context_log(a->context,GRIB_LOG_ERROR,"COMPLEX_PACKING : wrong number of values, expected %d - got %d",n_vals,*len);
+        return GRIB_INTERNAL_ERROR;
+    }
+
+    if (pen_j == sub_j) {
+        double* values;
+        d = grib_power(decimal_scale_factor,10) ;
+        if (d) {
+            values=(double*)grib_context_malloc_clear(a->context,sizeof(double)*n_vals);
+            for (i=0;i<n_vals;i++) values[i]=val[i]*d;
+        } else {
+            values=(double*)val;
+        }
+        buflen=n_vals*bytes;
+        buf = (unsigned char*)grib_context_malloc_clear(a->context,buflen);
+        grib_ieee_encode_array(a->context,values,n_vals,bytes,buf);
+        if (d) grib_context_free(a->context,values);
+        grib_buffer_replace(a, buf, buflen,1,1);
+        grib_context_free(a->context,buf);
+        return 0;
+    }
+
+    if(!laplacianOperatorIsSet) {
+        laplacianOperator = calculate_pfactor(a->context,val,pen_j,sub_j);
+        if((ret = grib_set_double_internal(gh,self->laplacianOperator,laplacianOperator))
+                != GRIB_SUCCESS) return ret;
+        grib_get_double_internal(gh,self->laplacianOperator,&laplacianOperator);
+    }
+
+    hsize = 4*(sub_k+1)*(sub_k+2);
+    lsize = ((n_vals - ((sub_k+1)*(sub_k+2)))*bits_per_value)/8;
+
+    buflen = hsize+lsize;
+
+    buf  = (unsigned char*)grib_context_malloc(a->context,buflen);
+    hres = buf;
+    lres = buf+hsize;
+
+    maxv = pen_j+1;
+
+    lpos = 0;
+    hpos = 0;
+
+    scals   = (double*) grib_context_malloc(a->context,maxv*sizeof(double));
+    Assert(scals);
+
+    scals[0] =0;
+    for(i=1;i<maxv;i++)
+        scals[i] = ((double)pow(i*(i+1),laplacianOperator));
+
+    i=0;
+
+    mmax = 0;
+    maxv = pen_j+1;
+    i=0;
+    lcount=0;
+    hcount=0;
+    sub_k = sub_j;
+
+    while(maxv>0)
+    {
+        lup=mmax;
+
+        if(sub_k>=0)
+        {
+            i   += 2*(sub_k+1);
+            lup +=    sub_k+1 ;
+            hcount += sub_k+1 ;
+            sub_k--;
+        }
+
+        for(lcount=hcount; lcount < maxv ; lcount++)
+        {
+            current_val = ((val[i++]) * scals[lup]);
+            if(mixmax_unset == 0){
+                max = current_val;
+                min = current_val;
+                mixmax_unset = 1;
+            }
+
+            if(current_val > max) max = current_val;
+            if(current_val < min) min = current_val;
+
+            current_val = ((val[i++]) * scals[lup]);
+            if(current_val > max) max = current_val;
+            if(current_val < min) min = current_val;
+
+            lup++;
+        }
+        maxv--;
+        hcount=0;
+        mmax++;
+    }
+
+    if (optimize_scaling_factor)
+    {
+        ret = grib_optimize_decimal_factor (a, self->reference_value,
+                max, min, bits_per_value, 0, 1,
+                &decimal_scale_factor,
+                &binary_scale_factor,
+                &reference_value);
+        if (ret !=GRIB_SUCCESS) {
+            grib_context_log(gh->context,GRIB_LOG_ERROR,
+                    "unable to find nearest_smaller_value of %g for %s",min,self->reference_value);
+            return GRIB_INTERNAL_ERROR;
+        }
+    }
+    else
+    {
+        if (grib_get_nearest_smaller_value(gh,self->reference_value,min,&reference_value)
+                !=GRIB_SUCCESS) {
+            grib_context_log(gh->context,GRIB_LOG_ERROR,
+                    "unable to find nearest_smaller_value of %g for %s",min,self->reference_value);
+            return GRIB_INTERNAL_ERROR;
+        }
+        binary_scale_factor = grib_get_binary_scale_fact(max,reference_value,bits_per_value,&ret);
+
+        if (ret==GRIB_UNDERFLOW) {
+            d=0;
+            binary_scale_factor = 0;
+            reference_value=0;
+        } else {
+            if (ret!=GRIB_SUCCESS) {
+                grib_context_log(a->context,GRIB_LOG_ERROR,"COMPLEX_PACKING : Cannot compute binary_scale_factor");
+                return ret;
+            }
+        }
+    }
+    d = grib_power(+decimal_scale_factor,10);
+    s = grib_power(- binary_scale_factor, 2);
+
+    i=0;
+
+    mmax = 0;
+    maxv = pen_j+1;
+    i=0;
+    lcount=0;
+    hcount=0;
+    sub_k = sub_j;
+
+    while(maxv>0)
+    {
+        lup=mmax;
+
+        if(sub_k>=0)
+        {
+            for(hcount=0;hcount<sub_k+1;hcount++)
+            {
+                if ( GRIBEX_sh_bug_present && hcount==sub_k ) {
+                    /* _test(val[i]*d*scals[lup],1); */
+                    grib_encode_unsigned_long(hres, encode_float((val[i++]*d)*scals[lup]) , &hpos, 32);
+                    /* _test(val[i]*d*scals[lup],1); */
+                    grib_encode_unsigned_long(hres, encode_float((val[i++]*d)*scals[lup]) , &hpos, 32);
+                }else{
+
+                    /* _test(val[i]*d,0); */
+
+                    grib_encode_unsigned_long(hres, encode_float(val[i++]) , &hpos, 32);
+                    /* _test(val[i]*d,0); */
+                    grib_encode_unsigned_long(hres, encode_float(val[i++]) , &hpos, 32);
+                }
+                lup++;
+            }
+            sub_k--;
+        }
+
+#if FAST_BIG_ENDIAN
+        grib_encode_double_array_complex((maxv-hcount)*2,&(val[i]),bits_per_value,reference_value,&(scals[lup]),d,s,lres,&lpos);
+        i+=(maxv-hcount)*2;
+#else
+        if (bits_per_value % 8) {
+            for(lcount=hcount; lcount < maxv ; lcount++)
+            {
+                current_val = (((((val[i++]*d) * scals[lup])-reference_value)*s)+0.5);
+                if(current_val < 0)
+                    grib_context_log(a->context,GRIB_LOG_ERROR,
+                            "COMPLEX_PACKING : negative coput before packing (%g)", current_val);
+                grib_encode_unsigned_longb(lres, current_val, &lpos, bits_per_value);
+
+                current_val = (((((val[i++]*d) * scals[lup])-reference_value)*s)+0.5);
+                if(current_val < 0)
+                    grib_context_log(a->context,GRIB_LOG_ERROR,
+                            "COMPLEX_PACKING : negative coput before packing (%g)", current_val);
+                grib_encode_unsigned_longb(lres, current_val, &lpos, bits_per_value);
+                lup++;
+            }
+        } else {
+            for(lcount=hcount; lcount < maxv ; lcount++)
+            {
+                current_val = (((((val[i++]*d) * scals[lup])-reference_value)*s)+0.5);
+                if(current_val < 0)
+                    grib_context_log(a->context,GRIB_LOG_ERROR,
+                            "COMPLEX_PACKING : negative coput before packing (%g)", current_val);
+                grib_encode_unsigned_long(lres, current_val, &lpos, bits_per_value);
+
+                current_val = (((((val[i++]*d) * scals[lup])-reference_value)*s)+0.5);
+                if(current_val < 0)
+                    grib_context_log(a->context,GRIB_LOG_ERROR,
+                            "COMPLEX_PACKING : negative coput before packing (%g)", current_val);
+                grib_encode_unsigned_long(lres, current_val, &lpos, bits_per_value);
+                lup++;
+            }
+        }
+#endif
+
+        maxv--;
+        hcount=0;
+        mmax++;
+    }
+
+    if(((hpos/8) != hsize) &&((lpos/8) != lsize))
+    {
+        grib_context_log(a->context,GRIB_LOG_ERROR,
+                "COMPLEX_PACKING : Mismatch in packing between high resolution and low resolution part");
+        grib_context_free(a->context,buf);
+        grib_context_free(a->context,scals);
+        return GRIB_INTERNAL_ERROR;
+    }
+
+    buflen = ((hpos + lpos)/8);
+
+    if((ret = grib_set_double_internal(gh,self->reference_value, reference_value)) != GRIB_SUCCESS)
+        return ret;
+    {
+        /* Make sure we can decode it again */
+        double ref = 1e-100;
+        grib_get_double_internal(gh,self->reference_value,&ref);
+        Assert(ref == reference_value);
+    }
+
+    if((ret = grib_set_long_internal(gh,self->binary_scale_factor, binary_scale_factor)) != GRIB_SUCCESS)
+        return ret;
+    if((ret = grib_set_long_internal(gh,self->decimal_scale_factor,decimal_scale_factor)) != GRIB_SUCCESS)
+        return ret;
+
+    grib_buffer_replace(a, buf, buflen,1,1);
+    grib_context_free(a->context,buf);
+    grib_context_free(a->context,scals);
+
+    return ret;
+}
+
+/* The driver unpack and pack routines. See ECC-261 */
+static int unpack_double(grib_accessor* a, double* val, size_t *len)
+{
+    grib_accessor_data_complex_packing* self =  (grib_accessor_data_complex_packing*)a;
+    grib_handle* gh = grib_handle_of_accessor(a);
+    int ret = GRIB_SUCCESS;
+    long optimize_scaling_factor = 0;
+
+    if ((ret = grib_get_long_internal(gh, self->optimize_scaling_factor, &optimize_scaling_factor)) != GRIB_SUCCESS)
+        return ret;
+
+    if (optimize_scaling_factor) {
+        return unpack_double_optimised(a, val, len);
+    } else {
+        return unpack_double_standard(a, val, len);
+    }
+}
+
+static int pack_double(grib_accessor* a, const double* val, size_t *len)
+{
+    grib_accessor_data_complex_packing* self =  (grib_accessor_data_complex_packing*)a;
+    grib_handle* gh = grib_handle_of_accessor(a);
+    int ret = GRIB_SUCCESS;
+    long optimize_scaling_factor = 0;
+
+    if ((ret = grib_get_long_internal(gh, self->optimize_scaling_factor, &optimize_scaling_factor)) != GRIB_SUCCESS)
+        return ret;
+
+    if (optimize_scaling_factor) {
+        return pack_double_optimised(a, val, len);
+    } else {
+        return pack_double_standard(a, val, len);
+    }
 }
diff --git a/src/grib_accessor_class_data_constant_field.c b/src/grib_accessor_class_data_constant_field.c
index d160841..6d61a80 100644
--- a/src/grib_accessor_class_data_constant_field.c
+++ b/src/grib_accessor_class_data_constant_field.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_data_dummy_field.c b/src/grib_accessor_class_data_dummy_field.c
index 66a6195..cd4fcec 100644
--- a/src/grib_accessor_class_data_dummy_field.c
+++ b/src/grib_accessor_class_data_dummy_field.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -62,6 +62,7 @@ typedef struct grib_accessor_data_dummy_field {
 	const char*  reference_value;
 	const char*  binary_scale_factor;
 	const char*  decimal_scale_factor;
+	const char*  optimize_scaling_factor;
 /* Members defined in data_g1simple_packing */
 	const char*  half_byte;
 	const char*  packingType;
diff --git a/src/grib_accessor_class_data_g1complex_packing.c b/src/grib_accessor_class_data_g1complex_packing.c
index 8edbe58..ebef000 100644
--- a/src/grib_accessor_class_data_g1complex_packing.c
+++ b/src/grib_accessor_class_data_g1complex_packing.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -61,6 +61,7 @@ typedef struct grib_accessor_data_g1complex_packing {
 	const char*  reference_value;
 	const char*  binary_scale_factor;
 	const char*  decimal_scale_factor;
+	const char*  optimize_scaling_factor;
 /* Members defined in data_complex_packing */
 	const char*  GRIBEX_sh_bug_present;
 	const char*  ieee_floats;
diff --git a/src/grib_accessor_class_data_g1second_order_constant_width_packing.c b/src/grib_accessor_class_data_g1second_order_constant_width_packing.c
index 4f95d34..8052c63 100644
--- a/src/grib_accessor_class_data_g1second_order_constant_width_packing.c
+++ b/src/grib_accessor_class_data_g1second_order_constant_width_packing.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -76,6 +76,7 @@ typedef struct grib_accessor_data_g1second_order_constant_width_packing {
 	const char*  reference_value;
 	const char*  binary_scale_factor;
 	const char*  decimal_scale_factor;
+	const char*  optimize_scaling_factor;
 /* Members defined in data_g1second_order_constant_width_packing */
 	const char* half_byte;
 	const char* packingType;
diff --git a/src/grib_accessor_class_data_g1second_order_general_extended_packing.c b/src/grib_accessor_class_data_g1second_order_general_extended_packing.c
index b2c714f..feb2e1a 100644
--- a/src/grib_accessor_class_data_g1second_order_general_extended_packing.c
+++ b/src/grib_accessor_class_data_g1second_order_general_extended_packing.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -9,6 +9,7 @@
  */
 
 #include "grib_api_internal.h"
+#include "grib_optimize_decimal_factor.h"
 
 /*
    This is used by make_class.pl
@@ -89,6 +90,7 @@ typedef struct grib_accessor_data_g1second_order_general_extended_packing {
 	const char*  reference_value;
 	const char*  binary_scale_factor;
 	const char*  decimal_scale_factor;
+	const char*  optimize_scaling_factor;
 /* Members defined in data_g1second_order_general_extended_packing */
 	const char* half_byte;
 	const char* packingType;
@@ -202,13 +204,23 @@ static void init_class(grib_accessor_class* c)
 #define MAX_NUMBER_OF_GROUPS 65534
 #define EFDEBUG 0
 
-static unsigned long nbits[32]={
-        0x1, 0x2, 0x4, 0x8, 0x10, 0x20,
-        0x40, 0x80, 0x100, 0x200, 0x400, 0x800,
-        0x1000, 0x2000, 0x4000, 0x8000, 0x10000, 0x20000,
-        0x40000, 0x80000, 0x100000, 0x200000, 0x400000, 0x800000,
-        0x1000000, 0x2000000, 0x4000000, 0x8000000, 0x10000000, 0x20000000,
-        0x40000000, 0x80000000
+static unsigned long nbits[64]={
+        0x1,                 0x2,                 0x4,                 0x8, 
+        0x10,                0x20,                0x40,                0x80, 
+        0x100,               0x200,               0x400,               0x800,
+        0x1000,              0x2000,              0x4000,              0x8000, 
+        0x10000,             0x20000,             0x40000,             0x80000, 
+        0x100000,            0x200000,            0x400000,            0x800000,
+        0x1000000,           0x2000000,           0x4000000,           0x8000000, 
+        0x10000000,          0x20000000,          0x40000000,          0x80000000, 
+        0x100000000,         0x200000000,         0x400000000,         0x800000000,
+        0x1000000000,        0x2000000000,        0x4000000000,        0x8000000000,
+        0x10000000000,       0x20000000000,       0x40000000000,       0x80000000000,
+        0x100000000000,      0x200000000000,      0x400000000000,      0x800000000000,
+        0x1000000000000,     0x2000000000000,     0x4000000000000,     0x8000000000000,
+        0x10000000000000,    0x20000000000000,    0x40000000000000,    0x80000000000000,
+        0x100000000000000,   0x200000000000000,   0x400000000000000,   0x800000000000000,
+        0x1000000000000000,  0x2000000000000000,  0x4000000000000000,  0x8000000000000000 
 };
 
 static long number_of_bits(grib_handle*h, unsigned long x)
@@ -598,7 +610,7 @@ static void grib_split_long_groups(grib_handle* hand, grib_context* c,long* numb
     grib_context_free(c,localFirstOrderValues);
 }
 
-static int pack_double(grib_accessor* a, const double* val, size_t *len)
+static int pack_double_standard(grib_accessor* a, const double* val, size_t *len)
 {
     grib_accessor_data_g1second_order_general_extended_packing* self =  (grib_accessor_data_g1second_order_general_extended_packing*)a;
     int ret=0;
@@ -1202,6 +1214,652 @@ static int pack_double(grib_accessor* a, const double* val, size_t *len)
     return ret;
 }
 
+static int pack_double_optimised(grib_accessor* a, const double* val, size_t *len)
+{
+    grib_accessor_data_g1second_order_general_extended_packing* self =  (grib_accessor_data_g1second_order_general_extended_packing*)a;
+    int ret=0;
+    int grib2=0;
+    long bits_per_value,orderOfSPD,binary_scale_factor;
+    long numberOfValues;
+    double max,min;
+    double decimal,divisor;
+    double reference_value;
+    size_t size,sizebits;
+    long half_byte;
+    long* X;
+    long* Xp;
+    long i;
+    long incrementGroupLengthA,groupWidthA,prevGroupLength,offsetD,remainingValuesB,groupLengthB;
+    long maxB,minB,maxAB,minAB;
+    long offsetBeforeData,offsetSection4;
+    unsigned char*  buffer = NULL;
+    long maxWidth,maxLength,widthOfWidths,NL,widthOfLengths,N1,N2,extraValues,codedNumberOfGroups,numberOfSecondOrderPackedValues;
+    long pos;
+
+    long numberOfGroups;
+    long groupLengthC,groupLengthA,remainingValues,count;
+    long maxA=0,minA=0;
+    long maxC,minC,offsetC;
+    long maxAC,minAC;
+    long range,bias=0,maxSPD;
+    long firstOrderValuesMax,offset,groupLength,j,groupWidth,firstOrderValue,lengthOfSecondOrderValues;
+    long *groupLengths,*groupWidths,*firstOrderValues;
+    /* long groupLengths[MAX_NUMBER_OF_GROUPS],groupWidths[MAX_NUMBER_OF_GROUPS],firstOrderValues[MAX_NUMBER_OF_GROUPS]; */
+
+    /* TODO put these parameters in def file */
+    long startGroupLength=15;
+    long incrementGroupLength=3;
+    long minGroupLength=3;
+    long widthOfSPD=0,widthOfBias=0;
+    long *offsets;
+    long widthOfFirstOrderValues;
+    int computeGroupA=1;
+    long dataHeadersLength,widthsLength,lengthsLength,firstOrderValuesLength;
+    long decimal_scale_factor;
+    grib_handle* handle = grib_handle_of_accessor(a);
+    long optimize_scaling_factor = 0;
+    grib_context* c=handle->context;
+    int compat_gribex = c->gribex_mode_on && self->edition==1;
+
+    self->dirty=1;
+
+    numberOfValues=*len;
+
+    min = max = val[0];
+    for(i=1;i< numberOfValues;i++) {
+        if (val[i] > max ) max = val[i];
+        if (val[i] < min ) min = val[i];
+    }
+
+    if((ret=grib_get_long_internal(handle,self->bits_per_value,&bits_per_value)) != GRIB_SUCCESS)
+        return ret;
+
+    if((ret = grib_get_long_internal(handle,self->optimize_scaling_factor, &optimize_scaling_factor))
+            != GRIB_SUCCESS)
+        return ret;
+
+    if (optimize_scaling_factor)
+    {
+        if((ret=grib_optimize_decimal_factor (a, self->reference_value,
+                max, min, bits_per_value,
+                compat_gribex, 1,
+                &decimal_scale_factor, &binary_scale_factor, &reference_value)) != GRIB_SUCCESS)
+            return ret;
+    }
+    else
+    {
+        /* For constant fields set decimal scale factor to 0 (See GRIB-165) */
+        if (min==max) {
+            grib_set_long_internal(handle,self->decimal_scale_factor, 0);
+        }
+        if((ret = grib_get_long_internal(handle,self->decimal_scale_factor, &decimal_scale_factor))
+                != GRIB_SUCCESS)
+            return ret;
+
+        if (grib_get_nearest_smaller_value(handle,self->reference_value,min,&reference_value)
+                !=GRIB_SUCCESS) {
+            grib_context_log(handle->context,GRIB_LOG_ERROR,
+                    "unable to find nearest_smaller_value of %g for %s",min,self->reference_value);
+            exit(GRIB_INTERNAL_ERROR);
+        }
+        binary_scale_factor = grib_get_binary_scale_fact(max,reference_value,bits_per_value,&ret);
+
+        if((ret = grib_set_long_internal(handle,self->binary_scale_factor, binary_scale_factor)) !=
+                GRIB_SUCCESS)
+            return ret;
+    }
+
+    decimal = grib_power(decimal_scale_factor,10);
+    divisor = grib_power(-binary_scale_factor,2);
+
+    min = min * decimal;
+    max = max * decimal;
+
+    if((ret = grib_set_long_internal(handle,self->decimal_scale_factor, decimal_scale_factor)) !=
+            GRIB_SUCCESS)
+        return ret;
+
+    if((ret = grib_set_long_internal(handle,self->binary_scale_factor, binary_scale_factor)) !=
+            GRIB_SUCCESS)
+        return ret;
+
+    if((ret = grib_set_double_internal(handle,self->reference_value, reference_value)) !=
+            GRIB_SUCCESS)
+        return ret;
+
+    if((ret=grib_get_long_internal(handle,self->offsetdata,&offsetBeforeData)) != GRIB_SUCCESS)
+        return ret;
+
+    if((ret=grib_get_long_internal(handle,self->offsetsection,&offsetSection4)) != GRIB_SUCCESS)
+        return ret;
+
+    if((ret=grib_get_long_internal(handle,self->orderOfSPD,&orderOfSPD)) != GRIB_SUCCESS)
+        return ret;
+
+    X=(long*)grib_context_malloc_clear(a->context,sizeof(long)*numberOfValues);
+    for(i=0;i< numberOfValues;i++){
+        X[i] = (((val[i]*decimal)-reference_value)*divisor)+0.5;
+    }
+
+    groupLengths=(long*)grib_context_malloc_clear(a->context,sizeof(long)*numberOfValues);
+    groupWidths=(long*)grib_context_malloc_clear(a->context,sizeof(long)*numberOfValues);
+    firstOrderValues=(long*)grib_context_malloc_clear(a->context,sizeof(long)*numberOfValues);
+
+    /* spatial differencing */
+    switch (orderOfSPD) {
+    case 1:
+        for (i=numberOfValues-1;i>0;i--) {
+            X[i]-=X[i-1];
+        }
+        break;
+    case 2:
+        for (i=numberOfValues-1;i>1;i--) {
+            X[i]-=2*X[i-1]-X[i-2];
+        }
+        break;
+    case 3:
+        for (i=numberOfValues-1;i>2;i--) {
+            X[i]-=3*(X[i-1]-X[i-2])+X[i-3];
+        }
+        break;
+    }
+    if (orderOfSPD) {
+        Assert(orderOfSPD >=0 && orderOfSPD < numberOfValues);
+        bias=X[orderOfSPD];
+        for (i=orderOfSPD+1;i<numberOfValues;i++) {
+            if ( bias > X[i] ) bias=X[i];
+        }
+        for (i=orderOfSPD;i<numberOfValues;i++) {
+            X[i]-=bias;
+        }
+        maxSPD=X[0];
+        for (i=1;i<orderOfSPD;i++) {
+            if ( maxSPD < X[i] ) maxSPD=X[i];
+        }
+        /* widthOfSPD=(long)ceil(log((double)(maxSPD+1))/log(2.0)); */
+        widthOfSPD=number_of_bits(handle, maxSPD);
+        widthOfBias=number_of_bits(handle, labs(bias))+1;
+
+        if ( widthOfSPD < widthOfBias  ) widthOfSPD=widthOfBias;
+
+    }
+    /* end of spatial differencing */
+
+    count=orderOfSPD;
+    remainingValues=numberOfValues-count;
+    numberOfGroups=0;
+    incrementGroupLengthA=startGroupLength;
+
+    computeGroupA=1;
+    while (remainingValues) {
+        /* group A created with length=incrementGroupLengthA (if enough values remain)
+           incrementGroupLengthA=startGroupLength always except when coming from an A+C or A+B ok branch
+         */
+        groupLengthA= incrementGroupLengthA < remainingValues ? incrementGroupLengthA : remainingValues ;
+        if (computeGroupA) {
+            maxA=X[count];
+            minA=X[count];
+            for (i=1;i<groupLengthA;i++) {
+                DebugAssertAccess(X, count+i, numberOfValues);
+                if (maxA<X[count+i]) maxA=X[count+i];
+                if (minA>X[count+i]) minA=X[count+i];
+            }
+        }
+        groupWidthA=number_of_bits(handle, maxA-minA);
+        range=(long)grib_power(groupWidthA,2)-1;
+
+        offsetC=count+groupLengthA;
+        if (offsetC==numberOfValues) {
+            /* no more values close group A and end loop */
+            groupLengths[numberOfGroups]=groupLengthA;
+            groupWidths[numberOfGroups]=groupWidthA;
+            /* firstOrderValues[numberOfGroups]=minA; */
+            /* to optimise the width of first order variable */
+            firstOrderValues[numberOfGroups] = maxA-range > 0 ? maxA-range : 0;
+            numberOfGroups++;
+            break;
+        }
+
+        /* group C created with length=incrementGroupLength (fixed)
+           or remaining values if close to end
+         */
+        groupLengthC=incrementGroupLength;
+        if ( groupLengthC + offsetC > numberOfValues - startGroupLength/2) {
+            groupLengthC=numberOfValues-offsetC;
+        }
+        maxC=X[offsetC];
+        minC=X[offsetC];
+        for (i=1;i<groupLengthC;i++) {
+            DebugAssertAccess(X, offsetC+i, numberOfValues);
+            if (maxC<X[offsetC+i]) maxC=X[offsetC+i];
+            if (minC>X[offsetC+i]) minC=X[offsetC+i];
+        }
+
+        maxAC= maxA > maxC ? maxA : maxC;
+        minAC= minA < minC ? minA : minC;
+
+        /* check if A+C can be represented with the same width as A*/
+        if (maxAC-minAC > range) {
+            /* A could not be expanded adding C. Check if A could be expanded taking
+               some elements from preceding group. The condition is always that width of
+               A doesn't increase.
+             */
+            if (numberOfGroups>0 && groupWidths[numberOfGroups-1] > groupWidthA ) {
+                prevGroupLength=groupLengths[numberOfGroups-1]-incrementGroupLength;
+                offsetC=count-incrementGroupLength;
+                /* preceding group length cannot be less than a minimum value */
+                while (prevGroupLength >= minGroupLength) {
+                    maxAC=maxA;
+                    minAC=minA;
+                    for (i=0;i<incrementGroupLength;i++) {
+                        if (maxAC<X[offsetC+i]) maxAC=X[offsetC+i];
+                        if (minAC>X[offsetC+i]) minAC=X[offsetC+i];
+                    }
+
+                    /* no more elements can be transfered, exit loop*/
+                    if (maxAC-minAC > range) break;
+
+                    maxA=maxAC;
+                    minA=minAC;
+                    groupLengths[numberOfGroups-1]-=incrementGroupLength;
+                    groupLengthA+=incrementGroupLength;
+                    count-=incrementGroupLength;
+                    remainingValues+=incrementGroupLength;
+
+                    offsetC-=incrementGroupLength;
+                    prevGroupLength-=incrementGroupLength;
+                }
+            }
+            /* close group A*/
+            groupLengths[numberOfGroups]=groupLengthA;
+            groupWidths[numberOfGroups]=groupWidthA;
+            /* firstOrderValues[numberOfGroups]=minA; */
+            /* to optimise the width of first order variable */
+            firstOrderValues[numberOfGroups] = maxA-range > 0 ? maxA-range : 0;
+            count+=groupLengthA;
+            remainingValues-=groupLengthA;
+            numberOfGroups++;
+            /* incrementGroupLengthA is reset to the fixed startGroupLength as it
+               could have been changed after the A+C or A+B ok condition.
+             */
+            incrementGroupLengthA=startGroupLength;
+            computeGroupA=1;
+#if 0
+            if (numberOfGroups==MAX_NUMBER_OF_GROUPS) {
+                groupLengthA= remainingValues ;
+                maxA=X[count];
+                minA=X[count];
+                for (i=1;i<groupLengthA;i++) {
+                    if (maxA<X[count+i]) maxA=X[count+i];
+                    if (minA>X[count+i]) minA=X[count+i];
+                }
+                groupWidthA=number_of_bits(maxA-minA);
+                range=(long)grib_power(groupWidthA,2)-1;
+                groupLengths[numberOfGroups]=groupLengthA;
+                groupWidths[numberOfGroups]=groupWidthA;
+                firstOrderValues[numberOfGroups] = maxA-range > 0 ? maxA-range : 0;
+                break;
+            }
+#endif
+            continue;
+        }
+
+        /* A+C could be coded with the same width as A*/
+        offsetD=offsetC+groupLengthC;
+        if (offsetD==numberOfValues) {
+            groupLengths[numberOfGroups]=groupLengthA+groupLengthC;
+            groupWidths[numberOfGroups]=groupWidthA;
+
+            /* range of AC is the same as A*/
+            /* firstOrderValues[numberOfGroups]=minAC; */
+            /* to optimise the width of first order variable */
+            firstOrderValues[numberOfGroups] = maxAC-range > 0 ? maxAC-range : 0;
+            numberOfGroups++;
+            break;
+        }
+
+        /* group B is created with length startGroupLength, starting at the
+           same offset as C.
+         */
+        remainingValuesB=numberOfValues-offsetC;
+        groupLengthB= startGroupLength < remainingValuesB ? startGroupLength : remainingValuesB ;
+        maxB=maxC;
+        minB=minC;
+        for (i=groupLengthC;i<groupLengthB;i++) {
+            if (maxB<X[offsetC+i]) maxB=X[offsetC+i];
+            if (minB>X[offsetC+i]) minB=X[offsetC+i];
+        }
+
+        /* check if group B can be coded with a smaller width than A */
+        if (maxB-minB <= range/2 && range>0 ) {
+
+            /* TODO Add code to try if A can be expanded taking some elements
+               from the left (preceding) group.
+                A possible variation is to do this left check (and the previous one)
+                in the final loop when checking that the width of each group.
+             */
+
+            /* close group A and continue loop*/
+            groupLengths[numberOfGroups]=groupLengthA;
+            groupWidths[numberOfGroups]=groupWidthA;
+            /* firstOrderValues[numberOfGroups]=minA; */
+            /* to optimise the width of first order variable */
+            firstOrderValues[numberOfGroups] = maxA-range > 0 ? maxA-range : 0;
+            count+=groupLengthA;
+            remainingValues-=groupLengthA;
+            numberOfGroups++;
+#if 0
+            if (numberOfGroups==MAX_NUMBER_OF_GROUPS) {
+                groupLengthA= remainingValues ;
+                maxA=X[count];
+                minA=X[count];
+                for (i=1;i<groupLengthA;i++) {
+                    if (maxA<X[count+i]) maxA=X[count+i];
+                    if (minA>X[count+i]) minA=X[count+i];
+                }
+                groupWidthA=number_of_bits(maxA-minA);
+                range=(long)grib_power(groupWidthA,2)-1;
+                groupLengths[numberOfGroups]=groupLengthA;
+                groupWidths[numberOfGroups]=groupWidthA;
+                firstOrderValues[numberOfGroups] = maxA-range > 0 ? maxA-range : 0;
+                break;
+            }
+#endif
+            incrementGroupLengthA=startGroupLength;
+            computeGroupA=1;
+            continue;
+        }
+
+        /* check if A+B can be coded with same with as A */
+        maxAB= maxA > maxB ? maxA : maxB;
+        minAB= minA < minB ? minA : minB;
+        if (maxAB-minAB <= range) {
+            /* A+B can be merged. The increment used at the beginning of the loop to
+               build group C is increased to the size of group B
+             */
+            incrementGroupLengthA+=groupLengthB;
+            maxA=maxAB;
+            minA=minAB;
+            computeGroupA=0;
+            continue;
+        }
+
+        /* A+B cannot be merged, A+C can be merged*/
+        incrementGroupLengthA+=groupLengthC;
+        computeGroupA=1;
+
+    } /* end of the while*/
+
+    /* computing bitsPerValue as the number of bits needed to represent
+       the firstOrderValues.
+     */
+    max=firstOrderValues[0];
+    min=firstOrderValues[0];
+    for (i=1;i<numberOfGroups;i++) {
+        if (max<firstOrderValues[i]) max=firstOrderValues[i];
+        if (min>firstOrderValues[i]) min=firstOrderValues[i];
+    }
+    widthOfFirstOrderValues=number_of_bits(handle, max-min);
+    firstOrderValuesMax=(long)grib_power(widthOfFirstOrderValues,2)-1;
+
+    if (numberOfGroups>2) {
+        /* loop through all the groups except the last in reverse order to
+           check if each group width is still appropriate for the group.
+           Focus on groups which have been shrank as left groups of an A group taking
+           some of their elements.
+         */
+        offsets=(long*)grib_context_malloc_clear(a->context,sizeof(long)*numberOfGroups);
+        offsets[0]=orderOfSPD;
+        for (i=1;i<numberOfGroups;i++) offsets[i]=offsets[i-1]+groupLengths[i-1];
+        for (i=numberOfGroups-2;i>=0;i--) {
+            offset=offsets[i];
+            groupLength=groupLengths[i];
+
+            if (groupLength >= startGroupLength) continue;
+
+            max=X[offset];
+            min=X[offset];
+            for (j=1;j<groupLength;j++) {
+                if (max<X[offset+j]) max=X[offset+j];
+                if (min>X[offset+j]) min=X[offset+j];
+            }
+            groupWidth=number_of_bits(handle, max-min);
+            range=(long)grib_power(groupWidth,2)-1;
+
+            /* width of first order values has to be unchanged.*/
+            for (j=groupWidth;j<groupWidths[i];j++) {
+                firstOrderValue= max>range ? max-range : 0;
+                if (firstOrderValue <= firstOrderValuesMax ) {
+                    groupWidths[i]=j;
+                    firstOrderValues[i]=firstOrderValue;
+                    break;
+                }
+            }
+
+            offsetC=offset;
+            /*  group width of the current group (i) can have been reduced
+                and it is worth to try to expand the group to get some elements
+                from the left group if it has bigger width.
+             */
+            if (i>0 && (groupWidths[i-1] > groupWidths[i]) ) {
+                prevGroupLength=groupLengths[i-1]-incrementGroupLength;
+                offsetC-=incrementGroupLength;
+                while (prevGroupLength >= minGroupLength) {
+                    for (j=0;j<incrementGroupLength;j++) {
+                        if (max<X[offsetC+j]) max=X[offsetC+j];
+                        if (min>X[offsetC+j]) min=X[offsetC+j];
+                    }
+
+                    /* width of first order values has to be unchanged*/
+                    firstOrderValue=max>range ? max-range : 0;
+                    if (max-min > range || firstOrderValue > firstOrderValuesMax ) break;
+
+                    groupLengths[i-1]-=incrementGroupLength;
+                    groupLengths[i]+=incrementGroupLength;
+                    firstOrderValues[i]=firstOrderValue;
+
+                    offsetC-=incrementGroupLength;
+                    prevGroupLength-=incrementGroupLength;
+                }
+            }
+
+        }
+        grib_context_free(a->context,offsets);
+    }
+
+    maxWidth=groupWidths[0];
+    maxLength=groupLengths[0];
+    for (i=1;i<numberOfGroups;i++) {
+        if (maxWidth<groupWidths[i]) maxWidth=groupWidths[i];
+        if (maxLength<groupLengths[i]) maxLength=groupLengths[i];
+    }
+
+    if (maxWidth < 0 || maxLength < 0) {
+        grib_context_log(a->parent->h->context, GRIB_LOG_ERROR, "Cannot compute parameters for second order packing.");
+        return GRIB_ENCODING_ERROR;
+    }
+    widthOfWidths=number_of_bits(handle, maxWidth);
+    widthOfLengths=number_of_bits(handle, maxLength);
+
+    lengthOfSecondOrderValues=0;
+    for ( i=0; i<numberOfGroups;i++) {
+        lengthOfSecondOrderValues+=groupLengths[i]*groupWidths[i];
+    }
+
+    if (!a->context->no_big_group_split) {
+        grib_split_long_groups(handle, a->context,&numberOfGroups,&lengthOfSecondOrderValues,
+                groupLengths,&widthOfLengths,groupWidths,widthOfWidths,
+                firstOrderValues,widthOfFirstOrderValues);
+    }
+
+    Xp=X+orderOfSPD;
+    for ( i=0; i<numberOfGroups;i++) {
+        for (j=0; j<groupLengths[i]; j++) {
+            *(Xp++)-=firstOrderValues[i];
+        }
+    }
+
+    /* start writing to message */
+
+    /* writing SPD */
+    if (orderOfSPD) {
+        if((ret = grib_set_long_internal(handle,self->widthOfSPD, widthOfSPD))
+                != GRIB_SUCCESS)
+            return ret;
+    }
+
+    /* end writing SPD */
+    if((ret = grib_set_long_internal(handle,self->widthOfFirstOrderValues, widthOfFirstOrderValues))
+            != GRIB_SUCCESS)
+        return ret;
+
+    dataHeadersLength=25;
+    if (orderOfSPD) dataHeadersLength+=1+((orderOfSPD+1)*widthOfSPD+7)/8;
+    widthsLength=(widthOfWidths*numberOfGroups+7)/8;
+    lengthsLength=(widthOfLengths*numberOfGroups+7)/8;
+    firstOrderValuesLength=(widthOfFirstOrderValues*numberOfGroups+7)/8;
+
+    NL=widthsLength+dataHeadersLength+1;
+    N1=NL+lengthsLength;
+    N2=N1+firstOrderValuesLength;
+
+    NL= NL > 65535 ? 65535 : NL;
+    N2= N2 > 65535 ? 65535 : N2;
+    N1= N1 > 65535 ? 65535 : N1;
+
+    grib_set_long(handle,self->NL, NL);
+    grib_set_long(handle,self->N1, N1);
+    grib_set_long(handle,self->N2, N2);
+
+    if (numberOfGroups > 65535 ) {
+        extraValues=numberOfGroups/65536;
+        codedNumberOfGroups=numberOfGroups%65536;
+    } else {
+        extraValues=0;
+        codedNumberOfGroups=numberOfGroups;
+    }
+
+    /* if no extraValues key present it is a GRIB2*/
+    grib2=0;
+    if((ret = grib_set_long(handle,self->extraValues, extraValues)) != GRIB_SUCCESS) {
+        codedNumberOfGroups=numberOfGroups;
+        grib2=1;
+    }
+
+    if((ret = grib_set_long_internal(handle,self->codedNumberOfGroups, codedNumberOfGroups)) != GRIB_SUCCESS)
+        return ret;
+
+    numberOfSecondOrderPackedValues=numberOfValues-orderOfSPD;
+    if (!grib2 && numberOfSecondOrderPackedValues > 65535 )
+        numberOfSecondOrderPackedValues= 65535;
+
+    if((ret = grib_set_long_internal(handle,self->numberOfSecondOrderPackedValues, numberOfSecondOrderPackedValues))
+            != GRIB_SUCCESS)
+        return ret;
+
+    if (grib2) {
+        if((ret = grib_set_long_internal(handle,self->bits_per_value, bits_per_value)) != GRIB_SUCCESS)
+            return ret;
+    } else {
+        if((ret = grib_set_long_internal(handle,self->bits_per_value, 0)) != GRIB_SUCCESS)
+            return ret;
+    }
+
+    if((ret = grib_set_long_internal(handle,self->widthOfWidths, widthOfWidths)) != GRIB_SUCCESS)
+        return ret;
+
+    if((ret = grib_set_long_internal(handle,self->widthOfLengths, widthOfLengths)) != GRIB_SUCCESS)
+        return ret;
+
+    lengthOfSecondOrderValues=0;
+    for ( i=0; i<numberOfGroups;i++) {
+        lengthOfSecondOrderValues+=groupLengths[i]*groupWidths[i];
+    }
+
+    size=(lengthOfSecondOrderValues+7)/8;
+    sizebits=lengthOfSecondOrderValues;
+
+    /* padding section 4 to an even number of octets*/
+    size = (size+offsetBeforeData-offsetSection4) % 2 ? size+1 : size;
+    half_byte=8*size-sizebits;
+    if((ret = grib_set_long_internal(handle,self->half_byte, half_byte)) != GRIB_SUCCESS)
+        return ret;
+
+    buffer=(unsigned char*)grib_context_malloc_clear(a->context,size);
+
+    pos=0;
+    if (orderOfSPD) {
+        long SPD[4]={0,};
+        size_t nSPD=orderOfSPD+1;
+        Assert(orderOfSPD<=3);
+        for (i=0;i<orderOfSPD;i++) SPD[i]=X[i];
+        SPD[orderOfSPD]=bias;
+        ret=grib_set_long_array_internal(handle,self->SPD,SPD,nSPD);
+        if(ret) return ret;
+    }
+
+    ret=grib_set_long_array_internal(handle,self->groupWidths,groupWidths,(size_t)numberOfGroups);
+    if(ret) return ret;
+
+    ret=grib_set_long_array_internal(handle,self->groupLengths,groupLengths,(size_t)numberOfGroups);
+    if(ret) return ret;
+
+    ret=grib_set_long_array_internal(handle,self->firstOrderValues,firstOrderValues,(size_t)numberOfGroups);
+    if(ret) return ret;
+
+    Xp=X+orderOfSPD;
+    pos=0;
+    count=0;
+    for (i=0;i<numberOfGroups;i++) {
+        if (groupWidths[i]>0) {
+            for (j=0;j<groupLengths[i];j++) {
+#if EFDEBUG
+                printf("CXXXXX %ld %ld %ld %ld\n",count,*Xp,groupWidths[i],groupLengths[i]);
+                count++;
+#endif
+                grib_encode_unsigned_longb(buffer,*(Xp++),&pos,groupWidths[i]);
+            }
+        } else  {
+            Xp+=groupLengths[i];
+#if EFDEBUG
+            count+=groupLengths[i];
+#endif
+        }
+    }
+
+    /* ECC-259: Set correct number of values */
+    ret=grib_set_long_internal(a->parent->h,self->number_of_values, *len);
+    if(ret) return ret;
+
+    grib_buffer_replace(a, buffer, size,1,1);
+
+    grib_context_free(a->context,buffer);
+    grib_context_free(a->context,X);
+    grib_context_free(a->context,groupLengths);
+    grib_context_free(a->context,groupWidths);
+    grib_context_free(a->context,firstOrderValues);
+
+    return ret;
+}
+
+/* The driver pack routine.  See ECC-261 */
+static int pack_double(grib_accessor* a, const double* val, size_t *len)
+{
+    grib_accessor_data_g1second_order_general_extended_packing* self =  (grib_accessor_data_g1second_order_general_extended_packing*)a;
+    int ret = GRIB_SUCCESS;
+    grib_handle* handle = grib_handle_of_accessor(a);
+    long optimize_scaling_factor = 0;
+
+    if((ret = grib_get_long_internal(handle,self->optimize_scaling_factor, &optimize_scaling_factor)) != GRIB_SUCCESS)
+        return ret;
+
+    if (optimize_scaling_factor) {
+        return pack_double_optimised(a,val,len);
+    } else {
+        return pack_double_standard(a,val,len);
+    }
+}
+
 static void destroy(grib_context* context,grib_accessor* a)
 {
     grib_accessor_data_g1second_order_general_extended_packing *self =(grib_accessor_data_g1second_order_general_extended_packing*)a;
diff --git a/src/grib_accessor_class_data_g1second_order_general_packing.c b/src/grib_accessor_class_data_g1second_order_general_packing.c
index 1a4807b..81b25ec 100644
--- a/src/grib_accessor_class_data_g1second_order_general_packing.c
+++ b/src/grib_accessor_class_data_g1second_order_general_packing.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -76,6 +76,7 @@ typedef struct grib_accessor_data_g1second_order_general_packing {
 	const char*  reference_value;
 	const char*  binary_scale_factor;
 	const char*  decimal_scale_factor;
+	const char*  optimize_scaling_factor;
 /* Members defined in data_g1second_order_general_packing */
 	const char* half_byte;
 	const char* packingType;
diff --git a/src/grib_accessor_class_data_g1second_order_row_by_row_packing.c b/src/grib_accessor_class_data_g1second_order_row_by_row_packing.c
index adf5e15..1da4ba8 100644
--- a/src/grib_accessor_class_data_g1second_order_row_by_row_packing.c
+++ b/src/grib_accessor_class_data_g1second_order_row_by_row_packing.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -76,6 +76,7 @@ typedef struct grib_accessor_data_g1second_order_row_by_row_packing {
 	const char*  reference_value;
 	const char*  binary_scale_factor;
 	const char*  decimal_scale_factor;
+	const char*  optimize_scaling_factor;
 /* Members defined in data_g1second_order_row_by_row_packing */
 	const char* half_byte;
 	const char* packingType;
diff --git a/src/grib_accessor_class_data_g1secondary_bitmap.c b/src/grib_accessor_class_data_g1secondary_bitmap.c
index 8d767aa..735ba6e 100644
--- a/src/grib_accessor_class_data_g1secondary_bitmap.c
+++ b/src/grib_accessor_class_data_g1secondary_bitmap.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_data_g1shsimple_packing.c b/src/grib_accessor_class_data_g1shsimple_packing.c
index 6ed7455..365a30a 100644
--- a/src/grib_accessor_class_data_g1shsimple_packing.c
+++ b/src/grib_accessor_class_data_g1shsimple_packing.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_data_g1simple_packing.c b/src/grib_accessor_class_data_g1simple_packing.c
index bfa0f1f..3d878b6 100644
--- a/src/grib_accessor_class_data_g1simple_packing.c
+++ b/src/grib_accessor_class_data_g1simple_packing.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -61,6 +61,7 @@ typedef struct grib_accessor_data_g1simple_packing {
 	const char*  reference_value;
 	const char*  binary_scale_factor;
 	const char*  decimal_scale_factor;
+	const char*  optimize_scaling_factor;
 /* Members defined in data_g1simple_packing */
 	const char*  half_byte;
 	const char*  packingType;
@@ -277,12 +278,12 @@ static int pack_double(grib_accessor* a, const double* cval, size_t *len)
         return GRIB_SUCCESS;
         break;
     case GRIB_INVALID_BPV:
-        grib_context_log(a->context,GRIB_LOG_ERROR,"unable to compute packing parameters\n");
+        grib_context_log(a->context,GRIB_LOG_ERROR,"unable to compute packing parameters. Invalid bits per value\n");
         return ret;
     case GRIB_SUCCESS:
         break;
     default:
-        grib_context_log(a->context,GRIB_LOG_FATAL,"unable to compute packing parameters\n");
+        grib_context_log(a->context,GRIB_LOG_ERROR,"unable to compute packing parameters\n");
         return ret;
     }
 
diff --git a/src/grib_accessor_class_data_g22order_packing.c b/src/grib_accessor_class_data_g22order_packing.c
index e83a2e5..535d012 100644
--- a/src/grib_accessor_class_data_g22order_packing.c
+++ b/src/grib_accessor_class_data_g22order_packing.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -265,9 +265,9 @@ static int find_next_group(const unsigned long* vals, size_t len, unsigned long
     lmin = vals[0];
     lmax = lmin;
 
-    while(i < len){
-        if(vals[i] < lmin) lmin = vals[i];
-        if(vals[i] > lmax) lmax = vals[i];
+    while(i < len) {
+        if      (vals[i] > lmax) lmax = vals[i];
+        else if (vals[i] < lmin) lmin = vals[i];
         /*Assert((lmax-lmin) >= 0);*/
         *nbits = calc_bits_needed(lmax-lmin);
         *r_val = lmin;
@@ -632,10 +632,8 @@ static int pack_double(grib_accessor* a, const double* val, size_t *len)
     min = max;
     for(i=0;i< n_vals;i++)
     {
-        if ( val[i] > max )
-            max = val[i];
-        if ( val[i] < min )
-            min = val[i];
+        if      ( val[i] > max ) max = val[i];
+        else if ( val[i] < min ) min = val[i];
     }
     min *= d;
     max *= d;
diff --git a/src/grib_accessor_class_data_g2complex_packing.c b/src/grib_accessor_class_data_g2complex_packing.c
index a765c76..3e7fddc 100644
--- a/src/grib_accessor_class_data_g2complex_packing.c
+++ b/src/grib_accessor_class_data_g2complex_packing.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -58,6 +58,7 @@ typedef struct grib_accessor_data_g2complex_packing {
 	const char*  reference_value;
 	const char*  binary_scale_factor;
 	const char*  decimal_scale_factor;
+	const char*  optimize_scaling_factor;
 /* Members defined in data_complex_packing */
 	const char*  GRIBEX_sh_bug_present;
 	const char*  ieee_floats;
diff --git a/src/grib_accessor_class_data_g2secondary_bitmap.c b/src/grib_accessor_class_data_g2secondary_bitmap.c
index 14448be..b926eac 100644
--- a/src/grib_accessor_class_data_g2secondary_bitmap.c
+++ b/src/grib_accessor_class_data_g2secondary_bitmap.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_data_g2shsimple_packing.c b/src/grib_accessor_class_data_g2shsimple_packing.c
index ac33f36..c9a25fd 100644
--- a/src/grib_accessor_class_data_g2shsimple_packing.c
+++ b/src/grib_accessor_class_data_g2shsimple_packing.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_data_g2simple_packing.c b/src/grib_accessor_class_data_g2simple_packing.c
index c445a82..83c73aa 100644
--- a/src/grib_accessor_class_data_g2simple_packing.c
+++ b/src/grib_accessor_class_data_g2simple_packing.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -59,6 +59,7 @@ typedef struct grib_accessor_data_g2simple_packing {
 	const char*  reference_value;
 	const char*  binary_scale_factor;
 	const char*  decimal_scale_factor;
+	const char*  optimize_scaling_factor;
 /* Members defined in data_g2simple_packing */
 } grib_accessor_data_g2simple_packing;
 
diff --git a/src/grib_accessor_class_data_g2simple_packing_with_preprocessing.c b/src/grib_accessor_class_data_g2simple_packing_with_preprocessing.c
index ffd3066..ea7640c 100644
--- a/src/grib_accessor_class_data_g2simple_packing_with_preprocessing.c
+++ b/src/grib_accessor_class_data_g2simple_packing_with_preprocessing.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_data_jpeg2000_packing.c b/src/grib_accessor_class_data_jpeg2000_packing.c
index 1293e9d..a17ec44 100644
--- a/src/grib_accessor_class_data_jpeg2000_packing.c
+++ b/src/grib_accessor_class_data_jpeg2000_packing.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -70,6 +70,7 @@ typedef struct grib_accessor_data_jpeg2000_packing {
 	const char*  reference_value;
 	const char*  binary_scale_factor;
 	const char*  decimal_scale_factor;
+	const char*  optimize_scaling_factor;
 /* Members defined in data_jpeg2000_packing */
 	const char*   type_of_compression_used;
 	const char*   target_compression_ratio;
@@ -379,7 +380,8 @@ static int pack_double(grib_accessor* a, const double* cval, size_t *len)
     case GRIB_SUCCESS:
         break;
     default:
-        grib_context_log(a->context,GRIB_LOG_ERROR,"unable to compute packing parameters\n");
+        grib_context_log(a->context, GRIB_LOG_ERROR,
+                "grib_accessor_class_data_jpeg2000_packing pack_double: unable to compute packing parameters");
         return ret;
     }
 
@@ -450,8 +452,11 @@ static int pack_double(grib_accessor* a, const double* cval, size_t *len)
 
     if(width*height != *len)
     {
-        /* fprintf(stderr,"width=%ld height=%ld len=%d\n",(long)width,(long)height,(long)*len); */
-        Assert(width*height == *len);
+        grib_context_log(a->context, GRIB_LOG_ERROR,
+                "grib_accessor_class_data_jpeg2000_packing pack_double: width=%ld height=%ld len=%d."
+                " width*height should equal len!",
+                (long)width, (long)height, (long)*len);
+        return GRIB_INTERNAL_ERROR;
     }
 
     switch( type_of_compression_used)
@@ -524,7 +529,7 @@ static int pack_double(grib_accessor* a, const double* cval, size_t *len)
 
     grib_buffer_replace(a, helper.jpeg_buffer, helper.jpeg_length, 1, 1);
 
-    cleanup:
+cleanup:
 
     grib_context_free(a->context,buf);
 
diff --git a/src/grib_accessor_class_data_png_packing.c b/src/grib_accessor_class_data_png_packing.c
index 558899e..3547b86 100644
--- a/src/grib_accessor_class_data_png_packing.c
+++ b/src/grib_accessor_class_data_png_packing.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -361,8 +361,7 @@ static int  unpack_double(grib_accessor* a, double* val, size_t *len)
     /*-------------------------------------------*/
     *len = n_vals;
 
-
-    cleanup:
+cleanup:
     if(png)
         png_destroy_read_struct(&png, info?&info:NULL, theEnd?&theEnd:NULL);
     return err;
@@ -494,25 +493,20 @@ static int pack_double(grib_accessor* a, const double* val, size_t *len)
         height = 1;
     }
 
-
     if(width*height != *len)
     {
         fprintf(stderr,"width=%ld height=%ld len=%ld\n", (long)width, (long)height, (long)(*len) );
         Assert(width*height == *len);
     }
 
-
     d = grib_power(decimal_scale_factor,10) ;
 
-
     max = val[0];
     min = max;
     for(i=1;i< n_vals;i++)
     {
-        if (val[i] > max )
-            max = val[i];
-        if (val[i] < min )
-            min = val[i];
+        if      (val[i] > max) max = val[i];
+        else if (val[i] < min) min = val[i];
     }
     min *= d;
     max *= d;
@@ -568,7 +562,6 @@ static int pack_double(grib_accessor* a, const double* val, size_t *len)
         goto cleanup;
     }
 
-
     if((err = grib_set_double_internal(grib_handle_of_accessor(a),self->reference_value, reference_value)) != GRIB_SUCCESS)
         return err;
     {
@@ -608,14 +601,11 @@ static int pack_double(grib_accessor* a, const double* val, size_t *len)
         goto cleanup;
     }
 
-
     callback_data.buffer = buf;
     callback_data.offset = 0;
     callback_data.length = buflen;
 
     /* printf("buflen=%d\n",buflen); */
-
-
     png_set_write_fn(png,&callback_data,png_write_callback,png_flush_callback);
 
     depth = bits8;
@@ -637,7 +627,6 @@ static int pack_double(grib_accessor* a, const double* val, size_t *len)
             depth, colour, PNG_INTERLACE_NONE,
             PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
 
-
     /*bytes=bit_depth/8;*/
     bytes = bits8/8;
 
@@ -653,10 +642,9 @@ static int pack_double(grib_accessor* a, const double* val, size_t *len)
 
     Assert(callback_data.offset <= callback_data.length);
 
-
     grib_buffer_replace(a, buf, callback_data.offset,1,1);
 
-    cleanup:
+cleanup:
     if(png)
         png_destroy_write_struct(&png, info?&info:NULL);
 
diff --git a/src/grib_accessor_class_data_raw_packing.c b/src/grib_accessor_class_data_raw_packing.c
index a048213..615bf85 100644
--- a/src/grib_accessor_class_data_raw_packing.c
+++ b/src/grib_accessor_class_data_raw_packing.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_data_secondary_bitmap.c b/src/grib_accessor_class_data_secondary_bitmap.c
index 668d478..7f9d305 100644
--- a/src/grib_accessor_class_data_secondary_bitmap.c
+++ b/src/grib_accessor_class_data_secondary_bitmap.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_data_sh_packed.c b/src/grib_accessor_class_data_sh_packed.c
index bc0fbf9..7721285 100644
--- a/src/grib_accessor_class_data_sh_packed.c
+++ b/src/grib_accessor_class_data_sh_packed.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -68,6 +68,7 @@ typedef struct grib_accessor_data_sh_packed {
 	const char*  reference_value;
 	const char*  binary_scale_factor;
 	const char*  decimal_scale_factor;
+	const char*  optimize_scaling_factor;
 /* Members defined in data_sh_packed */
 	const char*  GRIBEX_sh_bug_present;
 	const char*  ieee_floats;
diff --git a/src/grib_accessor_class_data_sh_unpacked.c b/src/grib_accessor_class_data_sh_unpacked.c
index f604594..2bc66eb 100644
--- a/src/grib_accessor_class_data_sh_unpacked.c
+++ b/src/grib_accessor_class_data_sh_unpacked.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -68,6 +68,7 @@ typedef struct grib_accessor_data_sh_unpacked {
 	const char*  reference_value;
 	const char*  binary_scale_factor;
 	const char*  decimal_scale_factor;
+	const char*  optimize_scaling_factor;
 /* Members defined in data_sh_unpacked */
 	const char*  GRIBEX_sh_bug_present;
 	const char*  ieee_floats;
diff --git a/src/grib_accessor_class_data_shsimple_packing.c b/src/grib_accessor_class_data_shsimple_packing.c
index a8f4525..ef34c9f 100644
--- a/src/grib_accessor_class_data_shsimple_packing.c
+++ b/src/grib_accessor_class_data_shsimple_packing.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_data_simple_packing.c b/src/grib_accessor_class_data_simple_packing.c
index 68fd01b..4571e5d 100644
--- a/src/grib_accessor_class_data_simple_packing.c
+++ b/src/grib_accessor_class_data_simple_packing.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -13,6 +13,8 @@
  *******************************/
 
 #include "grib_api_internal.h"
+#include "grib_optimize_decimal_factor.h"
+#include <float.h>
 
 /*
    This is used by make_class.pl
@@ -35,6 +37,7 @@
    MEMBERS=const char*  reference_value
    MEMBERS=const char*  binary_scale_factor
    MEMBERS=const char*  decimal_scale_factor
+   MEMBERS=const char*  optimize_scaling_factor
    END_CLASS_DEF
 
  */
@@ -76,6 +79,7 @@ typedef struct grib_accessor_data_simple_packing {
 	const char*  reference_value;
 	const char*  binary_scale_factor;
 	const char*  decimal_scale_factor;
+	const char*  optimize_scaling_factor;
 } grib_accessor_data_simple_packing;
 
 extern grib_accessor_class* grib_accessor_class_values;
@@ -172,6 +176,7 @@ static void init(grib_accessor* a,const long v, grib_arguments* args)
     self->reference_value = grib_arguments_get_name(gh,args,self->carg++);
     self->binary_scale_factor = grib_arguments_get_name(gh,args,self->carg++);
     self->decimal_scale_factor = grib_arguments_get_name(gh,args,self->carg++);
+    self->optimize_scaling_factor = grib_arguments_get_name(gh,args,self->carg++);
     a->flags |= GRIB_ACCESSOR_FLAG_DATA;
     self->dirty=1;
 }
@@ -464,6 +469,14 @@ static int producing_large_constant_fields(const grib_context* c, grib_handle* h
     return 0;
 }
 
+static int check_range(const double val)
+{
+    if (val < DBL_MAX && val > -DBL_MAX)
+        return GRIB_SUCCESS;
+    else
+        return GRIB_ENCODING_ERROR;
+}
+
 static int pack_double(grib_accessor* a, const double* val, size_t *len)
 {
     grib_accessor_data_simple_packing* self =  (grib_accessor_data_simple_packing*)a;
@@ -478,6 +491,7 @@ static int pack_double(grib_accessor* a, const double* val, size_t *len)
     long   bits_per_value = 0;
     long   decimal_scale_factor = 0;
     long   decimal_scale_factor_get = 0;
+    long   optimize_scaling_factor = 0;
     double decimal = 1;
     double max = 0;
     double min = 0;
@@ -504,6 +518,9 @@ static int pack_double(grib_accessor* a, const double* val, size_t *len)
     if((err = grib_get_long_internal(gh,self->decimal_scale_factor, &decimal_scale_factor_get))
             != GRIB_SUCCESS)
         return err;
+    if((err = grib_get_long_internal(gh,self->optimize_scaling_factor, &optimize_scaling_factor))
+            != GRIB_SUCCESS)
+        return err;
     /*/
      * check we don't encode bpv > max(ulong)-1 as it is
      * not currently supported by the algorithm
@@ -524,6 +541,14 @@ static int pack_double(grib_accessor* a, const double* val, size_t *len)
         if (val[i] < min ) min = val[i];
     }
 #endif
+    if ((err = check_range(max)) != GRIB_SUCCESS) {
+        grib_context_log(a->context,GRIB_LOG_ERROR,"Maximum value out of range: %g", max);
+        return err;
+    }
+    if ((err = check_range(min)) != GRIB_SUCCESS) {
+        grib_context_log(a->context,GRIB_LOG_ERROR,"Minimum value out of range: %g", min);
+        return err;
+    }
 
     /* constant field only reference_value is set and bits_per_value=0 */
     if(max==min) {
@@ -642,6 +667,14 @@ static int pack_double(grib_accessor* a, const double* val, size_t *len)
                         "unable to find nearest_smaller_value of %g for %s",min,self->reference_value);
                 return GRIB_INTERNAL_ERROR;
             }
+        } else if (optimize_scaling_factor) {
+          int compat_gribex = c->gribex_mode_on && self->edition==1;
+
+          if((err = grib_optimize_decimal_factor (a, self->reference_value,
+                                                  max, min, bits_per_value,
+                                                  compat_gribex, 1,
+                                                  &decimal_scale_factor, &binary_scale_factor, &reference_value)) != GRIB_SUCCESS)
+            return err;
         } else {
             /* printf("max=%g reference_value=%g grib_power(-last,2)=%g decimal_scale_factor=%ld bits_per_value=%ld\n",
                max,reference_value,grib_power(-last,2),decimal_scale_factor,bits_per_value);*/
diff --git a/src/grib_accessor_class_decimal_precision.c b/src/grib_accessor_class_decimal_precision.c
index e64e20c..2602712 100644
--- a/src/grib_accessor_class_decimal_precision.c
+++ b/src/grib_accessor_class_decimal_precision.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_dictionary.c b/src/grib_accessor_class_dictionary.c
index 1a72c37..050d51e 100644
--- a/src/grib_accessor_class_dictionary.c
+++ b/src/grib_accessor_class_dictionary.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -168,10 +168,6 @@ static grib_trie* load_dictionary(grib_context* c,grib_accessor* a, int* err)
     char key[1024]={0,};
     char masterDir[1024]={0,};
     char localDir[1024]={0,};
-    char name[1024]={0,};
-    char localName[1024]={0,};
-    char recomposed[1024]={0,};
-    char localRecomposed[1024]={0,};
     char dictName[1024]={0,};
     char *localFilename=0;
     char* list=0;
@@ -189,6 +185,8 @@ static grib_trie* load_dictionary(grib_context* c,grib_accessor* a, int* err)
     if (self->localDir != NULL) grib_get_string(h,self->localDir,localDir,&len);
 
     if (*masterDir!=0) {
+        char name[1024]={0,};
+        char recomposed[1024]={0,};
         sprintf(name,"%s/%s",masterDir,self->dictionary);
         grib_recompose_name(h, NULL,name, recomposed,0);
         filename=grib_context_full_defs_path(c,recomposed);
@@ -197,6 +195,8 @@ static grib_trie* load_dictionary(grib_context* c,grib_accessor* a, int* err)
     }
 
     if (*localDir!=0) {
+        char localName[1024]={0,};
+        char localRecomposed[1024]={0,};
         sprintf(localName,"%s/%s",localDir,self->dictionary);
         grib_recompose_name(h, NULL,localName, localRecomposed,0);
         localFilename=grib_context_full_defs_path(c,localRecomposed);
diff --git a/src/grib_accessor_class_dirty.c b/src/grib_accessor_class_dirty.c
index 68b68c7..9f0b3eb 100644
--- a/src/grib_accessor_class_dirty.c
+++ b/src/grib_accessor_class_dirty.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_divdouble.c b/src/grib_accessor_class_divdouble.c
index 1a69189..fb24f9b 100644
--- a/src/grib_accessor_class_divdouble.c
+++ b/src/grib_accessor_class_divdouble.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_double.c b/src/grib_accessor_class_double.c
index cdc80ae..073dd88 100644
--- a/src/grib_accessor_class_double.c
+++ b/src/grib_accessor_class_double.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_element.c b/src/grib_accessor_class_element.c
index 8af1a79..ba06d05 100644
--- a/src/grib_accessor_class_element.c
+++ b/src/grib_accessor_class_element.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_evaluate.c b/src/grib_accessor_class_evaluate.c
index fcdb5d4..d7e63c7 100644
--- a/src/grib_accessor_class_evaluate.c
+++ b/src/grib_accessor_class_evaluate.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_expanded_descriptors.c b/src/grib_accessor_class_expanded_descriptors.c
index 19b3706..e66e447 100644
--- a/src/grib_accessor_class_expanded_descriptors.c
+++ b/src/grib_accessor_class_expanded_descriptors.c
@@ -1,5 +1,5 @@
 /*
-* Copyright 2005-2016 ECMWF.
+* Copyright 2005-2017 ECMWF.
 *
 * This software is licensed under the terms of the Apache Licence Version 2.0
 * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -168,6 +168,13 @@ typedef struct change_coding_params {
     double referenceFactor;
 } change_coding_params ;
 
+/* Handy macro to catch errors.
+ * Arguments: array is a pointer to 'bufr_descriptors_array', result is pointer to 'bufr_descriptor' */
+#define DESCRIPTORS_POP_FRONT_OR_RETURN(array,result) {\
+       if(array->n == 0) { *err=GRIB_INTERNAL_ERROR; return 0; } \
+       result=grib_bufr_descriptors_array_pop_front(array); \
+    }
+
 static void init(grib_accessor* a, const long len , grib_arguments* args )
 {
     grib_accessor_expanded_descriptors* self = (grib_accessor_expanded_descriptors*)a;
@@ -194,7 +201,9 @@ static void dump(grib_accessor* a, grib_dumper* dumper)
 
 static bufr_descriptors_array* do_expand(grib_accessor* a,bufr_descriptors_array* unexpanded,change_coding_params* ccp,int *err);
 
-static int depth=-1;
+#if MYDEBUG
+static int global_depth=-1;
+#endif
 
 static size_t __expand(grib_accessor* a, bufr_descriptors_array* unexpanded, bufr_descriptors_array* expanded,
         change_coding_params* ccp, int* err)
@@ -217,22 +226,21 @@ static size_t __expand(grib_accessor* a, bufr_descriptors_array* unexpanded, buf
     int idepth;
 #endif
 
-
     if (grib_bufr_descriptors_array_used_size(unexpanded)==0) return 0;
 
     us=grib_bufr_descriptor_clone(grib_bufr_descriptors_array_get(unexpanded,0));
 
     *err=0;
 #if MYDEBUG
-    for (idepth=0;idepth<depth;idepth++) printf("\t");
+    for (idepth=0;idepth<global_depth;idepth++) printf("\t");
     printf("expanding ==> %d-%02d-%03d\n",us->F,us->X,us->Y);
 #endif
     switch (us->F) {
     case 3:
         /* sequence */
-        u=grib_bufr_descriptors_array_pop_front(unexpanded);
+        DESCRIPTORS_POP_FRONT_OR_RETURN(unexpanded,u);
 #if MYDEBUG
-        for (idepth=0;idepth<depth;idepth++) printf("\t");
+        for (idepth=0;idepth<global_depth;idepth++) printf("\t");
         printf("+++ pop  %06ld\n",u->code);
 #endif
         /*this is to get the sequence elements of the sequence unexpanded[i] */
@@ -253,7 +261,7 @@ static size_t __expand(grib_accessor* a, bufr_descriptors_array* unexpanded, buf
         grib_bufr_descriptors_array_delete(inner_unexpanded);
 #if MYDEBUG
         for (i=0;i<inner_expanded->n;i++) {
-            for (idepth=0;idepth<depth;idepth++) printf("\t");
+            for (idepth=0;idepth<global_depth;idepth++) printf("\t");
             printf("+++ push %06ld\n",inner_expanded->v[i]->code);
         }
 #endif
@@ -265,31 +273,32 @@ static size_t __expand(grib_accessor* a, bufr_descriptors_array* unexpanded, buf
         if (us->Y==0) {
             /* delayed replication */
             bufr_descriptor* uidx=0;
-            u=grib_bufr_descriptors_array_pop_front(unexpanded);
+            DESCRIPTORS_POP_FRONT_OR_RETURN(unexpanded,u);
 #if MYDEBUG
-            for (idepth=0;idepth<depth;idepth++) printf("\t");
+            for (idepth=0;idepth<global_depth;idepth++) printf("\t");
             printf("+++ pop  %06ld\n",u->code);
-            for (idepth=0;idepth<depth;idepth++) printf("\t");
+            for (idepth=0;idepth<global_depth;idepth++) printf("\t");
             printf("+++ push %06ld\n",u->code);
 #endif
             grib_bufr_descriptors_array_push(expanded,u);
             idx=expanded->n-1;
             size=0;
             inner_unexpanded=grib_bufr_descriptors_array_new(c,100,100);
-            inner_expanded=grib_bufr_descriptors_array_new(c,100,100);
+
             for (j=0;j<us->X+1;j++) {
-                u0=grib_bufr_descriptors_array_pop_front(unexpanded);
+                DESCRIPTORS_POP_FRONT_OR_RETURN(unexpanded, u0);
                 grib_bufr_descriptors_array_push(inner_unexpanded,u0);
 #if MYDEBUG
-                for (idepth=0;idepth<depth;idepth++) printf("\t");
+                for (idepth=0;idepth<global_depth;idepth++) printf("\t");
                 printf("+++ pop  %06ld\n",u0->code);
 #endif
             }
             inner_expanded=do_expand(a,inner_unexpanded,ccp,err);
+            grib_bufr_descriptors_array_delete(inner_unexpanded);
             size=grib_bufr_descriptors_array_used_size(inner_expanded);
 #if MYDEBUG
             for (i=0;i<inner_expanded->n;i++) {
-                for (idepth=0;idepth<depth;idepth++) printf("\t");
+                for (idepth=0;idepth<global_depth;idepth++) printf("\t");
                 printf("+++ push %06ld\n",inner_expanded->v[i]->code);
             }
 #endif
@@ -298,18 +307,18 @@ static size_t __expand(grib_accessor* a, bufr_descriptors_array* unexpanded, buf
             grib_bufr_descriptor_set_code(0,(size-1)*1000+100000,uidx);
             size++;
         } else {
-            u=grib_bufr_descriptors_array_pop_front(unexpanded);
+            DESCRIPTORS_POP_FRONT_OR_RETURN(unexpanded,u);
 #if MYDEBUG
-            for (idepth=0;idepth<depth;idepth++) printf("\t");
+            for (idepth=0;idepth<global_depth;idepth++) printf("\t");
             printf("+++ pop  %06ld\n",u->code);
 #endif
             grib_bufr_descriptor_delete(u);
             size=us->X*us->Y;
             ur=(bufr_descriptor**)grib_context_malloc_clear(c,us->X*sizeof(bufr_descriptor));
             for (j=0;j<us->X;j++) {
-                ur[j]=grib_bufr_descriptors_array_pop_front(unexpanded);
+                DESCRIPTORS_POP_FRONT_OR_RETURN(unexpanded,ur[j]);
 #if MYDEBUG
-                for (idepth=0;idepth<depth;idepth++) printf("\t");
+                for (idepth=0;idepth<global_depth;idepth++) printf("\t");
                 printf("+++ pop  %06ld\n",ur[j]->code);
 #endif
             }
@@ -330,7 +339,7 @@ static size_t __expand(grib_accessor* a, bufr_descriptors_array* unexpanded, buf
             grib_bufr_descriptors_array_delete(inner_unexpanded);
 #if MYDEBUG
             for (i=0;i<inner_expanded->n;i++) {
-                for (idepth=0;idepth<depth;idepth++) printf("\t");
+                for (idepth=0;idepth<global_depth;idepth++) printf("\t");
                 printf("+++ push %06ld\n",inner_expanded->v[i]->code);
             }
 #endif
@@ -340,7 +349,7 @@ static size_t __expand(grib_accessor* a, bufr_descriptors_array* unexpanded, buf
         break;
 
     case 0:
-        u=grib_bufr_descriptors_array_pop_front(unexpanded);
+        DESCRIPTORS_POP_FRONT_OR_RETURN(unexpanded,u);
         size=1;
         if (ccp->associatedFieldWidth && u->X!=31) {
             bufr_descriptor* au=grib_bufr_descriptor_new(self->tablesAccessor,999999,err);
@@ -350,16 +359,16 @@ static size_t __expand(grib_accessor* a, bufr_descriptors_array* unexpanded, buf
             au->name=grib_context_strdup(c,"associated field");
             au->units=grib_context_strdup(c,"associated units");
 #if MYDEBUG
-            for (idepth=0;idepth<depth;idepth++) printf("\t");
+            for (idepth=0;idepth<global_depth;idepth++) printf("\t");
             printf("+++ push %06ld (%ld %g %ld)",au->code,au->scale,au->reference,au->width);
 #endif
             grib_bufr_descriptors_array_push(expanded,au);
             size++;
         }
 #if MYDEBUG
-        for (idepth=0;idepth<depth;idepth++) printf("\t");
+        for (idepth=0;idepth<global_depth;idepth++) printf("\t");
         printf("+++ pop  %06ld\n",u->code);
-        for (idepth=0;idepth<depth;idepth++) printf("\t");
+        for (idepth=0;idepth<global_depth;idepth++) printf("\t");
         printf("+++ push %06ld [type=%d] (%ld %g %ld)",u->code,
                 u->type,u->scale,u->reference,u->width);
 #endif
@@ -386,9 +395,9 @@ static size_t __expand(grib_accessor* a, bufr_descriptors_array* unexpanded, buf
         break;
 
     case 2:
-        u=grib_bufr_descriptors_array_pop_front(unexpanded);
+        DESCRIPTORS_POP_FRONT_OR_RETURN(unexpanded,u);
 #if MYDEBUG
-        for (idepth=0;idepth<depth;idepth++) printf("\t");
+        for (idepth=0;idepth<global_depth;idepth++) printf("\t");
         printf("+++ pop  %06ld\n",u->code);
 #endif
         switch(us->X) {
@@ -431,7 +440,7 @@ static size_t __expand(grib_accessor* a, bufr_descriptors_array* unexpanded, buf
             break;
         default:
 #if MYDEBUG
-            for (idepth=0;idepth<depth;idepth++) printf("\t");
+            for (idepth=0;idepth<global_depth;idepth++) printf("\t");
             printf("+++ push %06ld\n",u->code);
 #endif
             grib_bufr_descriptors_array_push(expanded,u);
@@ -440,18 +449,18 @@ static size_t __expand(grib_accessor* a, bufr_descriptors_array* unexpanded, buf
         break;
 
         default:
-            u=grib_bufr_descriptors_array_pop_front(unexpanded);
+            DESCRIPTORS_POP_FRONT_OR_RETURN(unexpanded,u);
 #if MYDEBUG
-            for (idepth=0;idepth<depth;idepth++) printf("\t");
+            for (idepth=0;idepth<global_depth;idepth++) printf("\t");
             printf("+++ pop  %06ld\n",u->code);
-            for (idepth=0;idepth<depth;idepth++) printf("\t");
+            for (idepth=0;idepth<global_depth;idepth++) printf("\t");
             printf("+++ push %06ld\n",u->code);
 #endif
             grib_bufr_descriptors_array_push(expanded,u);
             size=1;
     }
 #if MYDEBUG
-    for (idepth=0;idepth<depth;idepth++) printf("\t");
+    for (idepth=0;idepth<global_depth;idepth++) printf("\t");
     printf("expanding <== %d-%.2d-%.3d (size=%ld)\n\n",us->F,us->X,us->Y,size);
 #endif
     if (us) grib_bufr_descriptor_delete(us);
@@ -464,23 +473,22 @@ static bufr_descriptors_array* do_expand(grib_accessor* a,bufr_descriptors_array
     grib_context* c=a->context;
 #if MYDEBUG
     int idepth;
+    global_depth++;
 #endif
 
-    depth++;
-
     expanded=grib_bufr_descriptors_array_new(c,100,100);
 
 #if MYDEBUG
     {
         int i;
-        for (idepth=0;idepth<depth;idepth++) printf("\t");
+        for (idepth=0;idepth<global_depth;idepth++) printf("\t");
         printf("to be expanded ==> \n");
         for (i=0;i<unexpanded->n;i++) {
             bufr_descriptor* xx=grib_bufr_descriptors_array_get(unexpanded,i);
-            for (idepth=0;idepth<depth;idepth++) printf("\t");
+            for (idepth=0;idepth<global_depth;idepth++) printf("\t");
             printf("%06ld\n",xx->code);
         }
-        for (idepth=0;idepth<depth;idepth++) printf("\t");
+        for (idepth=0;idepth<global_depth;idepth++) printf("\t");
         printf("to be expanded <== \n\n");
     }
 #endif
@@ -490,21 +498,23 @@ static bufr_descriptors_array* do_expand(grib_accessor* a,bufr_descriptors_array
 #if MYDEBUG
     {
         int i;
-        for (idepth=0;idepth<depth;idepth++) printf("\t");
+        for (idepth=0;idepth<global_depth;idepth++) printf("\t");
         printf("expanded ==> \n");
         for (i=0;i<expanded->n;i++) {
             bufr_descriptor* xx=grib_bufr_descriptors_array_get(expanded,i);
-            for (idepth=0;idepth<depth;idepth++) printf("\t");
+            for (idepth=0;idepth<global_depth;idepth++) printf("\t");
             printf("==  %-6d== %06ld ",i,xx->code);
             printf("%ld %g %ld",xx->scale,xx->reference,xx->width);
             printf("\n");
         }
-        for (idepth=0;idepth<depth;idepth++) printf("\t");
+        for (idepth=0;idepth<global_depth;idepth++) printf("\t");
         printf("expanded <== \n\n");
     }
 #endif
 
-    depth--;
+#if MYDEBUG
+    global_depth--;
+#endif
 
     return expanded;
 }
@@ -538,6 +548,10 @@ static int expand(grib_accessor* a)
     grib_bufr_descriptors_array_delete(self->expanded);
     err=grib_get_size(grib_handle_of_accessor(a),self->unexpandedDescriptors,&unexpandedSize);
     if (err) return err;
+    if (unexpandedSize==0) {
+        grib_context_log(c, GRIB_LOG_ERROR, "%s: Unexpanded size is zero!", a->name);
+        return GRIB_DECODING_ERROR;
+    }
     u=(long*)grib_context_malloc_clear(c,sizeof(long)*unexpandedSize);
     if (!u) {err=GRIB_OUT_OF_MEMORY; return err;}
     err=grib_get_long_array(grib_handle_of_accessor(a),self->unexpandedDescriptors,u,&unexpandedSize);
@@ -560,7 +574,6 @@ static int expand(grib_accessor* a)
     grib_bufr_descriptors_array_delete(unexpanded);
 
     return err;
-
 }
 
 int grib_accessor_class_expanded_descriptors_set_do_expand(grib_accessor* a,long do_expand)
@@ -577,7 +590,7 @@ bufr_descriptors_array* grib_accessor_class_expanded_descriptors_get_expanded(gr
     return self->expanded;
 }
 
-static int    unpack_double   (grib_accessor* a, double* val, size_t *len)
+static int unpack_double(grib_accessor* a, double* val, size_t *len)
 {
     grib_accessor_expanded_descriptors* self = (grib_accessor_expanded_descriptors*)a;
     int ret=0;
@@ -608,7 +621,7 @@ static int    unpack_double   (grib_accessor* a, double* val, size_t *len)
     return ret;
 }
 
-static int    unpack_long   (grib_accessor* a, long* val, size_t *len)
+static int unpack_long(grib_accessor* a, long* val, size_t *len)
 {
     grib_accessor_expanded_descriptors* self = (grib_accessor_expanded_descriptors*)a;
     int ret=0;
@@ -649,7 +662,7 @@ static int    unpack_long   (grib_accessor* a, long* val, size_t *len)
     return GRIB_SUCCESS;
 }
 
-static int    pack_long   (grib_accessor* a, const long* val, size_t *len)
+static int pack_long(grib_accessor* a, const long* val, size_t *len)
 {
     grib_accessor_expanded_descriptors* self = (grib_accessor_expanded_descriptors*)a;
     self->do_expand=1;
diff --git a/src/grib_accessor_class_forward.c b/src/grib_accessor_class_forward.c
index d344817..d03bcb9 100644
--- a/src/grib_accessor_class_forward.c
+++ b/src/grib_accessor_class_forward.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_from_scale_factor_scaled_value.c b/src/grib_accessor_class_from_scale_factor_scaled_value.c
index 3417fe2..1e3feb1 100644
--- a/src/grib_accessor_class_from_scale_factor_scaled_value.c
+++ b/src/grib_accessor_class_from_scale_factor_scaled_value.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_g1_half_byte_codeflag.c b/src/grib_accessor_class_g1_half_byte_codeflag.c
index eb2aa67..0639266 100644
--- a/src/grib_accessor_class_g1_half_byte_codeflag.c
+++ b/src/grib_accessor_class_g1_half_byte_codeflag.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_g1_increment.c b/src/grib_accessor_class_g1_increment.c
index d026b20..4b225ba 100644
--- a/src/grib_accessor_class_g1_increment.c
+++ b/src/grib_accessor_class_g1_increment.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_g1_message_length.c b/src/grib_accessor_class_g1_message_length.c
index 8ca3667..904839b 100644
--- a/src/grib_accessor_class_g1_message_length.c
+++ b/src/grib_accessor_class_g1_message_length.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_g1_section4_length.c b/src/grib_accessor_class_g1_section4_length.c
index b63dfd3..027f287 100644
--- a/src/grib_accessor_class_g1_section4_length.c
+++ b/src/grib_accessor_class_g1_section4_length.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_g1area.c b/src/grib_accessor_class_g1area.c
index 732d76a..68ce857 100644
--- a/src/grib_accessor_class_g1area.c
+++ b/src/grib_accessor_class_g1area.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_g1bitmap.c b/src/grib_accessor_class_g1bitmap.c
index cf5a339..1b3cff5 100644
--- a/src/grib_accessor_class_g1bitmap.c
+++ b/src/grib_accessor_class_g1bitmap.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_g1date.c b/src/grib_accessor_class_g1date.c
index e1a335c..894be0b 100644
--- a/src/grib_accessor_class_g1date.c
+++ b/src/grib_accessor_class_g1date.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_g1day_of_the_year_date.c b/src/grib_accessor_class_g1day_of_the_year_date.c
index a911c1e..eee780b 100644
--- a/src/grib_accessor_class_g1day_of_the_year_date.c
+++ b/src/grib_accessor_class_g1day_of_the_year_date.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_g1end_of_interval_monthly.c b/src/grib_accessor_class_g1end_of_interval_monthly.c
index fc5a569..ee10a36 100644
--- a/src/grib_accessor_class_g1end_of_interval_monthly.c
+++ b/src/grib_accessor_class_g1end_of_interval_monthly.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_g1fcperiod.c b/src/grib_accessor_class_g1fcperiod.c
index 9d91db8..3a15837 100644
--- a/src/grib_accessor_class_g1fcperiod.c
+++ b/src/grib_accessor_class_g1fcperiod.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_g1forecastmonth.c b/src/grib_accessor_class_g1forecastmonth.c
index d8bbfc5..86c6060 100644
--- a/src/grib_accessor_class_g1forecastmonth.c
+++ b/src/grib_accessor_class_g1forecastmonth.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_g1monthlydate.c b/src/grib_accessor_class_g1monthlydate.c
index ee38a06..6ae7366 100644
--- a/src/grib_accessor_class_g1monthlydate.c
+++ b/src/grib_accessor_class_g1monthlydate.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_g1number_of_coded_values_sh_complex.c b/src/grib_accessor_class_g1number_of_coded_values_sh_complex.c
index b49573a..d735038 100644
--- a/src/grib_accessor_class_g1number_of_coded_values_sh_complex.c
+++ b/src/grib_accessor_class_g1number_of_coded_values_sh_complex.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_g1number_of_coded_values_sh_simple.c b/src/grib_accessor_class_g1number_of_coded_values_sh_simple.c
index 3c74dc8..e8fefc0 100644
--- a/src/grib_accessor_class_g1number_of_coded_values_sh_simple.c
+++ b/src/grib_accessor_class_g1number_of_coded_values_sh_simple.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_g1p1p2.c b/src/grib_accessor_class_g1p1p2.c
index 0b0412e..4cfc893 100644
--- a/src/grib_accessor_class_g1p1p2.c
+++ b/src/grib_accessor_class_g1p1p2.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_g1param.c b/src/grib_accessor_class_g1param.c
index afd5290..0efc486 100644
--- a/src/grib_accessor_class_g1param.c
+++ b/src/grib_accessor_class_g1param.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_g1step_range.c b/src/grib_accessor_class_g1step_range.c
index e1b36e6..f512ef6 100644
--- a/src/grib_accessor_class_g1step_range.c
+++ b/src/grib_accessor_class_g1step_range.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_g1verificationdate.c b/src/grib_accessor_class_g1verificationdate.c
index c5fde93..ad45520 100644
--- a/src/grib_accessor_class_g1verificationdate.c
+++ b/src/grib_accessor_class_g1verificationdate.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_g2_chemical.c b/src/grib_accessor_class_g2_chemical.c
index aec6a41..3b611b1 100644
--- a/src/grib_accessor_class_g2_chemical.c
+++ b/src/grib_accessor_class_g2_chemical.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_g2_eps.c b/src/grib_accessor_class_g2_eps.c
index 9d258ad..2231198 100644
--- a/src/grib_accessor_class_g2_eps.c
+++ b/src/grib_accessor_class_g2_eps.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_g2_mars_labeling.c b/src/grib_accessor_class_g2_mars_labeling.c
index 02c781f..c7615de 100644
--- a/src/grib_accessor_class_g2_mars_labeling.c
+++ b/src/grib_accessor_class_g2_mars_labeling.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_g2bitmap.c b/src/grib_accessor_class_g2bitmap.c
index 0ccc084..62a6b49 100644
--- a/src/grib_accessor_class_g2bitmap.c
+++ b/src/grib_accessor_class_g2bitmap.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_g2bitmap_present.c b/src/grib_accessor_class_g2bitmap_present.c
index c51f604..0024913 100644
--- a/src/grib_accessor_class_g2bitmap_present.c
+++ b/src/grib_accessor_class_g2bitmap_present.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_g2date.c b/src/grib_accessor_class_g2date.c
index e451af8..8f4248b 100644
--- a/src/grib_accessor_class_g2date.c
+++ b/src/grib_accessor_class_g2date.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_g2end_step.c b/src/grib_accessor_class_g2end_step.c
index 143bb09..d98a0a9 100644
--- a/src/grib_accessor_class_g2end_step.c
+++ b/src/grib_accessor_class_g2end_step.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_g2grid.c b/src/grib_accessor_class_g2grid.c
index 4e5c5a1..95a9fa7 100644
--- a/src/grib_accessor_class_g2grid.c
+++ b/src/grib_accessor_class_g2grid.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_g2latlon.c b/src/grib_accessor_class_g2latlon.c
index a01200b..bd04e7c 100644
--- a/src/grib_accessor_class_g2latlon.c
+++ b/src/grib_accessor_class_g2latlon.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_g2level.c b/src/grib_accessor_class_g2level.c
index 03d8be7..2896eee 100644
--- a/src/grib_accessor_class_g2level.c
+++ b/src/grib_accessor_class_g2level.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_g2lon.c b/src/grib_accessor_class_g2lon.c
index ac81d76..944a7ff 100644
--- a/src/grib_accessor_class_g2lon.c
+++ b/src/grib_accessor_class_g2lon.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_g2step.c b/src/grib_accessor_class_g2step.c
index 925e960..4c8b4f2 100644
--- a/src/grib_accessor_class_g2step.c
+++ b/src/grib_accessor_class_g2step.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_g2step_range.c b/src/grib_accessor_class_g2step_range.c
index 14c848a..3e24274 100644
--- a/src/grib_accessor_class_g2step_range.c
+++ b/src/grib_accessor_class_g2step_range.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_gaussian_grid_name.c b/src/grib_accessor_class_gaussian_grid_name.c
index fa29df4..8ac5360 100644
--- a/src/grib_accessor_class_gaussian_grid_name.c
+++ b/src/grib_accessor_class_gaussian_grid_name.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_gds_is_present.c b/src/grib_accessor_class_gds_is_present.c
index eab3ca4..421e533 100644
--- a/src/grib_accessor_class_gds_is_present.c
+++ b/src/grib_accessor_class_gds_is_present.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_gds_not_present_bitmap.c b/src/grib_accessor_class_gds_not_present_bitmap.c
index accd4b5..dc0272a 100644
--- a/src/grib_accessor_class_gds_not_present_bitmap.c
+++ b/src/grib_accessor_class_gds_not_present_bitmap.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_gen.c b/src/grib_accessor_class_gen.c
index b3cb9c7..a75da8a 100644
--- a/src/grib_accessor_class_gen.c
+++ b/src/grib_accessor_class_gen.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -375,40 +375,50 @@ static int unpack_string_array(grib_accessor*a , char**  v, size_t *len)
 static int pack_expression(grib_accessor* a, grib_expression *e)
 {
     size_t len = 1;
-    long   lval;
-    double   dval;
-    const char    *cval;
+    long   lval=0;
+    double dval=0;
+    const char *cval=NULL;
     int ret=0;
-    char tmp[1024];
+    grib_handle* hand = grib_handle_of_accessor(a);
 
     switch(grib_accessor_get_native_type(a))
     {
-    case GRIB_TYPE_LONG:
-        len = 1;
-        ret = grib_expression_evaluate_long(grib_handle_of_accessor(a),e,&lval);
-        if (ret != GRIB_SUCCESS) {
-            grib_context_log(a->context,GRIB_LOG_ERROR,"unable to set %s as long",a->name);
-            return ret;
+        case GRIB_TYPE_LONG: {
+            len = 1;
+            ret = grib_expression_evaluate_long(hand,e,&lval);
+            if (ret != GRIB_SUCCESS) {
+                grib_context_log(a->context,GRIB_LOG_ERROR,"unable to set %s as long",a->name);
+                return ret;
+            }
+            /*if (hand->context->debug)
+                printf("ECCODES DEBUG grib_accessor_class_gen::pack_expression %s %ld\n", a->name,lval);*/
+            return grib_pack_long(a,&lval,&len);
+            break;
         }
-        return grib_pack_long(a,&lval,&len);
-        break;
 
-    case GRIB_TYPE_DOUBLE:
-        len = 1;
-        ret = grib_expression_evaluate_double(grib_handle_of_accessor(a),e,&dval);
-        return grib_pack_double(a,&dval,&len);
-        break;
+        case GRIB_TYPE_DOUBLE: {
+            len = 1;
+            ret = grib_expression_evaluate_double(hand,e,&dval);
+            /*if (hand->context->debug)
+                printf("ECCODES DEBUG grib_accessor_class_gen::pack_expression %s %g\n", a->name, dval);*/
+            return grib_pack_double(a,&dval,&len);
+            break;
+        }
 
-    case GRIB_TYPE_STRING:
-        len = sizeof(tmp);
-        cval = grib_expression_evaluate_string(grib_handle_of_accessor(a),e,tmp,&len,&ret);
-        if (ret != GRIB_SUCCESS) {
-            grib_context_log(a->context,GRIB_LOG_ERROR,"unable to set %s as string",a->name);
-            return ret;
+        case GRIB_TYPE_STRING: {
+            char tmp[1024];
+            len = sizeof(tmp);
+            cval = grib_expression_evaluate_string(hand,e,tmp,&len,&ret);
+            if (ret != GRIB_SUCCESS) {
+                grib_context_log(a->context,GRIB_LOG_ERROR,"unable to set %s as string",a->name);
+                return ret;
+            }
+            len = strlen(cval);
+            /*if (hand->context->debug)
+                printf("ECCODES DEBUG grib_accessor_class_gen::pack_expression %s %s\n", a->name, cval);*/
+            return grib_pack_string(a,cval,&len);
+            break;
         }
-        len = strlen(cval);
-        return grib_pack_string(a,cval,&len);
-        break;
     }
 
     return GRIB_NOT_IMPLEMENTED;
diff --git a/src/grib_accessor_class_getenv.c b/src/grib_accessor_class_getenv.c
index 3c4614b..3498cad 100644
--- a/src/grib_accessor_class_getenv.c
+++ b/src/grib_accessor_class_getenv.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_global_gaussian.c b/src/grib_accessor_class_global_gaussian.c
index 22040b0..02f0daf 100644
--- a/src/grib_accessor_class_global_gaussian.c
+++ b/src/grib_accessor_class_global_gaussian.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_group.c b/src/grib_accessor_class_group.c
index 5b1a8c5..ee1eec1 100644
--- a/src/grib_accessor_class_group.c
+++ b/src/grib_accessor_class_group.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_gts_header.c b/src/grib_accessor_class_gts_header.c
index 7ca139c..eb80315 100644
--- a/src/grib_accessor_class_gts_header.c
+++ b/src/grib_accessor_class_gts_header.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_hash_array.c b/src/grib_accessor_class_hash_array.c
index 7eef15d..3c809fd 100644
--- a/src/grib_accessor_class_hash_array.c
+++ b/src/grib_accessor_class_hash_array.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -143,156 +143,162 @@ static void init_class(grib_accessor_class* c)
 
 #define MAX_HASH_ARRAY_STRING_LENGTH 255
 
-
 static void init(grib_accessor* a, const long len , grib_arguments* args )
 {
-   grib_accessor_hash_array* self=(grib_accessor_hash_array*)a;
-   a->length = 0;
-   self->key=0;
-   self->ha=NULL;
+    grib_accessor_hash_array* self=(grib_accessor_hash_array*)a;
+    a->length = 0;
+    self->key=0;
+    self->ha=NULL;
 }
 
 static void dump(grib_accessor* a, grib_dumper* dumper)
 {
-  grib_dump_string(dumper,a,NULL);
+    grib_dump_string(dumper,a,NULL);
 }
 
 static int pack_double(grib_accessor* a, const double* val, size_t *len)
 {
-   grib_accessor_hash_array* self=(grib_accessor_hash_array*)a;
-   char s[200]={0,};
-   sprintf(s,"%g",*val);
-   self->key=grib_context_strdup(a->context,s);
-   self->ha=0;
-  return GRIB_SUCCESS;
+    grib_accessor_hash_array* self=(grib_accessor_hash_array*)a;
+    char s[200]={0,};
+    sprintf(s,"%g",*val);
+    self->key=grib_context_strdup(a->context,s);
+    self->ha=0;
+    return GRIB_SUCCESS;
 }
 
 static int pack_long(grib_accessor* a, const long* val, size_t *len)
 {
-   grib_accessor_hash_array* self=(grib_accessor_hash_array*)a;
-   char s[200]={0,};
-   sprintf(s,"%ld",*val);
-   if (self->key) grib_context_free(a->context,self->key);
-   self->key=grib_context_strdup(a->context,s);
-   self->ha=0;
-   return GRIB_SUCCESS;
+    grib_accessor_hash_array* self=(grib_accessor_hash_array*)a;
+    char s[200]={0,};
+    sprintf(s,"%ld",*val);
+    if (self->key) grib_context_free(a->context,self->key);
+    self->key=grib_context_strdup(a->context,s);
+    self->ha=0;
+    return GRIB_SUCCESS;
 }
 
-static int pack_string(grib_accessor*a , const char*  v, size_t *len){
-   grib_accessor_hash_array* self=(grib_accessor_hash_array*)a;
-   self->key=grib_context_strdup(a->context,v);
-   self->ha=0;
-   return GRIB_SUCCESS;
+static int pack_string(grib_accessor*a , const char*  v, size_t *len)
+{
+    grib_accessor_hash_array* self=(grib_accessor_hash_array*)a;
+    self->key=grib_context_strdup(a->context,v);
+    self->ha=0;
+    return GRIB_SUCCESS;
 }
 
 static int unpack_double(grib_accessor* a, double* val, size_t *len)
 {
-  return GRIB_NOT_IMPLEMENTED;
+    return GRIB_NOT_IMPLEMENTED;
 }
 
-static grib_hash_array_value* find_hash_value(grib_accessor* a,int *err) {
-  grib_accessor_hash_array* self=(grib_accessor_hash_array*)a;
-  grib_hash_array_value* ha_ret=0;
-  grib_hash_array_value* ha=NULL;
-
-  ha=get_hash_array(grib_handle_of_accessor(a),a->creator);
-
-  *err=GRIB_SUCCESS;
-
-  Assert(ha!=NULL);
-  if (!self->key) {
-    grib_context_log(a->context,GRIB_LOG_ERROR,
-    "unable to get hash value for %s, set before getting",a->creator->name);
-    *err=GRIB_HASH_ARRAY_NO_MATCH;
-    return NULL;
-  }
-
-  ha_ret=(grib_hash_array_value*)grib_trie_get(ha->index,self->key);
-  if (!ha_ret) ha_ret=(grib_hash_array_value*)grib_trie_get(ha->index,"default");
-
-  if (!ha_ret)  {
-      *err=GRIB_HASH_ARRAY_NO_MATCH;
-      grib_context_log(a->context,GRIB_LOG_ERROR,
-                          "hash_array: no match for %s=%s",
-                            a->creator->name,self->key);
-      return NULL;
-  }
-  return ha_ret;
+static grib_hash_array_value* find_hash_value(grib_accessor* a,int *err)
+{
+    grib_accessor_hash_array* self=(grib_accessor_hash_array*)a;
+    grib_hash_array_value* ha_ret=0;
+    grib_hash_array_value* ha=NULL;
+
+    ha=get_hash_array(grib_handle_of_accessor(a),a->creator);
+    if (!ha) {
+        grib_context_log(a->context,GRIB_LOG_ERROR,
+                "unable to get hash value for %s", a->creator->name);
+        *err=GRIB_HASH_ARRAY_NO_MATCH;
+        return NULL;
+    }
+
+    *err=GRIB_SUCCESS;
+
+    Assert(ha!=NULL);
+    if (!self->key) {
+        grib_context_log(a->context,GRIB_LOG_ERROR,
+                "unable to get hash value for %s, set before getting",a->creator->name);
+        *err=GRIB_HASH_ARRAY_NO_MATCH;
+        return NULL;
+    }
+
+    ha_ret=(grib_hash_array_value*)grib_trie_get(ha->index,self->key);
+    if (!ha_ret) ha_ret=(grib_hash_array_value*)grib_trie_get(ha->index,"default");
+
+    if (!ha_ret)  {
+        *err=GRIB_HASH_ARRAY_NO_MATCH;
+        grib_context_log(a->context,GRIB_LOG_ERROR,
+                "hash_array: no match for %s=%s",
+                a->creator->name,self->key);
+        return NULL;
+    }
+    return ha_ret;
 }
 
 static int unpack_long(grib_accessor* a, long* val, size_t *len)
 {
-  grib_hash_array_value* ha=0;
-  grib_accessor_hash_array* self=(grib_accessor_hash_array*)a;
-  int err=0;
-  int i;
-
-  if (!self->ha) {
-    ha=find_hash_value(a,&err);
-    if (err) return err;
-    self->ha=ha;
-  }
-
-  switch (self->ha->type) {
+    grib_hash_array_value* ha=0;
+    grib_accessor_hash_array* self=(grib_accessor_hash_array*)a;
+    int err=0;
+    int i;
+
+    if (!self->ha) {
+        ha=find_hash_value(a,&err);
+        if (err) return err;
+        self->ha=ha;
+    }
+
+    switch (self->ha->type) {
     case GRIB_HASH_ARRAY_TYPE_INTEGER:
-          if (*len<self->ha->iarray->n) {
+        if (*len<self->ha->iarray->n) {
             return GRIB_ARRAY_TOO_SMALL;
-          }
-          *len=self->ha->iarray->n;
-          for (i=0;i<*len;i++)
+        }
+        *len=self->ha->iarray->n;
+        for (i=0;i<*len;i++)
             val[i]=self->ha->iarray->v[i];
         break;
 
     default:
         return GRIB_NOT_IMPLEMENTED;
-  }
-
-  return GRIB_SUCCESS;
+    }
 
+    return GRIB_SUCCESS;
 }
 
 static int get_native_type(grib_accessor* a)
 {
-	int type=GRIB_TYPE_STRING;
-	if (a->flags & GRIB_ACCESSOR_FLAG_LONG_TYPE)
-		type=GRIB_TYPE_LONG;
+    int type=GRIB_TYPE_STRING;
+    if (a->flags & GRIB_ACCESSOR_FLAG_LONG_TYPE)
+        type=GRIB_TYPE_LONG;
 
-  	return type;
+    return type;
 }
 
 static void destroy(grib_context* c,grib_accessor* a)
 {
-  grib_accessor_hash_array *self = (grib_accessor_hash_array*)a;
-  if (self->key) grib_context_free(c,self->key);
+    grib_accessor_hash_array *self = (grib_accessor_hash_array*)a;
+    if (self->key) grib_context_free(c,self->key);
 }
 
-static int unpack_string (grib_accessor* a, char* val, size_t *len){
-  return GRIB_NOT_IMPLEMENTED;
+static int unpack_string (grib_accessor* a, char* val, size_t *len)
+{
+    return GRIB_NOT_IMPLEMENTED;
 }
 
 static size_t string_length(grib_accessor* a)
 {
-	return MAX_HASH_ARRAY_STRING_LENGTH;
+    return MAX_HASH_ARRAY_STRING_LENGTH;
 }
 
 static int value_count(grib_accessor* a,long* count)
 {
-  int err=0;
-  grib_accessor_hash_array *self = (grib_accessor_hash_array*)a;
-  grib_hash_array_value* ha=0;
-
-  if (!self->ha) {
-    ha=find_hash_value(a,&err);
-    if (err) return err;
-    self->ha=ha;
-  }
-
-  *count=self->ha->iarray->n;
-  return err;
+    int err=0;
+    grib_accessor_hash_array *self = (grib_accessor_hash_array*)a;
+    grib_hash_array_value* ha=0;
+
+    if (!self->ha) {
+        ha=find_hash_value(a,&err);
+        if (err) return err;
+        self->ha=ha;
+    }
+
+    *count=self->ha->iarray->n;
+    return err;
 }
 
-
-static int compare(grib_accessor* a,grib_accessor* b) {
-  return GRIB_NOT_IMPLEMENTED;
+static int compare(grib_accessor* a,grib_accessor* b)
+{
+    return GRIB_NOT_IMPLEMENTED;
 }
-
diff --git a/src/grib_accessor_class_headers_only.c b/src/grib_accessor_class_headers_only.c
index 8911943..687ba14 100644
--- a/src/grib_accessor_class_headers_only.c
+++ b/src/grib_accessor_class_headers_only.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_ibmfloat.c b/src/grib_accessor_class_ibmfloat.c
index 9ae2803..06e4b99 100644
--- a/src/grib_accessor_class_ibmfloat.c
+++ b/src/grib_accessor_class_ibmfloat.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_ieeefloat.c b/src/grib_accessor_class_ieeefloat.c
index ae6514b..d7b139f 100644
--- a/src/grib_accessor_class_ieeefloat.c
+++ b/src/grib_accessor_class_ieeefloat.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_ifs_param.c b/src/grib_accessor_class_ifs_param.c
index 74ef574..76e087d 100644
--- a/src/grib_accessor_class_ifs_param.c
+++ b/src/grib_accessor_class_ifs_param.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_int16.c b/src/grib_accessor_class_int16.c
index a60f948..cbac1e8 100644
--- a/src/grib_accessor_class_int16.c
+++ b/src/grib_accessor_class_int16.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_int16_little_endian.c b/src/grib_accessor_class_int16_little_endian.c
index 97f2a52..1cf94f4 100644
--- a/src/grib_accessor_class_int16_little_endian.c
+++ b/src/grib_accessor_class_int16_little_endian.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_int32.c b/src/grib_accessor_class_int32.c
index 189e7f2..f2f48d8 100644
--- a/src/grib_accessor_class_int32.c
+++ b/src/grib_accessor_class_int32.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_int32_little_endian.c b/src/grib_accessor_class_int32_little_endian.c
index d44dccb..7350ac6 100644
--- a/src/grib_accessor_class_int32_little_endian.c
+++ b/src/grib_accessor_class_int32_little_endian.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_int64.c b/src/grib_accessor_class_int64.c
index fa39947..f7f52ff 100644
--- a/src/grib_accessor_class_int64.c
+++ b/src/grib_accessor_class_int64.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_int64_little_endian.c b/src/grib_accessor_class_int64_little_endian.c
index 21ab771..36fbf9b 100644
--- a/src/grib_accessor_class_int64_little_endian.c
+++ b/src/grib_accessor_class_int64_little_endian.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_int8.c b/src/grib_accessor_class_int8.c
index 7c1f9ce..0b99677 100644
--- a/src/grib_accessor_class_int8.c
+++ b/src/grib_accessor_class_int8.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_iterator.c b/src/grib_accessor_class_iterator.c
index 1dc875c..1433ab0 100644
--- a/src/grib_accessor_class_iterator.c
+++ b/src/grib_accessor_class_iterator.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_julian_day.c b/src/grib_accessor_class_julian_day.c
index 9df0892..edb8888 100644
--- a/src/grib_accessor_class_julian_day.c
+++ b/src/grib_accessor_class_julian_day.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_ksec1expver.c b/src/grib_accessor_class_ksec1expver.c
index a2f08e9..9a60458 100644
--- a/src/grib_accessor_class_ksec1expver.c
+++ b/src/grib_accessor_class_ksec1expver.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_label.c b/src/grib_accessor_class_label.c
index 06d3a2c..a43e135 100644
--- a/src/grib_accessor_class_label.c
+++ b/src/grib_accessor_class_label.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_laplacian.c b/src/grib_accessor_class_laplacian.c
index 870dd8d..463f7e0 100644
--- a/src/grib_accessor_class_laplacian.c
+++ b/src/grib_accessor_class_laplacian.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_latitudes.c b/src/grib_accessor_class_latitudes.c
index 5c73bc3..1c3199c 100644
--- a/src/grib_accessor_class_latitudes.c
+++ b/src/grib_accessor_class_latitudes.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_latlon_increment.c b/src/grib_accessor_class_latlon_increment.c
index 32dc84f..5689317 100644
--- a/src/grib_accessor_class_latlon_increment.c
+++ b/src/grib_accessor_class_latlon_increment.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_latlonvalues.c b/src/grib_accessor_class_latlonvalues.c
index 01c2ff5..fb0262b 100644
--- a/src/grib_accessor_class_latlonvalues.c
+++ b/src/grib_accessor_class_latlonvalues.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_library_version.c b/src/grib_accessor_class_library_version.c
index e1f3d62..5db21bc 100644
--- a/src/grib_accessor_class_library_version.c
+++ b/src/grib_accessor_class_library_version.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_local_definition.c b/src/grib_accessor_class_local_definition.c
index c850888..4698586 100644
--- a/src/grib_accessor_class_local_definition.c
+++ b/src/grib_accessor_class_local_definition.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_long.c b/src/grib_accessor_class_long.c
index 0f1899f..d7ef4c9 100644
--- a/src/grib_accessor_class_long.c
+++ b/src/grib_accessor_class_long.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_long_vector.c b/src/grib_accessor_class_long_vector.c
index 535bd91..3b6026b 100644
--- a/src/grib_accessor_class_long_vector.c
+++ b/src/grib_accessor_class_long_vector.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_longitudes.c b/src/grib_accessor_class_longitudes.c
index 9d72ba5..1a620f8 100644
--- a/src/grib_accessor_class_longitudes.c
+++ b/src/grib_accessor_class_longitudes.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_lookup.c b/src/grib_accessor_class_lookup.c
index 13fe40d..b6a51fa 100644
--- a/src/grib_accessor_class_lookup.c
+++ b/src/grib_accessor_class_lookup.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_mars_param.c b/src/grib_accessor_class_mars_param.c
index 224a36f..08359bf 100644
--- a/src/grib_accessor_class_mars_param.c
+++ b/src/grib_accessor_class_mars_param.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_mars_step.c b/src/grib_accessor_class_mars_step.c
index 977ac3b..d81fe23 100644
--- a/src/grib_accessor_class_mars_step.c
+++ b/src/grib_accessor_class_mars_step.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_md5.c b/src/grib_accessor_class_md5.c
index 526facf..3d56f16 100644
--- a/src/grib_accessor_class_md5.c
+++ b/src/grib_accessor_class_md5.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_message.c b/src/grib_accessor_class_message.c
index 947a233..a8e0326 100644
--- a/src/grib_accessor_class_message.c
+++ b/src/grib_accessor_class_message.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_message_copy.c b/src/grib_accessor_class_message_copy.c
index a2bf6eb..29f6792 100644
--- a/src/grib_accessor_class_message_copy.c
+++ b/src/grib_accessor_class_message_copy.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_missing.c b/src/grib_accessor_class_missing.c
index 9d13099..46034ae 100644
--- a/src/grib_accessor_class_missing.c
+++ b/src/grib_accessor_class_missing.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_nearest.c b/src/grib_accessor_class_nearest.c
index e00504d..28f4c35 100644
--- a/src/grib_accessor_class_nearest.c
+++ b/src/grib_accessor_class_nearest.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_non_alpha.c b/src/grib_accessor_class_non_alpha.c
index 18df588..5fab0ec 100644
--- a/src/grib_accessor_class_non_alpha.c
+++ b/src/grib_accessor_class_non_alpha.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_number_of_coded_values.c b/src/grib_accessor_class_number_of_coded_values.c
index c7d7cb6..fd677e7 100644
--- a/src/grib_accessor_class_number_of_coded_values.c
+++ b/src/grib_accessor_class_number_of_coded_values.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_number_of_points.c b/src/grib_accessor_class_number_of_points.c
index dd74fff..35b5478 100644
--- a/src/grib_accessor_class_number_of_points.c
+++ b/src/grib_accessor_class_number_of_points.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_number_of_points_gaussian.c b/src/grib_accessor_class_number_of_points_gaussian.c
index a2719af..f0b4ab0 100644
--- a/src/grib_accessor_class_number_of_points_gaussian.c
+++ b/src/grib_accessor_class_number_of_points_gaussian.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_number_of_values.c b/src/grib_accessor_class_number_of_values.c
index a0737ff..e97759a 100644
--- a/src/grib_accessor_class_number_of_values.c
+++ b/src/grib_accessor_class_number_of_values.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_number_of_values_data_raw_packing.c b/src/grib_accessor_class_number_of_values_data_raw_packing.c
index 937fae9..40fca23 100644
--- a/src/grib_accessor_class_number_of_values_data_raw_packing.c
+++ b/src/grib_accessor_class_number_of_values_data_raw_packing.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_octahedral_gaussian.c b/src/grib_accessor_class_octahedral_gaussian.c
index 356f6ed..8a371a5 100644
--- a/src/grib_accessor_class_octahedral_gaussian.c
+++ b/src/grib_accessor_class_octahedral_gaussian.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_octect_number.c b/src/grib_accessor_class_octect_number.c
index 950b6ca..26d71b9 100644
--- a/src/grib_accessor_class_octect_number.c
+++ b/src/grib_accessor_class_octect_number.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_offset_file.c b/src/grib_accessor_class_offset_file.c
index 769cfd1..7039c3a 100644
--- a/src/grib_accessor_class_offset_file.c
+++ b/src/grib_accessor_class_offset_file.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_offset_values.c b/src/grib_accessor_class_offset_values.c
index af9e555..69279c6 100644
--- a/src/grib_accessor_class_offset_values.c
+++ b/src/grib_accessor_class_offset_values.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_pack_bufr_values.c b/src/grib_accessor_class_pack_bufr_values.c
index 83d0995..e03b5dc 100644
--- a/src/grib_accessor_class_pack_bufr_values.c
+++ b/src/grib_accessor_class_pack_bufr_values.c
@@ -1,5 +1,5 @@
 /**
-* Copyright 2005-2016 ECMWF
+* Copyright 2005-2017 ECMWF
 *
 * Licensed under the GNU Lesser General Public License which
 * incorporates the terms and conditions of version 3 of the GNU
diff --git a/src/grib_accessor_class_pad.c b/src/grib_accessor_class_pad.c
index eb09d5b..3026efa 100644
--- a/src/grib_accessor_class_pad.c
+++ b/src/grib_accessor_class_pad.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_padding.c b/src/grib_accessor_class_padding.c
index 43f9af4..a9e3ead 100644
--- a/src/grib_accessor_class_padding.c
+++ b/src/grib_accessor_class_padding.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_padto.c b/src/grib_accessor_class_padto.c
index 77035ad..4713c7e 100644
--- a/src/grib_accessor_class_padto.c
+++ b/src/grib_accessor_class_padto.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_padtoeven.c b/src/grib_accessor_class_padtoeven.c
index 19b1fb5..a59cfa3 100644
--- a/src/grib_accessor_class_padtoeven.c
+++ b/src/grib_accessor_class_padtoeven.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_padtomultiple.c b/src/grib_accessor_class_padtomultiple.c
index 9c7c98a..933d6a9 100644
--- a/src/grib_accessor_class_padtomultiple.c
+++ b/src/grib_accessor_class_padtomultiple.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_position.c b/src/grib_accessor_class_position.c
index 672edec..35ec99a 100644
--- a/src/grib_accessor_class_position.c
+++ b/src/grib_accessor_class_position.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_raw.c b/src/grib_accessor_class_raw.c
index bd7e8c8..ca69405 100644
--- a/src/grib_accessor_class_raw.c
+++ b/src/grib_accessor_class_raw.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_reference_value_error.c b/src/grib_accessor_class_reference_value_error.c
index aabf9d0..6606595 100644
--- a/src/grib_accessor_class_reference_value_error.c
+++ b/src/grib_accessor_class_reference_value_error.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_round.c b/src/grib_accessor_class_round.c
index b6e2809..abe7fa0 100644
--- a/src/grib_accessor_class_round.c
+++ b/src/grib_accessor_class_round.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_scale.c b/src/grib_accessor_class_scale.c
index 01974fe..6132b21 100644
--- a/src/grib_accessor_class_scale.c
+++ b/src/grib_accessor_class_scale.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_scale_values.c b/src/grib_accessor_class_scale_values.c
index c46c774..611e2bf 100644
--- a/src/grib_accessor_class_scale_values.c
+++ b/src/grib_accessor_class_scale_values.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_second_order_bits_per_value.c b/src/grib_accessor_class_second_order_bits_per_value.c
index dc7c320..248032e 100644
--- a/src/grib_accessor_class_second_order_bits_per_value.c
+++ b/src/grib_accessor_class_second_order_bits_per_value.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -159,7 +159,7 @@ static int number_of_bits(unsigned long x, long* result)
         (*result)++;
         if (*result >= count) {
             return GRIB_ENCODING_ERROR;
-    }
+        }
     }
     return GRIB_SUCCESS;
 }
@@ -185,7 +185,7 @@ static int pack_long(grib_accessor* a, const long* val,size_t *len)
     return 0;
 }
 
-static int  unpack_long(grib_accessor* a, long* val, size_t *len)
+static int unpack_long(grib_accessor* a, long* val, size_t *len)
 {
     int ret=GRIB_SUCCESS;
     size_t size=0;
@@ -223,8 +223,8 @@ static int  unpack_long(grib_accessor* a, long* val, size_t *len)
     max=values[0];
     min=max;
     for (i=1;i<size;i++) {
-        if (max<values[i]) max=values[i];
-        if (min>values[i]) min=values[i];
+        if      (max<values[i]) max=values[i];
+        else if (min>values[i]) min=values[i];
     }
 
     d=grib_power(decimalScaleFactor,10);
diff --git a/src/grib_accessor_class_section.c b/src/grib_accessor_class_section.c
index e7e3e8c..1af42ed 100644
--- a/src/grib_accessor_class_section.c
+++ b/src/grib_accessor_class_section.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_section_length.c b/src/grib_accessor_class_section_length.c
index 12c8160..082dd3b 100644
--- a/src/grib_accessor_class_section_length.c
+++ b/src/grib_accessor_class_section_length.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_section_padding.c b/src/grib_accessor_class_section_padding.c
index 38e262e..ad788ee 100644
--- a/src/grib_accessor_class_section_padding.c
+++ b/src/grib_accessor_class_section_padding.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_section_pointer.c b/src/grib_accessor_class_section_pointer.c
index dd996a6..46fe89e 100644
--- a/src/grib_accessor_class_section_pointer.c
+++ b/src/grib_accessor_class_section_pointer.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_select_step_template.c b/src/grib_accessor_class_select_step_template.c
index 3dd3005..c7831aa 100644
--- a/src/grib_accessor_class_select_step_template.c
+++ b/src/grib_accessor_class_select_step_template.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_sexagesimal2decimal.c b/src/grib_accessor_class_sexagesimal2decimal.c
index 9d750fd..36784b8 100644
--- a/src/grib_accessor_class_sexagesimal2decimal.c
+++ b/src/grib_accessor_class_sexagesimal2decimal.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_signed.c b/src/grib_accessor_class_signed.c
index c035c97..46a2e2b 100644
--- a/src/grib_accessor_class_signed.c
+++ b/src/grib_accessor_class_signed.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_signed_bits.c b/src/grib_accessor_class_signed_bits.c
index 57f0b21..cee55d6 100644
--- a/src/grib_accessor_class_signed_bits.c
+++ b/src/grib_accessor_class_signed_bits.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_simple_packing_error.c b/src/grib_accessor_class_simple_packing_error.c
index 3094d0f..7982267 100644
--- a/src/grib_accessor_class_simple_packing_error.c
+++ b/src/grib_accessor_class_simple_packing_error.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_size.c b/src/grib_accessor_class_size.c
index ae25cd9..fa0ae5f 100644
--- a/src/grib_accessor_class_size.c
+++ b/src/grib_accessor_class_size.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_smart_table.c b/src/grib_accessor_class_smart_table.c
index d9be686..566508b 100644
--- a/src/grib_accessor_class_smart_table.c
+++ b/src/grib_accessor_class_smart_table.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -189,26 +189,26 @@ static void thread_init()
 #endif
 
 static int grib_load_smart_table(grib_context* c,const char* filename,
-           const char* recomposed_name,size_t size,grib_smart_table* t);
-
-static void init(grib_accessor* a, const long len, grib_arguments* params) {
-  int n=0;
-  grib_accessor_smart_table* self  = (grib_accessor_smart_table*)a;
-
-  self->values = grib_arguments_get_name(grib_handle_of_accessor(a),params,n++);
-  self->tablename = grib_arguments_get_string(grib_handle_of_accessor(a),params,n++);
-  self->masterDir = grib_arguments_get_name(grib_handle_of_accessor(a),params,n++);
-  self->localDir = grib_arguments_get_name(grib_handle_of_accessor(a),params,n++);
-  self->widthOfCode = grib_arguments_get_long(grib_handle_of_accessor(a),params,n++);
-  self->extraDir = grib_arguments_get_name(grib_handle_of_accessor(a),params,n++);
-  self->extraTable = grib_arguments_get_string(grib_handle_of_accessor(a),params,n++);
-
-  a->length = 0;
-  a->flags |= GRIB_ACCESSOR_FLAG_READ_ONLY;
-  self->dirty=1;
-  self->tableCodesSize=0;
-  self->tableCodes=0;
+        const char* recomposed_name,size_t size,grib_smart_table* t);
 
+static void init(grib_accessor* a, const long len, grib_arguments* params)
+{
+    int n=0;
+    grib_accessor_smart_table* self  = (grib_accessor_smart_table*)a;
+
+    self->values = grib_arguments_get_name(grib_handle_of_accessor(a),params,n++);
+    self->tablename = grib_arguments_get_string(grib_handle_of_accessor(a),params,n++);
+    self->masterDir = grib_arguments_get_name(grib_handle_of_accessor(a),params,n++);
+    self->localDir = grib_arguments_get_name(grib_handle_of_accessor(a),params,n++);
+    self->widthOfCode = grib_arguments_get_long(grib_handle_of_accessor(a),params,n++);
+    self->extraDir = grib_arguments_get_name(grib_handle_of_accessor(a),params,n++);
+    self->extraTable = grib_arguments_get_string(grib_handle_of_accessor(a),params,n++);
+
+    a->length = 0;
+    a->flags |= GRIB_ACCESSOR_FLAG_READ_ONLY;
+    self->dirty=1;
+    self->tableCodesSize=0;
+    self->tableCodes=0;
 }
 
 static grib_smart_table* load_table(grib_accessor_smart_table* self)
@@ -271,11 +271,11 @@ static grib_smart_table* load_table(grib_accessor_smart_table* self)
     while(next) {
         if((filename && next->filename[0] && strcmp(filename,next->filename[0]) == 0) &&
                 ((localFilename==0 && next->filename[1]==NULL) ||
-                 ((localFilename!=0 && next->filename[1]!=NULL)
-                  && strcmp(localFilename,next->filename[1]) ==0)) &&
-                ((extraFilename==0 && next->filename[2]==NULL) ||
-                 ((extraFilename!=0 && next->filename[2]!=NULL)
-                  && strcmp(extraFilename,next->filename[2]) ==0)) )
+                        ((localFilename!=0 && next->filename[1]!=NULL)
+                                && strcmp(localFilename,next->filename[1]) ==0)) &&
+                                ((extraFilename==0 && next->filename[2]==NULL) ||
+                                        ((extraFilename!=0 && next->filename[2]!=NULL)
+                                                && strcmp(extraFilename,next->filename[2]) ==0)) )
             return next;
         next = next->next;
     }
@@ -298,216 +298,213 @@ static grib_smart_table* load_table(grib_accessor_smart_table* self)
     }
 
     return t;
-
 }
 
 static int grib_load_smart_table(grib_context* c,const char* filename,
-           const char* recomposed_name,size_t size,grib_smart_table* t) {
-  char line[1024]={0,};
-  FILE *f = NULL;
-  int lineNumber;
-  int numberOfColumns;
-  int code;
-
-  grib_context_log(c,GRIB_LOG_DEBUG,"Loading code table form %s",filename);
-
-  f=codes_fopen(filename, "r");
-  if (!f) return GRIB_IO_PROBLEM;
-
-  Assert(t!=NULL);
-
-  if (t->filename[0] == NULL ){
-    t->filename[0]  = grib_context_strdup_persistent(c,filename);
-    t->recomposed_name[0]  = grib_context_strdup_persistent(c,recomposed_name);
-    t->next      = c->smart_table;
-    t->numberOfEntries      = size;
-    GRIB_MUTEX_INIT_ONCE(&once,&thread_init)
-    GRIB_MUTEX_LOCK(&mutex)
-    c->smart_table = t;
-    GRIB_MUTEX_UNLOCK(&mutex)
-  } else if (t->filename[1] == NULL ){
-    t->filename[1]  = grib_context_strdup_persistent(c,filename);
-    t->recomposed_name[1]  = grib_context_strdup_persistent(c,recomposed_name);
-  } else {
-    t->filename[2]  = grib_context_strdup_persistent(c,filename);
-    t->recomposed_name[2]  = grib_context_strdup_persistent(c,recomposed_name);
-  }
-
-  lineNumber = 0;
-  while(fgets(line,sizeof(line)-1,f))
-  {
-    char* s=line;
-    char* p=line;
-
-    line[strlen(line)-1]=0;
-
-    ++lineNumber;
-    while(*s != '\0' && isspace(*s)) s++;
-
-    if(*s == '#') continue;
-
-    p=s;
-    while(*p != '\0' && *p!='|' ) p++;
-
-    if (!p) {
-       grib_context_log(c,GRIB_LOG_ERROR, "Invalid entry in file %s: line %d", filename, lineNumber);
-       continue; /* skip this line */
+        const char* recomposed_name,size_t size,grib_smart_table* t)
+{
+    char line[1024]={0,};
+    FILE *f = NULL;
+    int lineNumber;
+    int numberOfColumns;
+    int code;
+
+    grib_context_log(c,GRIB_LOG_DEBUG,"Loading code table form %s",filename);
+
+    f=codes_fopen(filename, "r");
+    if (!f) return GRIB_IO_PROBLEM;
+
+    Assert(t!=NULL);
+
+    if (t->filename[0] == NULL ){
+        t->filename[0]  = grib_context_strdup_persistent(c,filename);
+        t->recomposed_name[0]  = grib_context_strdup_persistent(c,recomposed_name);
+        t->next      = c->smart_table;
+        t->numberOfEntries      = size;
+        GRIB_MUTEX_INIT_ONCE(&once,&thread_init)
+        GRIB_MUTEX_LOCK(&mutex)
+        c->smart_table = t;
+        GRIB_MUTEX_UNLOCK(&mutex)
+    } else if (t->filename[1] == NULL ){
+        t->filename[1]  = grib_context_strdup_persistent(c,filename);
+        t->recomposed_name[1]  = grib_context_strdup_persistent(c,recomposed_name);
+    } else {
+        t->filename[2]  = grib_context_strdup_persistent(c,filename);
+        t->recomposed_name[2]  = grib_context_strdup_persistent(c,recomposed_name);
     }
 
-    *p=0;
+    lineNumber = 0;
+    while(fgets(line,sizeof(line)-1,f))
+    {
+        char* s=line;
+        char* p=line;
 
-    code=atol(s);
+        line[strlen(line)-1]=0;
 
-    p++; s=p;
-    while(*p != '\0' && *p!='|' ) p++;
+        ++lineNumber;
+        while(*s != '\0' && isspace(*s)) s++;
 
-    if (!p) {
-       grib_context_log(c,GRIB_LOG_ERROR, "Invalid entry in file %s: line %d", filename, lineNumber);
-       continue; /* skip this line */
-    }
-    *p=0;
+        if(*s == '#') continue;
 
-    numberOfColumns=0;
-    while (*s) {
+        p=s;
+        while(*p != '\0' && *p!='|' ) p++;
+
+        if (!p) {
+            grib_context_log(c,GRIB_LOG_ERROR, "Invalid entry in file %s: line %d", filename, lineNumber);
+            continue; /* skip this line */
+        }
+
+        *p=0;
 
-        t->entries[code].column[numberOfColumns]=grib_context_strdup_persistent(c,s);
-        numberOfColumns++;
-        Assert(numberOfColumns<MAX_SMART_TABLE_COLUMNS);
+        code=atol(s);
 
         p++; s=p;
         while(*p != '\0' && *p!='|' ) p++;
-        *p=0;
-    }
-  }
 
-  fclose(f);
+        if (!p) {
+            grib_context_log(c,GRIB_LOG_ERROR, "Invalid entry in file %s: line %d", filename, lineNumber);
+            continue; /* skip this line */
+        }
+        *p=0;
 
-  return 0;
+        numberOfColumns=0;
+        while (*s) {
 
-}
+            t->entries[code].column[numberOfColumns]=grib_context_strdup_persistent(c,s);
+            numberOfColumns++;
+            Assert(numberOfColumns<MAX_SMART_TABLE_COLUMNS);
 
-void grib_smart_table_delete(grib_context* c) {
-  grib_smart_table* t = c->smart_table;
+            p++; s=p;
+            while(*p != '\0' && *p!='|' ) p++;
+            *p=0;
+        }
+    }
 
-  while(t)
-  {
-    grib_smart_table* s = t->next;
-    int i;
-    int k;
+    fclose(f);
+    return 0;
+}
 
-    for(i = 0; i < t->numberOfEntries; i++)
+void grib_smart_table_delete(grib_context* c)
+{
+    grib_smart_table* t = c->smart_table;
+    while(t)
     {
-      grib_context_free_persistent(c,t->entries[i].abbreviation);
-      for (k=0;k<MAX_SMART_TABLE_COLUMNS;k++) {
-          if (t->entries[i].column[k])
-            grib_context_free_persistent(c,t->entries[i].column[k]);
-      }
-      grib_context_free_persistent(c,&(t->entries[i]));
-    }
-    grib_context_free_persistent(c,t->filename[0]);
-    if(t->filename[1])
-      grib_context_free_persistent(c,t->filename[1]);
-    grib_context_free_persistent(c,t->recomposed_name[0]);
-    if (t->recomposed_name[1])
-      grib_context_free_persistent(c,t->recomposed_name[1]);
-    grib_context_free_persistent(c,t);
-    t = s;
-  }
+        grib_smart_table* s = t->next;
+        int i;
+        int k;
 
+        for(i = 0; i < t->numberOfEntries; i++)
+        {
+            grib_context_free_persistent(c,t->entries[i].abbreviation);
+            for (k=0;k<MAX_SMART_TABLE_COLUMNS;k++) {
+                if (t->entries[i].column[k])
+                    grib_context_free_persistent(c,t->entries[i].column[k]);
+            }
+            grib_context_free_persistent(c,&(t->entries[i]));
+        }
+        grib_context_free_persistent(c,t->filename[0]);
+        if(t->filename[1])
+            grib_context_free_persistent(c,t->filename[1]);
+        grib_context_free_persistent(c,t->recomposed_name[0]);
+        if (t->recomposed_name[1])
+            grib_context_free_persistent(c,t->recomposed_name[1]);
+        grib_context_free_persistent(c,t);
+        t = s;
+    }
 }
 
 static void dump(grib_accessor* a, grib_dumper* dumper)
 {
-  grib_dump_long(dumper,a,NULL);
+    grib_dump_long(dumper,a,NULL);
 }
 
 static int unpack_string (grib_accessor* a, char* buffer, size_t *len)
 {
-  grib_accessor_smart_table* self = (grib_accessor_smart_table*)a;
-  grib_smart_table*          table = NULL;
+    grib_accessor_smart_table* self = (grib_accessor_smart_table*)a;
+    grib_smart_table*          table = NULL;
 
-  size_t size = 1;
-  long   value;
-  int err = GRIB_SUCCESS;
-  char tmp[1024];
-  size_t l = 0;
+    size_t size = 1;
+    long   value;
+    int err = GRIB_SUCCESS;
+    char tmp[1024];
+    size_t l = 0;
 
-  if( (err = grib_unpack_long(a,&value,&size)) != GRIB_SUCCESS)
-    return err;
+    if( (err = grib_unpack_long(a,&value,&size)) != GRIB_SUCCESS)
+        return err;
 
-  if(!self->table) self->table = load_table(self);
-  table=self->table;
+    if(!self->table) self->table = load_table(self);
+    table=self->table;
 
-  if(table && (value >= 0) && (value < table->numberOfEntries) && table->entries[value].abbreviation)
-  {
-    strcpy(tmp,table->entries[value].abbreviation);
-  }
-  else
-  {
-    sprintf(tmp,"%d",(int)value);
-  }
+    if(table && (value >= 0) && (value < table->numberOfEntries) && table->entries[value].abbreviation)
+    {
+        strcpy(tmp,table->entries[value].abbreviation);
+    }
+    else
+    {
+        sprintf(tmp,"%d",(int)value);
+    }
 
-  l = strlen(tmp) + 1;
+    l = strlen(tmp) + 1;
 
-  if(*len < l)
-  {
-    *len = l;
-    return GRIB_BUFFER_TOO_SMALL;
-  }
+    if(*len < l)
+    {
+        *len = l;
+        return GRIB_BUFFER_TOO_SMALL;
+    }
 
-  strcpy(buffer,tmp);
-  *len = l;
-  self->dirty=0;
+    strcpy(buffer,tmp);
+    *len = l;
+    self->dirty=0;
 
-  return GRIB_SUCCESS;
+    return GRIB_SUCCESS;
 }
 
 static int get_table_codes(grib_accessor* a)
 {
-  grib_accessor_smart_table* self = (grib_accessor_smart_table*)a;
-  size_t size=0;
-  long *v=0;
-  int err=0;
-  int count,j;
-  size_t i;
+    grib_accessor_smart_table* self = (grib_accessor_smart_table*)a;
+    size_t size=0;
+    long *v=0;
+    int err=0;
+    int count,j;
+    size_t i;
 
-  int table_size;
+    int table_size;
 
-  if (!self->dirty) return 0;
+    if (!self->dirty) return 0;
 
-  table_size = grib_power(self->widthOfCode,2);
+    table_size = grib_power(self->widthOfCode,2);
 
-  if(!self->table)
-    self->table = load_table(self);
+    if(!self->table)
+        self->table = load_table(self);
 
-  err=grib_get_size(grib_handle_of_accessor(a),self->values,&size);
-  if (err) {
-    grib_context_log(a->context,GRIB_LOG_ERROR,
-        "unable to get size of %s",a->name);
-    return err;
-  }
+    err=grib_get_size(grib_handle_of_accessor(a),self->values,&size);
+    if (err) {
+        grib_context_log(a->context,GRIB_LOG_ERROR,
+                "unable to get size of %s",a->name);
+        return err;
+    }
 
-  v=(long*)grib_context_malloc_clear(a->context,size*sizeof(long));
+    v=(long*)grib_context_malloc_clear(a->context,size*sizeof(long));
 
-  grib_get_long_array(grib_handle_of_accessor(a),self->values,v,&size);
+    grib_get_long_array(grib_handle_of_accessor(a),self->values,v,&size);
 
-  count=0;
-  for (i=0;i<size;i++) {
-    if (v[i] < table_size) count++;
-  }
-  if (self->tableCodes) grib_context_free(a->context,self->tableCodes);
-  self->tableCodes=(long*)grib_context_malloc_clear(a->context,count*sizeof(long));
-  j=0;
-  for (i=0;i<size;i++) {
-    if (v[i] < table_size) self->tableCodes[j++]=v[i];
-  }
+    count=0;
+    for (i=0;i<size;i++) {
+        if (v[i] < table_size) count++;
+    }
+    if (self->tableCodes) grib_context_free(a->context,self->tableCodes);
+    self->tableCodes=(long*)grib_context_malloc_clear(a->context,count*sizeof(long));
+    j=0;
+    for (i=0;i<size;i++) {
+        if (v[i] < table_size) self->tableCodes[j++]=v[i];
+    }
 
-  grib_context_free(a->context,v);
+    grib_context_free(a->context,v);
 
-  self->tableCodesSize=count;
-  self->dirty=0;
+    self->tableCodesSize=count;
+    self->dirty=0;
 
-  return 0;
+    return 0;
 }
 
 static int value_count(grib_accessor* a,long* count)
@@ -528,23 +525,24 @@ static void destroy(grib_context* context,grib_accessor* a)
 {
     grib_accessor_smart_table* self = (grib_accessor_smart_table*)a;
     if (a->vvalue != NULL) {
-	grib_context_free(context, a->vvalue);
-	a->vvalue=NULL;
+        grib_context_free(context, a->vvalue);
+        a->vvalue=NULL;
     }
     if (self->tableCodes) grib_context_free(a->context,self->tableCodes);
 
 }
 
-static int  get_native_type(grib_accessor* a){
-  int type=GRIB_TYPE_LONG;
-  /*printf("---------- %s flags=%ld GRIB_ACCESSOR_FLAG_STRING_TYPE=%d\n",
+static int  get_native_type(grib_accessor* a)
+{
+    int type=GRIB_TYPE_LONG;
+    /*printf("---------- %s flags=%ld GRIB_ACCESSOR_FLAG_STRING_TYPE=%d\n",
          a->name,a->flags,GRIB_ACCESSOR_FLAG_STRING_TYPE);*/
-  if (a->flags & GRIB_ACCESSOR_FLAG_STRING_TYPE)
-    type=GRIB_TYPE_STRING;
-  return type;
+    if (a->flags & GRIB_ACCESSOR_FLAG_STRING_TYPE)
+        type=GRIB_TYPE_STRING;
+    return type;
 }
 
-static int    unpack_long   (grib_accessor* a, long* val, size_t *len)
+static int unpack_long   (grib_accessor* a, long* val, size_t *len)
 {
     int err=0;
     grib_accessor_smart_table* self = (grib_accessor_smart_table*)a;
diff --git a/src/grib_accessor_class_smart_table_column.c b/src/grib_accessor_class_smart_table_column.c
index f6a7eee..692c09c 100644
--- a/src/grib_accessor_class_smart_table_column.c
+++ b/src/grib_accessor_class_smart_table_column.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_spd.c b/src/grib_accessor_class_spd.c
index 952159f..e34bfdd 100644
--- a/src/grib_accessor_class_spd.c
+++ b/src/grib_accessor_class_spd.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_spectral_truncation.c b/src/grib_accessor_class_spectral_truncation.c
index 3253f87..3fc7ab4 100644
--- a/src/grib_accessor_class_spectral_truncation.c
+++ b/src/grib_accessor_class_spectral_truncation.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_sprintf.c b/src/grib_accessor_class_sprintf.c
index 3056e46..0ed3d9a 100644
--- a/src/grib_accessor_class_sprintf.c
+++ b/src/grib_accessor_class_sprintf.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_statistics.c b/src/grib_accessor_class_statistics.c
index 7f040f4..8dd8be5 100644
--- a/src/grib_accessor_class_statistics.c
+++ b/src/grib_accessor_class_statistics.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_statistics_spectral.c b/src/grib_accessor_class_statistics_spectral.c
index e6fc38b..292f25b 100644
--- a/src/grib_accessor_class_statistics_spectral.c
+++ b/src/grib_accessor_class_statistics_spectral.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_step_in_units.c b/src/grib_accessor_class_step_in_units.c
index ae4c951..6864d59 100644
--- a/src/grib_accessor_class_step_in_units.c
+++ b/src/grib_accessor_class_step_in_units.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_sum.c b/src/grib_accessor_class_sum.c
index 792e2b7..d21a5db 100644
--- a/src/grib_accessor_class_sum.c
+++ b/src/grib_accessor_class_sum.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_suppressed.c b/src/grib_accessor_class_suppressed.c
index d682f1c..f0d40c3 100644
--- a/src/grib_accessor_class_suppressed.c
+++ b/src/grib_accessor_class_suppressed.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_time.c b/src/grib_accessor_class_time.c
index a77224e..14eb617 100644
--- a/src/grib_accessor_class_time.c
+++ b/src/grib_accessor_class_time.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_times.c b/src/grib_accessor_class_times.c
index 6075459..68bca64 100644
--- a/src/grib_accessor_class_times.c
+++ b/src/grib_accessor_class_times.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_to_double.c b/src/grib_accessor_class_to_double.c
index 35c9d9c..6c05ff9 100644
--- a/src/grib_accessor_class_to_double.c
+++ b/src/grib_accessor_class_to_double.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_to_integer.c b/src/grib_accessor_class_to_integer.c
index 71b7d3f..c5dfcee 100644
--- a/src/grib_accessor_class_to_integer.c
+++ b/src/grib_accessor_class_to_integer.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_to_string.c b/src/grib_accessor_class_to_string.c
index 06a4546..430d797 100644
--- a/src/grib_accessor_class_to_string.c
+++ b/src/grib_accessor_class_to_string.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_transient.c b/src/grib_accessor_class_transient.c
index 8abdbcc..fcbbb92 100644
--- a/src/grib_accessor_class_transient.c
+++ b/src/grib_accessor_class_transient.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_transient_darray.c b/src/grib_accessor_class_transient_darray.c
index bf297e4..ecd02c2 100644
--- a/src/grib_accessor_class_transient_darray.c
+++ b/src/grib_accessor_class_transient_darray.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_uint16.c b/src/grib_accessor_class_uint16.c
index 2e4891b..050476e 100644
--- a/src/grib_accessor_class_uint16.c
+++ b/src/grib_accessor_class_uint16.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_uint16_little_endian.c b/src/grib_accessor_class_uint16_little_endian.c
index a4767bd..7dfcdec 100644
--- a/src/grib_accessor_class_uint16_little_endian.c
+++ b/src/grib_accessor_class_uint16_little_endian.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_uint32.c b/src/grib_accessor_class_uint32.c
index e474c5c..fc4d487 100644
--- a/src/grib_accessor_class_uint32.c
+++ b/src/grib_accessor_class_uint32.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_uint32_little_endian.c b/src/grib_accessor_class_uint32_little_endian.c
index e2183e5..5794061 100644
--- a/src/grib_accessor_class_uint32_little_endian.c
+++ b/src/grib_accessor_class_uint32_little_endian.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_uint64.c b/src/grib_accessor_class_uint64.c
index 9343f8d..b062096 100644
--- a/src/grib_accessor_class_uint64.c
+++ b/src/grib_accessor_class_uint64.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_uint64_little_endian.c b/src/grib_accessor_class_uint64_little_endian.c
index 2e9846f..3af7704 100644
--- a/src/grib_accessor_class_uint64_little_endian.c
+++ b/src/grib_accessor_class_uint64_little_endian.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_uint8.c b/src/grib_accessor_class_uint8.c
index e0c18b9..9e5b154 100644
--- a/src/grib_accessor_class_uint8.c
+++ b/src/grib_accessor_class_uint8.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_unexpanded_descriptors.c b/src/grib_accessor_class_unexpanded_descriptors.c
index f32ca2c..aec5489 100644
--- a/src/grib_accessor_class_unexpanded_descriptors.c
+++ b/src/grib_accessor_class_unexpanded_descriptors.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -151,7 +151,7 @@ static void dump(grib_accessor* a, grib_dumper* dumper)
     grib_dump_long(dumper,a,NULL);
 }
 
-static int    unpack_long   (grib_accessor* a, long* val, size_t *len)
+static int unpack_long(grib_accessor* a, long* val, size_t *len)
 {
     grib_accessor_unexpanded_descriptors* self = (grib_accessor_unexpanded_descriptors*)a;
     int ret=0;
@@ -167,7 +167,7 @@ static int    unpack_long   (grib_accessor* a, long* val, size_t *len)
     if (ret) return ret;
 
     if (rlen==0) {
-        grib_context_log(a->context,GRIB_LOG_FATAL,
+        grib_context_log(a->context,GRIB_LOG_ERROR,
                 "No descriptors in section 3. Malformed message.");
         return GRIB_MESSAGE_MALFORMED;
     }
@@ -190,7 +190,7 @@ static int    unpack_long   (grib_accessor* a, long* val, size_t *len)
     return GRIB_SUCCESS;
 }
 
-static int    pack_long   (grib_accessor* a, const long* val, size_t *len)
+static int pack_long(grib_accessor* a, const long* val, size_t *len)
 {
     grib_accessor_unexpanded_descriptors* self = (grib_accessor_unexpanded_descriptors*)a;
     int ret=0,i;
@@ -228,7 +228,6 @@ static int    pack_long   (grib_accessor* a, const long* val, size_t *len)
     return ret;
 }
 
-
 static int value_count(grib_accessor* a,long* numberOfUnexpandedDescriptors)
 {
     grib_accessor_unexpanded_descriptors* self = (grib_accessor_unexpanded_descriptors*)a;
@@ -240,7 +239,8 @@ static int value_count(grib_accessor* a,long* numberOfUnexpandedDescriptors)
     return 0;
 }
 
-static long byte_offset(grib_accessor* a){
+static long byte_offset(grib_accessor* a)
+{
     return a->offset;
 }
 
@@ -249,7 +249,7 @@ static void update_size(grib_accessor* a,size_t s)
     a->length = s;
 }
 
-static long next_offset(grib_accessor* a){
+static long next_offset(grib_accessor* a)
+{
     return byte_offset(a)+a->length;
 }
-
diff --git a/src/grib_accessor_class_unpack_bufr_values.c b/src/grib_accessor_class_unpack_bufr_values.c
index ef051e4..0dd492f 100644
--- a/src/grib_accessor_class_unpack_bufr_values.c
+++ b/src/grib_accessor_class_unpack_bufr_values.c
@@ -1,5 +1,5 @@
 /**
-* Copyright 2005-2016 ECMWF
+* Copyright 2005-2017 ECMWF
 *
 * Licensed under the GNU Lesser General Public License which
 * incorporates the terms and conditions of version 3 of the GNU
diff --git a/src/grib_accessor_class_unsigned.c b/src/grib_accessor_class_unsigned.c
index e1f1351..66be7fc 100644
--- a/src/grib_accessor_class_unsigned.c
+++ b/src/grib_accessor_class_unsigned.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_unsigned_bits.c b/src/grib_accessor_class_unsigned_bits.c
index 66304c9..ff108de 100644
--- a/src/grib_accessor_class_unsigned_bits.c
+++ b/src/grib_accessor_class_unsigned_bits.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_validity_date.c b/src/grib_accessor_class_validity_date.c
index 0f623f4..3bcb3c5 100644
--- a/src/grib_accessor_class_validity_date.c
+++ b/src/grib_accessor_class_validity_date.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_validity_time.c b/src/grib_accessor_class_validity_time.c
index 6159497..ae36ccc 100644
--- a/src/grib_accessor_class_validity_time.c
+++ b/src/grib_accessor_class_validity_time.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_values.c b/src/grib_accessor_class_values.c
index 678a109..88ea9d0 100644
--- a/src/grib_accessor_class_values.c
+++ b/src/grib_accessor_class_values.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_variable.c b/src/grib_accessor_class_variable.c
index ff9e0ef..9510efe 100644
--- a/src/grib_accessor_class_variable.c
+++ b/src/grib_accessor_class_variable.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -410,6 +410,7 @@ static grib_accessor* make_clone(grib_accessor* a,grib_section* s,int* err)
   the_clone=grib_accessor_factory(s, &creator, 0, NULL);
   the_clone->parent=NULL;
   the_clone->h=s->h;
+  the_clone->flags=a->flags;
   variableAccessor=(grib_accessor_variable*)the_clone;
 
   *err=0;
diff --git a/src/grib_accessor_class_vector.c b/src/grib_accessor_class_vector.c
index 22bc534..41a738c 100644
--- a/src/grib_accessor_class_vector.c
+++ b/src/grib_accessor_class_vector.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_class_when.c b/src/grib_accessor_class_when.c
index 7c15d7d..3357952 100644
--- a/src/grib_accessor_class_when.c
+++ b/src/grib_accessor_class_when.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_accessor_classes_hash.c b/src/grib_accessor_classes_hash.c
index 52c791c..ef2859a 100644
--- a/src/grib_accessor_classes_hash.c
+++ b/src/grib_accessor_classes_hash.c
@@ -3,7 +3,7 @@
 /* Computed positions: -k'2-3,7,11' */
 
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_api.h b/src/grib_api.h
index cc01906..fc3e4e1 100644
--- a/src/grib_api.h
+++ b/src/grib_api.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -16,10 +16,6 @@
 #ifndef grib_api_H
 #define grib_api_H
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -43,6 +39,10 @@ typedef enum ProductKind {PRODUCT_ANY, PRODUCT_GRIB, PRODUCT_BUFR, PRODUCT_METAR
 
 #include "eccodes_version.h"
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 /* sections */
 #define GRIB_SECTION_PRODUCT 	(1<<0)
 #define GRIB_SECTION_GRID 		(1<<1)
@@ -152,6 +152,11 @@ Log mode for information for processing information
 \see grib_keys_iterator_new */
 #define GRIB_KEYS_ITERATOR_SKIP_FUNCTION           (1<<6)
 
+/*! only keys present in the dump
+\ingroup keys_iterator
+\see grib_keys_iterator_new */
+#define GRIB_KEYS_ITERATOR_DUMP_ONLY           (1<<7)
+
 typedef struct grib_key_value_list grib_key_value_list;
 
 typedef struct grib_values grib_values;
@@ -220,7 +225,7 @@ typedef struct grib_viarray grib_viarray;
 typedef struct bufr_descriptor bufr_descriptor;
 typedef struct bufr_descriptors_array bufr_descriptors_array;
 
-grib_fieldset *grib_fieldset_new_from_files(grib_context *c, char *filenames[], int nfiles, char **keys, int nkeys, char *where_string, char *order_by_string, int *err);
+grib_fieldset *grib_fieldset_new_from_files(grib_context *c, char *filenames[], int nfiles, char **keys, int nkeys, const char *where_string, const char *order_by_string, int *err);
 void grib_fieldset_delete(grib_fieldset* set);
 void grib_fieldset_rewind(grib_fieldset* set);
 int grib_fieldset_apply_order_by(grib_fieldset* set,const char* order_by_string);
@@ -768,7 +773,7 @@ int grib_get_double       (grib_handle* h, const char* key, double* value);
 *
 * @param h           : the handle to get the data from
 * @param key         : the key to be searched
-* @param i           : zero based index
+* @param i           : zero-based index
 * @param value       : the address of a double where the data will be retrieved
 * @return            0 if OK, integer value on error
 */
@@ -779,12 +784,12 @@ int grib_get_double_element(grib_handle* h, const char* key, int i, double* valu
 *
 * @param h           : the handle to get the data from
 * @param key         : the key to be searched
-* @param i           : zero based array of indexes
+* @param i           : zero-based array of indexes
 * @param size        : size of the i and value arrays
-* @param value       : the address of a double where the data will be retrieved
+* @param value       : the double array for the data values
 * @return            0 if OK, integer value on error
 */
-int grib_get_double_elements(grib_handle* h, const char* key, int* i, long size,double* value);
+int grib_get_double_elements(grib_handle* h, const char* key, int* i, long size, double* value);
 
 /**
 *  Get a string value from a key, if several keys of the same name are present, the last one is returned
@@ -796,7 +801,7 @@ int grib_get_double_elements(grib_handle* h, const char* key, int* i, long size,
 * @param length      : the address of a size_t that contains allocated length of the string on input, and that contains the actual length of the string on output
 * @return            0 if OK, integer value on error
 */
-int grib_get_string       (grib_handle* h, const char* key, char*   mesg,             size_t *length);
+int grib_get_string(grib_handle* h, const char* key, char* mesg, size_t *length);
 
 int grib_get_string_array(grib_handle* h, const char* name, char** val, size_t *length);
 
@@ -1221,6 +1226,13 @@ long grib_get_api_version(void);
 const char* grib_get_git_sha1(void);
 
 /**
+*  Get the package name
+*
+*  @return character string with package name
+*/
+const char* grib_get_package_name(void);
+
+/**
 *  Prints the API version
 *
 *
@@ -1274,6 +1286,7 @@ int grib_keys_iterator_get_long(grib_keys_iterator *kiter, long *v, size_t *len)
 int grib_keys_iterator_get_double(grib_keys_iterator *kiter, double *v, size_t *len);
 int grib_keys_iterator_get_string(grib_keys_iterator *kiter, char *v, size_t *len);
 int grib_keys_iterator_get_bytes(grib_keys_iterator *kiter, unsigned char *v, size_t *len);
+int codes_copy_key(grib_handle* h1,grib_handle* h2,const char* key,int type);
 
 /* @} */
 
@@ -1297,7 +1310,7 @@ void grib_check(const char* call,const char*  file,int line,int e,const char* ms
 
 int grib_set_values(grib_handle* h,grib_values*  grib_values , size_t arg_count);
 grib_handle* grib_handle_new_from_partial_message_copy(grib_context* c, const void* data, size_t size);
-grib_handle* grib_handle_new_from_partial_message(grib_context* c,void* data, size_t buflen);
+grib_handle* grib_handle_new_from_partial_message(grib_context* c, const void* data, size_t buflen);
 int grib_is_missing(grib_handle* h, const char* key, int* err);
 int grib_is_defined(grib_handle* h, const char* key);
 int grib_set_missing(grib_handle* h, const char* key);
@@ -1563,7 +1576,7 @@ Error codes returned by the grib_api functions.
 #define GRIB_NO_MORE_IN_SET		-15
 /** Problem with calculation of geographic attributes */
 #define GRIB_GEOCALCULUS_PROBLEM		-16
-/** Out of memory */
+/** Memory allocation error */
 #define GRIB_OUT_OF_MEMORY		-17
 /** Value is read only */
 #define GRIB_READ_ONLY		-18
diff --git a/src/grib_api_internal.h b/src/grib_api_internal.h
index d9d9861..e5dfa4f 100644
--- a/src/grib_api_internal.h
+++ b/src/grib_api_internal.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -171,12 +171,16 @@ extern "C" {
  #define DebugAssert(a)
 #endif
 
-/* Compile time assertion - Thanks to Ralf Holly */
-#define COMPILE_TIME_ASSERT(e) \
+#ifdef __gnu_hurd__
+ #define COMPILE_TIME_ASSERT(condition) \
+   extern int compile_time_assert[!!(condition) - 1]
+#else
+ /* Compile time assertion - Thanks to Ralf Holly */
+ #define COMPILE_TIME_ASSERT(condition) \
    do { \
-       enum { assert_static__ = 1/(e) }; \
+       enum { assert_static__ = 1/(condition) }; \
       } while (0)
-
+#endif
 
 #ifndef NDEBUG
  #define DebugAssertAccess(array, index, size) \
@@ -199,7 +203,7 @@ extern "C" {
 
 #define MAX_ACCESSOR_ATTRIBUTES 20
 #define MAX_FILE_HANDLES_WITH_MULTI 10
-#define ACCESSORS_ARRAY_SIZE 20000
+#define ACCESSORS_ARRAY_SIZE 5000
 #define MAX_NUM_CONCEPTS 2000
 #define MAX_NUM_HASH_ARRAY 2000
 
@@ -420,35 +424,24 @@ struct grib_action
     grib_arguments*     default_value; /** default expression as in .def file */
     char*               set;
     char*               debug_info;   /** purely for debugging and tracing */
-    /* If you add something, don't forget to update grib_action_compile */
 };
 
 typedef struct grib_accessors_list grib_accessors_list;
 
 struct grib_accessors_list {
     grib_accessor*       accessor;
+    int rank;
     grib_accessors_list* next;
     grib_accessors_list* prev;
     grib_accessors_list* last;
 };
 
-/* compile */
-
-typedef struct grib_compiler {
-    int         cnt;
-    int         max;
-    FILE*       out;
-    const char* var;
-} grib_compiler;
-
-
 
 typedef  int  (*action_create_accessors_handle_proc)        (grib_section* p, grib_action* a, grib_loader* h);
 typedef  int  (*action_notify_change_proc)                   (grib_action* a, grib_accessor* observer,grib_accessor * observed);
 
 typedef  void  (*grib_dump_proc)                         (grib_action*, FILE*, int );
 typedef  void  (*grib_xref_proc)                         (grib_action*, FILE*,const char*);
-typedef  void  (*grib_compile_proc)                         (grib_action*, grib_compiler*);
 typedef  void  (*action_init_class_proc)            (grib_action_class* a);
 typedef  void  (*action_init_proc)                  (grib_action* a);
 typedef  void  (*action_destroy_proc)                  (grib_context* context,  grib_action* a);
@@ -481,7 +474,6 @@ struct grib_action_class
     action_reparse_proc       reparse;
     action_execute_proc       execute;
 
-    grib_compile_proc         compile;    /** < compile method of the action */
 };
 
 
@@ -522,18 +514,18 @@ struct grib_virtual_value {
 
 struct grib_accessor
 {
-  const char*            name  ;     /** < name of the accessor                       */
+  const char*            name  ;      /** < name of the accessor                       */
   const char*            name_space;  /** < namespace to which the accessor belongs    */
   grib_context*          context;
   grib_handle*           h;
-  grib_action*           creator  ;  /** < action that created the accessor           */
+  grib_action*           creator  ;   /** < action that created the accessor           */
   long                   length ;     /** < byte length of the accessor                */
   long                   offset ;     /** < offset of the data in the buffer           */
-  grib_section*          parent;     /** < section to which the accessor is attached  */
-  grib_accessor*         next  ;     /** < next accessor in list                      */
-  grib_accessor*         previous;   /** < next accessor in list                      */
-  grib_accessor_class*   cclass;     /** < behavior of the accessor                   */
-  unsigned long          flags;      /** < Various flags                              */
+  grib_section*          parent;      /** < section to which the accessor is attached  */
+  grib_accessor*         next  ;      /** < next accessor in list                      */
+  grib_accessor*         previous;    /** < next accessor in list                      */
+  grib_accessor_class*   cclass;      /** < behaviour of the accessor                  */
+  unsigned long          flags;       /** < Various flags                              */
   grib_section*          sub_section;
 
   const char*            all_names[MAX_ACCESSOR_NAMES]  ;   /** < name of the accessor  */
@@ -556,7 +548,7 @@ struct grib_accessor
 #define GRIB_ACCESSOR_FLAG_CAN_BE_MISSING   (1<<4)
 #define GRIB_ACCESSOR_FLAG_HIDDEN           (1<<5)
 #define GRIB_ACCESSOR_FLAG_CONSTRAINT       (1<<6)
-#define GRIB_ACCESSOR_FLAG_OVERRIDE         (1<<7)
+#define GRIB_ACCESSOR_FLAG_BUFR_DATA        (1<<7)
 #define GRIB_ACCESSOR_FLAG_NO_COPY          (1<<8)
 #define GRIB_ACCESSOR_FLAG_COPY_OK          (1<<9)
 #define GRIB_ACCESSOR_FLAG_FUNCTION         (1<<10)
@@ -567,9 +559,6 @@ struct grib_accessor
 #define GRIB_ACCESSOR_FLAG_LONG_TYPE        (1<<15)
 #define GRIB_ACCESSOR_FLAG_DOUBLE_TYPE      (1<<16)
 #define GRIB_ACCESSOR_FLAG_LOWERCASE        (1<<17)
-#define GRIB_ACCESSOR_FLAG_XML              (1<<18)
-#define GRIB_ACCESSOR_FLAG_JSON             (1<<19)
-/* when adding a flag, update grib_compile_flags*/
 
 /**
 *  a section accessor
@@ -1050,6 +1039,7 @@ struct grib_context
     int                             ieee_packing;
     int                             unpack;
     int                             bufrdc_mode;
+    int                             bufr_set_to_missing_if_out_of_range;
     FILE*                           log_stream;
     grib_trie*                      classes;
     grib_trie*                      lists;
@@ -1069,7 +1059,6 @@ typedef const char* (*expression_evaluate_string_proc)(grib_expression*,grib_han
 typedef const char* (*expression_get_name_proc)(grib_expression*);
 
 typedef void        (*expression_print_proc)(grib_context*,grib_expression*,grib_handle*);
-typedef void        (*expression_compile_proc)(grib_expression*,grib_compiler*);
 typedef void        (*expression_add_dependency_proc) (grib_expression*e, grib_accessor* observer );
 
 typedef struct grib_expression_class grib_expression_class;
@@ -1097,7 +1086,6 @@ struct grib_expression_class {
 
 
     expression_print_proc              print;
-    expression_compile_proc            compile;
     expression_add_dependency_proc     add_dependency;
 
     expression_native_type_proc        native_type;
@@ -1360,6 +1348,22 @@ struct grib_action_file_list
     grib_action_file * last ;
 };
 
+/* keys iterator common to grib and bufr*/
+struct grib_keys_iterator{
+  grib_handle     *handle;
+  unsigned long   filter_flags;     /** flags to filter out accessors */
+  unsigned long   accessor_flags_skip;
+  unsigned long   accessor_flags_only;
+  grib_accessor   *current;
+  char            *name_space;
+  int             at_start;
+  int             match;
+  int             i_curr_attribute;
+  grib_accessor** attributes;
+  char*           prefix;
+  grib_trie       *seen;
+};
+
 
 /* ----------*/
 /* md5 */
diff --git a/src/grib_api_prototypes.h b/src/grib_api_prototypes.h
index 6802368..b8a06b9 100644
--- a/src/grib_api_prototypes.h
+++ b/src/grib_api_prototypes.h
@@ -10,7 +10,6 @@ int grib_action_execute(grib_action *a, grib_handle *h);
 void grib_dump_action_branch(FILE *out, grib_action *a, int decay);
 void grib_dump_action_tree(grib_context *ctx, FILE *out);
 void grib_xref_action_branch(FILE *out, grib_action *a, const char *path);
-void grib_compile(grib_action *a, grib_compiler *compiler);
 
 /* action_class_alias.c */
 grib_action *grib_action_create_alias(grib_context *context, const char *name, const char *arg1, const char *name_space, int flags);
@@ -104,7 +103,7 @@ grib_action *grib_action_create_variable(grib_context *context, const char *name
 grib_action *grib_action_create_modify(grib_context *context, const char *name, long flags);
 
 /* action_class_transient_darray.c */
-grib_action *grib_action_create_transient_darray(grib_context *context, const char *name, grib_darray *darray,int flags);
+grib_action *grib_action_create_transient_darray(grib_context *context, const char *name, grib_darray *darray, int flags);
 
 /* grib_accessor.c */
 void grib_accessor_dump(grib_accessor *a, grib_dumper *f);
@@ -154,7 +153,7 @@ grib_accessor *_grib_accessor_get_attribute(grib_accessor *a, const char *name,
 int grib_accessor_has_attributes(grib_accessor *a);
 grib_accessor *grib_accessor_get_attribute(grib_accessor *a, const char *name);
 grib_accessors_list *grib_accessors_list_create(grib_context *c);
-void grib_accessors_list_push(grib_accessors_list *al, grib_accessor *a);
+void grib_accessors_list_push(grib_accessors_list *al, grib_accessor *a, int rank);
 grib_accessors_list *grib_accessors_list_last(grib_accessors_list *al);
 grib_accessors_list *grib_accessors_list_find(grib_accessors_list *al, grib_accessor *a);
 void grib_accessors_list_delete(grib_context *c, grib_accessors_list *al);
@@ -204,8 +203,8 @@ grib_darray *grib_darray_resize(grib_context *c, grib_darray *v);
 grib_darray *grib_darray_push(grib_context *c, grib_darray *v, double val);
 void grib_darray_delete(grib_context *c, grib_darray *v);
 double *grib_darray_get_array(grib_context *c, grib_darray *v);
+int grib_darray_is_constant(grib_darray *v, double eps);
 size_t grib_darray_used_size(grib_darray *v);
-int grib_darray_is_constant(grib_darray* v);
 
 /* grib_sarray.c */
 grib_sarray *grib_sarray_new(grib_context *c, size_t size, size_t incsize);
@@ -232,7 +231,7 @@ void grib_iarray_delete(grib_iarray *v);
 void grib_iarray_delete_array(grib_iarray *v);
 long *grib_iarray_get_array(grib_iarray *v);
 size_t grib_iarray_used_size(grib_iarray *v);
-int grib_iarray_is_constant(grib_iarray* v);
+int grib_iarray_is_constant(grib_iarray *v);
 
 /* grib_vdarray.c */
 grib_vdarray *grib_vdarray_new(grib_context *c, size_t size, size_t incsize);
@@ -282,6 +281,7 @@ int accessor_bufr_data_array_create_keys(grib_accessor *a, long onlySubset, long
 int accessor_bufr_data_array_process_elements(grib_accessor *a, int flag, long onlySubset, long startSubset, long endSubset);
 grib_vsarray *accessor_bufr_data_array_get_stringValues(grib_accessor *a);
 grib_accessors_list *accessor_bufr_data_array_get_dataAccessors(grib_accessor *a);
+grib_trie *accessor_bufr_data_array_get_dataAccessorsTrie(grib_accessor *a);
 void accessor_bufr_data_array_set_unpackMode(grib_accessor *a, int unpackMode);
 
 /* grib_accessor_class_bufr_data_element.c */
@@ -296,7 +296,6 @@ void accessor_bufr_data_element_set_stringValues(grib_accessor *a, grib_vsarray
 void accessor_bufr_data_element_set_elementsDescriptorsIndex(grib_accessor *a, grib_viarray *elementsDescriptorsIndex);
 
 /* grib_accessor_class_bufr_elements_table.c */
-char **str_split(char *a_str, const char a_delim);
 int bufr_descriptor_is_marker(bufr_descriptor *d);
 bufr_descriptor *accessor_bufr_elements_table_get_descriptor(grib_accessor *a, int code, int *err);
 
@@ -306,6 +305,10 @@ bufr_descriptor *accessor_bufr_elements_table_get_descriptor(grib_accessor *a, i
 
 /* grib_accessor_class_pack_bufr_values.c */
 
+/* grib_accessor_class_bufr_extract_area_subsets.c */
+
+/* grib_accessor_class_bufr_extract_datetime_subsets.c */
+
 /* grib_accessor_class_group.c */
 
 /* grib_accessor_class_unpack_bufr_values.c */
@@ -359,7 +362,6 @@ void grib_smart_table_delete(grib_context *c);
 /* grib_accessor_class_smart_table_column.c */
 
 /* grib_accessor_class_codetable.c */
-int grib_strcasecmp(const char *s1, const char *s2);
 void grib_codetable_delete(grib_context *c);
 
 /* grib_accessor_class_codetable_units.c */
@@ -690,8 +692,6 @@ int grib_jasper_encode(grib_context *c, j2k_encode_helper *helper);
 /* grib_openjpeg_encoding.c */
 int grib_openjpeg_encode(grib_context *c, j2k_encode_helper *helper);
 int grib_openjpeg_decode(grib_context *c, unsigned char *buf, size_t *buflen, double *val, size_t *n_vals);
-int grib_openjpeg_decode(grib_context *c, unsigned char *buf, size_t *buflen, double *val, size_t *n_vals);
-int grib_openjpeg_encode(grib_context *c, j2k_encode_helper *helper);
 
 /* action_class_set_missing.c */
 grib_action *grib_action_create_set_missing(grib_context *context, const char *name);
@@ -770,6 +770,8 @@ long accessor_raw_get_offset(grib_accessor *a);
 
 /* grib_accessor_class_bufr_extract_subsets.c */
 
+/* grib_accessor_class_bufr_simple_thinning.c */
+
 /* grib_accessor_class_spd.c */
 
 /* grib_accessor_class_sum.c */
@@ -904,9 +906,25 @@ void grib_dump_footer(grib_dumper *d, grib_handle *h);
 
 /* grib_dumper_class_keys.c */
 
+/* grib_dumper_class_bufr_encode_C.c */
+
+/* grib_dumper_class_bufr_encode_filter.c */
+
+/* grib_dumper_class_bufr_encode_fortran.c */
+
+/* grib_dumper_class_bufr_encode_python.c */
+
+/* grib_dumper_class_bufr_decode_C.c */
+
+/* grib_dumper_class_bufr_decode_filter.c */
+
+/* grib_dumper_class_bufr_decode_fortran.c */
+
+/* grib_dumper_class_bufr_decode_python.c */
+
 /* grib_dumper_class_json.c */
 
-/* grib_dumper_class_xml.c */
+/* grib_dumper_class_grib_encode_C.c */
 
 /* grib_dumper_class_wmo.c */
 
@@ -916,7 +934,7 @@ void grib_dump_accessors_block(grib_dumper *dumper, grib_block_of_accessors *blo
 void grib_dump_accessors_list(grib_dumper *dumper, grib_accessors_list *al);
 int grib_print(grib_handle *h, const char *name, grib_dumper *d);
 void grib_dump_content(grib_handle *h, FILE *f, const char *mode, unsigned long option_flags, void *data);
-grib_dumper* grib_dump_content_with_dumper(grib_handle *h, grib_dumper* dumper,FILE *f, const char *mode, unsigned long option_flags, void *data);
+grib_dumper *grib_dump_content_with_dumper(grib_handle *h, grib_dumper *dumper, FILE *f, const char *mode, unsigned long option_flags, void *data);
 void codes_dump_bufr_flat(grib_accessors_list *al, grib_handle *h, FILE *f, const char *mode, unsigned long option_flags, void *data);
 
 /* grib_context.c */
@@ -930,6 +948,7 @@ void grib_context_set_debug(grib_context *c, int mode);
 void grib_context_set_logging_proc(grib_context *c, grib_log_proc p);
 long grib_get_api_version(void);
 void grib_print_api_version(FILE *out);
+const char *grib_get_package_name(void);
 grib_context *grib_context_get_default(void);
 char *grib_context_full_defs_path(grib_context *c, const char *basename);
 char *grib_samples_path(const grib_context *c);
@@ -938,6 +957,8 @@ void grib_context_free(const grib_context *c, void *p);
 void grib_context_free_persistent(const grib_context *c, void *p);
 void grib_context_reset(grib_context *c);
 void grib_context_delete(grib_context *c);
+void grib_context_set_definitions_path(grib_context *c, const char *path);
+void grib_context_set_samples_path(grib_context *c, const char *path);
 void *grib_context_malloc_persistent(const grib_context *c, size_t size);
 char *grib_context_strdup_persistent(const grib_context *c, const char *s);
 void *grib_context_malloc_clear_persistent(const grib_context *c, size_t size);
@@ -969,7 +990,7 @@ long grib_date_to_julian(long ddate);
 /* grib_fieldset.c */
 int grib_fieldset_new_column(grib_fieldset *set, int id, char *key, int type);
 int grib_fieldset_column_copy_from_handle(grib_handle *h, grib_fieldset *set, int i);
-grib_fieldset *grib_fieldset_new_from_files(grib_context *c, char *filenames[], int nfiles, char **keys, int nkeys, char *where_string, char *order_by_string, int *err);
+grib_fieldset *grib_fieldset_new_from_files(grib_context *c, char *filenames[], int nfiles, char **keys, int nkeys, const char *where_string, const char *order_by_string, int *err);
 int grib_fieldset_apply_where(grib_fieldset *set, const char *where_string);
 int grib_fieldset_apply_order_by(grib_fieldset *set, const char *order_by_string);
 void grib_fieldset_delete_order_by(grib_context *c, grib_order_by *order_by);
@@ -996,6 +1017,7 @@ void grib_file_delete(grib_file *file);
 
 /* grib_geography.c */
 int grib_get_gaussian_latitudes(long trunc, double *lats);
+int is_gaussian_global(double lat1, double lat2, double lon1, double lon2, long num_points_equator, const double *latitudes, double angular_precision);
 
 /* grib_handle.c */
 grib_section *grib_section_create(grib_handle *h, grib_accessor *owner);
@@ -1015,7 +1037,7 @@ grib_handle *codes_metar_handle_new_from_file(grib_context *c, FILE *f, int *err
 grib_handle *codes_gts_handle_new_from_file(grib_context *c, FILE *f, int *error);
 grib_handle *grib_handle_new_from_message_copy(grib_context *c, const void *data, size_t size);
 grib_handle *grib_handle_new_from_partial_message_copy(grib_context *c, const void *data, size_t size);
-grib_handle *grib_handle_new_from_partial_message(grib_context *c, void *data, size_t buflen);
+grib_handle *grib_handle_new_from_partial_message(grib_context *c, const void *data, size_t buflen);
 grib_handle *grib_handle_new_from_message(grib_context *c, const void *data, size_t buflen);
 grib_handle *grib_handle_new_from_multi_message(grib_context *c, void **data, size_t *buflen, int *error);
 grib_handle *grib_handle_new_from_file(grib_context *c, FILE *f, int *error);
@@ -1090,6 +1112,7 @@ int grib_count_in_file(grib_context *c, FILE *f, int *n);
 
 /* grib_trie.c */
 grib_trie *grib_trie_new(grib_context *c);
+void grib_trie_delete_container(grib_trie *t);
 void grib_trie_delete(grib_trie *t);
 void grib_trie_clear(grib_trie *t);
 void *grib_trie_insert(grib_trie *t, const char *key, void *data);
@@ -1121,6 +1144,15 @@ int grib_keys_iterator_get_string(grib_keys_iterator *kiter, char *v, size_t *le
 int grib_keys_iterator_get_bytes(grib_keys_iterator *kiter, unsigned char *v, size_t *len);
 int grib_keys_iterator_get_native_type(grib_keys_iterator *kiter);
 
+/* bufr_keys_iterator.c */
+grib_keys_iterator *codes_bufr_keys_iterator_new(grib_handle *h);
+grib_keys_iterator *codes_bufr_data_section_keys_iterator_new(grib_handle *h);
+int codes_bufr_keys_iterator_rewind(grib_keys_iterator *ki);
+int codes_bufr_keys_iterator_next(grib_keys_iterator *kiter);
+char *codes_bufr_keys_iterator_get_name(grib_keys_iterator *kiter);
+grib_accessor *codes_bufr_keys_iterator_get_accessor(grib_keys_iterator *kiter);
+int codes_bufr_keys_iterator_delete(grib_keys_iterator *kiter);
+
 /* grib_parse_utils.c */
 int grib_recompose_name(grib_handle *h, grib_accessor *observer, const char *uname, char *fname, int fail);
 int grib_accessor_print(grib_accessor *a, const char *name, int type, const char *format, const char *separator, int maxcols, int *newline, FILE *out);
@@ -1139,8 +1171,6 @@ grib_action *grib_parse_file(grib_context *gc, const char *filename);
 int grib_type_to_int(char id);
 
 /* grib_query.c */
-char *get_rank(const char *name, long *rank);
-char *get_condition(const char *name, codes_condition *condition);
 grib_accessors_list *grib_find_accessors_list(grib_handle *h, const char *name);
 char *grib_split_name_attribute(grib_context *c, const char *name, char *attribute_name);
 grib_accessor *grib_find_accessor(grib_handle *h, const char *name);
@@ -1187,7 +1217,7 @@ int grib_set_missing_internal(grib_handle *h, const char *name);
 int grib_set_missing(grib_handle *h, const char *name);
 int grib_is_missing_long(grib_accessor *a, long x);
 int grib_is_missing_double(grib_accessor *a, double x);
-int grib_is_missing_string(grib_accessor* a,unsigned char* x,size_t len);
+int grib_is_missing_string(grib_accessor *a, unsigned char *x, size_t len);
 int grib_accessor_is_missing(grib_accessor *a, int *err);
 int grib_is_missing(grib_handle *h, const char *name, int *err);
 int grib_is_defined(grib_handle *h, const char *name);
@@ -1237,6 +1267,7 @@ int grib_get_nearest_smaller_value(grib_handle *h, const char *name, double val,
 void grib_print_values(grib_values *values, int count);
 int grib_values_check(grib_handle *h, grib_values *values, int count);
 int grib_key_equal(grib_handle *h1, grib_handle *h2, const char *key, int type, int *err);
+int codes_copy_key(grib_handle *h1, grib_handle *h2, const char *key, int type);
 
 /* grib_errors.c */
 const char *grib_get_error_message(int code);
@@ -1363,7 +1394,6 @@ int grib_expression_evaluate_double(grib_handle *h, grib_expression *g, double *
 const char *grib_expression_evaluate_string(grib_handle *h, grib_expression *g, char *buf, size_t *size, int *err);
 const char *grib_expression_get_name(grib_expression *g);
 void grib_expression_print(grib_context *ctx, grib_expression *g, grib_handle *f);
-void grib_expression_compile(grib_expression *g, grib_compiler *f);
 void grib_expression_free(grib_context *ctx, grib_expression *g);
 void grib_expression_add_dependency(grib_expression *e, grib_accessor *observer);
 int grib_expression_set_value(grib_handle *h, grib_expression *g, grib_values *v);
@@ -1389,16 +1419,18 @@ int is_productDefinitionTemplateNumber_Chemical(long productDefinitionTemplateNu
 int is_productDefinitionTemplateNumber_Aerosol(long productDefinitionTemplateNumber);
 int is_index_file(const char *filename);
 char get_dir_separator_char(void);
-const char *extract_filename(const char *filepath);
-int is_gaussian_global(double lat1, double lat2, double lon1, double lon2, long num_points_equator, const double *latitudes, double angular_precision);
 char *codes_getenv(const char *name);
-int compute_key_rank(grib_handle* h, grib_string_list* keys, const char* key);
 
-/* compile.c */
-void grib_compile_flags(grib_compiler *c, long flags);
-void grib_compile_action_branch(grib_action *a, grib_compiler *c, char *name);
-void grib_compile_expression(grib_expression *e, grib_compiler *compiler);
-void grib_compile_arguments(grib_arguments *a, grib_compiler *compiler);
+/* bufr_util.c */
+int compute_bufr_key_rank(grib_handle *h, grib_string_list *keys, const char *key);
+char **codes_bufr_copy_data_return_copied_keys(grib_handle *hin, grib_handle *hout, size_t *nkeys, int *err);
+int codes_bufr_copy_data(grib_handle *hin, grib_handle *hout);
+
+/* string_util.c */
+int strcmp_nocase(const char *s1, const char *s2);
+void rtrim(char *s);
+const char *extract_filename(const char *filepath);
+char **string_split(char *inputString, const char *delimiter);
 
 /* functions.c */
 long grib_op_eq(long a, long b);
@@ -1435,6 +1467,13 @@ const char *grib_binop_double_proc_name(grib_binop_double_proc proc);
 const char *grib_unop_long_proc_name(grib_unop_long_proc proc);
 const char *grib_unop_double_proc_name(grib_unop_double_proc proc);
 
+/* codes_memfs.c */
+FILE *codes_fopen(const char *name, const char *mode);
+int codes_access(const char *name, int mode);
+
+/* grib_optimize_decimal_factor.c */
+int grib_optimize_decimal_factor(grib_accessor *a, const char *reference_value, const double pmax, const double pmin, const int knbit, const int compat_gribex, const int compat_32bit, long *kdec, long *kbin, double *ref);
+
 /* grib_api_version.c */
 const char *grib_get_git_sha1(void);
 
@@ -1453,8 +1492,3 @@ int grib_decode_double_array_complex(const unsigned char *p, long *bitp, long nb
 int grib_encode_long_array(size_t n_vals, const long *val, long bits_per_value, unsigned char *p, long *off);
 int grib_encode_double_array(size_t n_vals, const double *val, long bits_per_value, double reference_value, double d, double divisor, unsigned char *p, long *off);
 int grib_encode_double_array_complex(size_t n_vals, double *val, long nbits, double reference_value, double *scal, double d, double divisor, unsigned char *p, long *bitp);
-
-
-/* codes_memfs */
-FILE* codes_fopen(const char* name, const char* mode);
-int codes_access(const char* name, int mode);
diff --git a/src/grib_api_version.c b/src/grib_api_version.c
index 4c3b455..b1a97a5 100644
--- a/src/grib_api_version.c
+++ b/src/grib_api_version.c
@@ -1,3 +1,3 @@
 #include "grib_api_internal.h"
 
-const char * grib_get_git_sha1() { return ""; }
+const char * grib_get_git_sha1() { return "e289147972863677962a948542daae0d510fcf7f"; }
diff --git a/src/grib_bits.c b/src/grib_bits.c
index f975903..df54116 100644
--- a/src/grib_bits.c
+++ b/src/grib_bits.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_bits_any_endian.c b/src/grib_bits_any_endian.c
index 1a6cca0..4b37a9d 100644
--- a/src/grib_bits_any_endian.c
+++ b/src/grib_bits_any_endian.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -21,23 +21,27 @@ typedef struct bits_all_one_t {
 
 static bits_all_one_t bits_all_one={0,0,{0,}};
 
-static void init_bits_all_one() {
+static void init_bits_all_one()
+{
     int size=sizeof(long)*8;
     long* v=0;
     unsigned long cmask=-1;
     bits_all_one.size=size;
     bits_all_one.inited=1;
     v=bits_all_one.v+size;
-    *v= cmask << size;
+    /*
+     * The result of a shift operation is undefined if the RHS is negative or
+     * greater than or equal to the number of bits in the (promoted) shift-expression
+     */
+    /* *v= cmask << size; */
+    *v = -1;
     while (size>0)  *(--v)= ~(cmask << --size);
-
 }
 
-int grib_is_all_bits_one(long val, long nbits) {
-
+int grib_is_all_bits_one(long val, long nbits)
+{
     if (!bits_all_one.inited) init_bits_all_one();
     return bits_all_one.v[nbits]==val;
-
 }
 
 int grib_encode_string(const unsigned char* bitStream, long *bitOffset, size_t numberOfCharacters,char* string)
@@ -290,4 +294,3 @@ int grib_encode_unsigned_longb(unsigned char* p, unsigned long val ,long *bitp,
 #include "grib_bits_any_endian_simple.c"
 
 #endif
-
diff --git a/src/grib_bits_any_endian_omp.c b/src/grib_bits_any_endian_omp.c
index 01740ae..aaed6ab 100644
--- a/src/grib_bits_any_endian_omp.c
+++ b/src/grib_bits_any_endian_omp.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -12,128 +12,192 @@
  *   Enrico Fucile  - 19.06.2007                                           *
  *                                                                         *
  ***************************************************************************/
-
-
+/**
+ * decode an array of n_vals values from a octet-stream
+ *
+ * @param p input bitstream, for technical reasons put into octets
+ * @param bitp current position in the bitstream
+ * @param bitsPerValue number of bits needed to build a number (e.g. 8=byte, 16=short, 32=int, but also other sizes allowed)
+ * @param n_vals number of values to decode
+ * @param val output, values encoded as 32/64bit numbers
+ */
 int grib_decode_long_array(const unsigned char* p, long *bitp, long bitsPerValue,
-                             size_t n_vals,long* val) {
-  long i=0;
-  unsigned long lvalue = 0;
+        size_t n_vals,long* val)
+{
+    unsigned long mask = BIT_MASK(bitsPerValue);
 
-  if(bitsPerValue%8)
-  {
-    int j=0;
+    /* pi: position of bitp in p[]. >>3 == /8 */
+    long pi = *bitp / 8;
+    size_t i;
+    /* number of useful bits in current byte */
+    int usefulBitsInByte = 8-(*bitp & 7);
     for(i=0;i < n_vals;i++) {
-      lvalue=0;
-      for(j=0; j< bitsPerValue;j++){
-        lvalue <<= 1;
-        if(grib_get_bit( p, *bitp)) lvalue += 1;
-        *bitp += 1;
-      }
-      val[i] = lvalue;
+        /* read at least enough bits (byte by byte) from input */
+        long bitsToRead = bitsPerValue;
+        long ret = 0;
+        while (bitsToRead > 0) {
+            ret <<= 8;
+            /*   ret += p[pi];         */
+            /*   Assert( (ret & p[pi]) == 0 ); */
+            ret = ret | p[pi];
+            pi++;
+            bitsToRead -= usefulBitsInByte;
+            usefulBitsInByte = 8;
+        }
+        *bitp += bitsPerValue;
+        /*fprintf(stderr, "%d %d %d %d %d\n", bitsPerValue, *bitp, pi, ret, bitsToRead);*/
+        /* bitsToRead might now be negative (too many bits read) */
+        /* remove those which are too much */
+        ret >>= -1*bitsToRead;
+        /* remove leading bits (from previous value) */
+        ret &= mask;
+        val[i] = ret;
+
+        usefulBitsInByte = -1*bitsToRead; /* prepare for next round */
+        if (usefulBitsInByte > 0) {
+            pi--; /* reread the current byte */
+        } else {
+            usefulBitsInByte = 8; /* start with next full byte */
+        }
     }
-  }  else  {
-    int bc;
-    int l = bitsPerValue/8;
-    size_t o = *bitp/8;
-
-    for(i=0;i < n_vals;i++)
-    {
-      lvalue  = 0;
-      lvalue  <<= 8;
-      lvalue |= p[o++] ;
-
-      for ( bc=1; bc<l; bc++ )
-      {
-        lvalue <<= 8;
-        lvalue |= p[o++] ;
-      }
-      val[i] = lvalue;
-    }
-	*bitp+=bitsPerValue*n_vals;
-  }
-
-  return 0;
+    return 0;
 }
 
+/**
+ * decode an array of n_vals values from an octet-bitstream to double-representation
+ *
+ * @param p input bitstream, for technical reasons put into octets
+ * @param bitp current position in the bitstream
+ * @param bitsPerValue number of bits needed to build a number (e.g. 8=byte, 16=short, 32=int, but also other sizes allowed)
+ * @param n_vals number of values to decode
+ * @param val output, values encoded as 32/64bit numbers
+ */
 int grib_decode_double_array(const unsigned char* p, long *bitp, long bitsPerValue,
-                             double reference_value,double s,double d,
-                             size_t n_vals,double* val) {
-  long i=0;
-  unsigned long lvalue = 0;
+        double reference_value,double s,double d,
+        size_t n_vals,double* val)
+{
+    long i=0;
+    unsigned long lvalue = 0;
+    double x;
 
-  if(bitsPerValue%8)
-  {
+#if 0
+    /* slow reference code */
     int j=0;
     for(i=0;i < n_vals;i++) {
-      lvalue=0;
-      for(j=0; j< bitsPerValue;j++){
-        lvalue <<= 1;
-        if(grib_get_bit( p, *bitp)) lvalue += 1;
-        *bitp += 1;
-      }
-      val[i] = (double) (((lvalue*s)+reference_value)*d);
+        lvalue=0;
+        for(j=0; j< bitsPerValue;j++){
+            lvalue <<= 1;
+            if(grib_get_bit( p, *bitp)) lvalue += 1;
+            *bitp += 1;
+        }
+        x=((lvalue*s)+reference_value)*d;
+        val[i] = (double)x;
     }
-  }  else  {
-    int bc;
-    int l = bitsPerValue/8;
-    size_t o = 0;
-
-    for(i=0;i < n_vals;i++)
-    {
-      lvalue  = 0;
-      lvalue  <<= 8;
-      lvalue |= p[o++] ;
-
-      for ( bc=1; bc<l; bc++ )
-      {
-        lvalue <<= 8;
-        lvalue |= p[o++] ;
-      }
-      val[i] = (double) (((lvalue*s)+reference_value)*d);
+#endif
+    unsigned long mask = BIT_MASK(bitsPerValue);
+
+    /* pi: position of bitp in p[]. >>3 == /8 */
+    long pi = *bitp / 8;
+    /* some bits might of the current byte at pi might be used */
+    /* by the previous number usefulBitsInByte gives remaining unused bits */
+    /* number of useful bits in current byte */
+    int usefulBitsInByte = 8-(*bitp & 7);
+    for(i=0;i < n_vals;i++) {
+        /* value read as long */
+        long bitsToRead = 0;
+        lvalue  = 0;
+        bitsToRead = bitsPerValue;
+        /* read one byte after the other to lvalue until >= bitsPerValue are read */
+        while (bitsToRead > 0) {
+            lvalue  <<= 8;
+            lvalue += p[pi];
+            pi++;
+            bitsToRead -= usefulBitsInByte;
+            usefulBitsInByte = 8;
+        }
+        *bitp += bitsPerValue;
+        /* bitsToRead is now <= 0, remove the last bits */
+        lvalue >>= -1*bitsToRead;
+        /* set leading bits to 0 - removing bits used for previous number */
+        lvalue &= mask;
+
+        usefulBitsInByte = -1*bitsToRead; /* prepare for next round */
+        if (usefulBitsInByte > 0) {
+            pi--; /* reread the current byte */
+        } else {
+            usefulBitsInByte = 8; /* start with next full byte */
+        }
+        /* scaling and move value to output */
+        x=((lvalue*s)+reference_value)*d;
+        val[i] = (double)x;
     }
-  }
-
-  return 0;
+    return 0;
 }
 
+int grib_decode_double_array_complex(const unsigned char* p, long *bitp, long nbits,double reference_value,double s,double* d,size_t size,double* val)
+{
+    return GRIB_NOT_IMPLEMENTED;
+}
 
-
-int grib_decode_double_array_complex(const unsigned char* p, long *bitp, long nbits,double reference_value,double s,double* d,size_t size,double* val) {
-  return GRIB_NOT_IMPLEMENTED;
+int grib_encode_long_array(size_t n_vals,const long* val,long bits_per_value,unsigned char* p,long *off)
+{
+    size_t i=0;
+    unsigned long unsigned_val=0;
+    unsigned char *encoded=p;
+    if(bits_per_value%8){
+        for(i=0;i< n_vals;i++){
+            unsigned_val=val[i];
+            grib_encode_unsigned_longb(encoded, unsigned_val, off , bits_per_value);
+        }
+    } else{
+        for(i=0;i< n_vals;i++){
+            int blen=0;
+            blen = bits_per_value;
+            unsigned_val = val[i];
+            while(blen >= 8)
+            {
+                blen   -= 8;
+                *encoded = (unsigned_val >> blen);
+                encoded++;
+                *off+=8;
+            }
+        }
+    }
+    return GRIB_SUCCESS;
 }
 
 int grib_encode_double_array(size_t n_vals,const double* val,long bits_per_value,double reference_value,double d,double divisor,unsigned char* p,long *off)
 {
-  size_t i=0;
-  unsigned long unsigned_val=0;
-  unsigned char *encoded=p;
-  double x;
-  if(bits_per_value%8){
-    for(i=0;i< n_vals;i++){
-      x = (((val[i]*d)-reference_value)*divisor)+0.5;
-      unsigned_val = (unsigned long)x ;
-      grib_encode_unsigned_longb(encoded, unsigned_val, off , bits_per_value);
+    size_t i=0;
+    unsigned long unsigned_val=0;
+    unsigned char *encoded=p;
+    double x;
+    if(bits_per_value%8){
+        for(i=0;i< n_vals;i++){
+            x=(((val[i]*d)-reference_value)*divisor)+0.5;
+            unsigned_val = (unsigned long)x;
+            grib_encode_unsigned_longb(encoded, unsigned_val, off , bits_per_value);
+        }
+    } else{
+        for(i=0;i< n_vals;i++){
+            int blen=0;
+            blen = bits_per_value;
+            x = ((((val[i]*d)-reference_value)*divisor)+0.5);
+            unsigned_val = (unsigned long)x;
+            while(blen >= 8)
+            {
+                blen   -= 8;
+                *encoded = (unsigned_val >> blen);
+                encoded++;
+                *off+=8;
+            }
+        }
     }
-  } else{
-    for(i=0;i< n_vals;i++){
-    int blen=0;
-      blen = bits_per_value;
-      x = (((val[i]*d)-reference_value)*divisor)+0.5;
-      unsigned_val = (unsigned long)x;
-      while(blen >= 8)
-      {
-        blen   -= 8;
-        *encoded = (unsigned_val >> blen);
-        encoded++;
-        *off+=8;
-      }
-    }
-  }
-  return GRIB_SUCCESS;
+    return GRIB_SUCCESS;
 }
 
 int grib_encode_double_array_complex(size_t n_vals,double* val,long nbits,double reference_value,
-        double* scal,double d,double divisor,unsigned char* p,long *bitp) {
-  return GRIB_NOT_IMPLEMENTED;
+        double* scal,double d,double divisor,unsigned char* p,long *bitp)
+{
+    return GRIB_NOT_IMPLEMENTED;
 }
-
diff --git a/src/grib_bits_any_endian_simple.c b/src/grib_bits_any_endian_simple.c
index dd77aea..1eb25d3 100644
--- a/src/grib_bits_any_endian_simple.c
+++ b/src/grib_bits_any_endian_simple.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -94,42 +94,68 @@ int grib_decode_double_array(const unsigned char* p, long *bitp, long bitsPerVal
         val[i] = (double)x;
     }
 #endif
-    unsigned long mask = BIT_MASK(bitsPerValue);
+    if (bitsPerValue%8 == 0)
+    {
+        /* See ECC-386 */
+        int bc;
+        int l = bitsPerValue/8;
+        size_t o = 0;
 
-    /* pi: position of bitp in p[]. >>3 == /8 */
-    long pi = *bitp / 8;
-    /* some bits might of the current byte at pi might be used */
-    /* by the previous number usefulBitsInByte gives remaining unused bits */
-    /* number of useful bits in current byte */
-    int usefulBitsInByte = 8-(*bitp & 7);
-    for(i=0;i < n_vals;i++) {
-        /* value read as long */
-        long bitsToRead = 0;
-        lvalue  = 0;
-        bitsToRead = bitsPerValue;
-        /* read one byte after the other to lvalue until >= bitsPerValue are read */
-        while (bitsToRead > 0) {
+        for(i=0;i < n_vals;i++)
+        {
+            lvalue  = 0;
             lvalue  <<= 8;
-            lvalue += p[pi];
-            pi++;
-            bitsToRead -= usefulBitsInByte;
-            usefulBitsInByte = 8;
+            lvalue |= p[o++] ;
+
+            for ( bc=1; bc<l; bc++ )
+            {
+                lvalue <<= 8;
+                lvalue |= p[o++] ;
+            }
+            x=((lvalue*s)+reference_value)*d;
+            val[i] = (double)x;
+            /*  *bitp += bitsPerValue * n_vals; */
         }
-        *bitp += bitsPerValue;
-        /* bitsToRead is now <= 0, remove the last bits */
-        lvalue >>= -1*bitsToRead;
-        /* set leading bits to 0 - removing bits used for previous number */
-        lvalue &= mask;
+    }
+    else
+    {
+        unsigned long mask = BIT_MASK(bitsPerValue);
 
-        usefulBitsInByte = -1*bitsToRead; /* prepare for next round */
-        if (usefulBitsInByte > 0) {
-            pi--; /* reread the current byte */
-        } else {
-            usefulBitsInByte = 8; /* start with next full byte */
+        /* pi: position of bitp in p[]. >>3 == /8 */
+        long pi = *bitp / 8;
+        /* some bits might of the current byte at pi might be used */
+        /* by the previous number usefulBitsInByte gives remaining unused bits */
+        /* number of useful bits in current byte */
+        int usefulBitsInByte = 8-(*bitp & 7);
+        for(i=0;i < n_vals;i++) {
+            /* value read as long */
+            long bitsToRead = 0;
+            lvalue  = 0;
+            bitsToRead = bitsPerValue;
+            /* read one byte after the other to lvalue until >= bitsPerValue are read */
+            while (bitsToRead > 0) {
+                lvalue  <<= 8;
+                lvalue += p[pi];
+                pi++;
+                bitsToRead -= usefulBitsInByte;
+                usefulBitsInByte = 8;
+            }
+            *bitp += bitsPerValue;
+            /* bitsToRead is now <= 0, remove the last bits */
+            lvalue >>= -1*bitsToRead;
+            /* set leading bits to 0 - removing bits used for previous number */
+            lvalue &= mask;
+
+            usefulBitsInByte = -1*bitsToRead; /* prepare for next round */
+            if (usefulBitsInByte > 0) {
+                pi--; /* reread the current byte */
+            } else {
+                usefulBitsInByte = 8; /* start with next full byte */
+            }
+            /* scaling and move value to output */
+            x=((lvalue*s)+reference_value)*d;
+            val[i] = (double)x;
         }
-        /* scaling and move value to output */
-        x=((lvalue*s)+reference_value)*d;
-        val[i] = (double)x;
     }
     return 0;
 }
diff --git a/src/grib_bits_any_endian_vector.c b/src/grib_bits_any_endian_vector.c
index 0b95398..ade7976 100644
--- a/src/grib_bits_any_endian_vector.c
+++ b/src/grib_bits_any_endian_vector.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_bits_fast_big_endian.c b/src/grib_bits_fast_big_endian.c
index dacc996..bde7dc6 100644
--- a/src/grib_bits_fast_big_endian.c
+++ b/src/grib_bits_fast_big_endian.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_bits_fast_big_endian_omp.c b/src/grib_bits_fast_big_endian_omp.c
index ed0d136..1f988a7 100644
--- a/src/grib_bits_fast_big_endian_omp.c
+++ b/src/grib_bits_fast_big_endian_omp.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_bits_fast_big_endian_simple.c b/src/grib_bits_fast_big_endian_simple.c
index 2816d63..68f9429 100644
--- a/src/grib_bits_fast_big_endian_simple.c
+++ b/src/grib_bits_fast_big_endian_simple.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_bits_fast_big_endian_vector.c b/src/grib_bits_fast_big_endian_vector.c
index 5d35e50..a85c3a0 100644
--- a/src/grib_bits_fast_big_endian_vector.c
+++ b/src/grib_bits_fast_big_endian_vector.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_bits_ibmpow.c b/src/grib_bits_ibmpow.c
index d13d46d..65155b2 100644
--- a/src/grib_bits_ibmpow.c
+++ b/src/grib_bits_ibmpow.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_bits_ibmpow_opt.c b/src/grib_bits_ibmpow_opt.c
index d008b36..6a86226 100644
--- a/src/grib_bits_ibmpow_opt.c
+++ b/src/grib_bits_ibmpow_opt.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_box.c b/src/grib_box.c
index 06e6ba7..8d27402 100644
--- a/src/grib_box.c
+++ b/src/grib_box.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_box_class.c b/src/grib_box_class.c
index cf8147d..c95eae4 100644
--- a/src/grib_box_class.c
+++ b/src/grib_box_class.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_box_class_gen.c b/src/grib_box_class_gen.c
index 5848ba8..a932a5f 100644
--- a/src/grib_box_class_gen.c
+++ b/src/grib_box_class_gen.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_box_class_reduced_gaussian.c b/src/grib_box_class_reduced_gaussian.c
index d575f7f..1639263 100644
--- a/src/grib_box_class_reduced_gaussian.c
+++ b/src/grib_box_class_reduced_gaussian.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_box_class_regular_gaussian.c b/src/grib_box_class_regular_gaussian.c
index 304b546..f9794ee 100644
--- a/src/grib_box_class_regular_gaussian.c
+++ b/src/grib_box_class_regular_gaussian.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_buffer.c b/src/grib_buffer.c
index a2db7ad..84e0364 100644
--- a/src/grib_buffer.c
+++ b/src/grib_buffer.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -246,8 +246,12 @@ void grib_buffer_replace( grib_accessor *a, const unsigned char* data,
                 message_length - offset - oldsize);
 
     /* copy new data */
-
-    memcpy(buffer->data + offset, data, newsize);
+    DebugAssert( buffer->data + offset );
+    DebugAssert( data || (newsize==0) );/* if data==NULL then newsize must be 0 */
+    if (data) {
+        /* Note: memcpy behaviour is undefined if either dest or src is NULL */
+        memcpy(buffer->data + offset, data, newsize);
+    }
 
     if(increase)
     {
diff --git a/src/grib_bufr_descriptor.c b/src/grib_bufr_descriptor.c
index cc7268e..0c062e2 100644
--- a/src/grib_bufr_descriptor.c
+++ b/src/grib_bufr_descriptor.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_bufr_descriptors_array.c b/src/grib_bufr_descriptors_array.c
index 960f85f..0773bf9 100644
--- a/src/grib_bufr_descriptors_array.c
+++ b/src/grib_bufr_descriptors_array.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -11,28 +11,28 @@
 #include "grib_api_internal.h"
 
 bufr_descriptors_array* grib_bufr_descriptors_array_new(grib_context* c,size_t size,size_t incsize) {
-  bufr_descriptors_array* v=NULL;
-
-  if (!c) c=grib_context_get_default();
-
-  v=(bufr_descriptors_array*)grib_context_malloc(c,sizeof(bufr_descriptors_array));
-  if (!v) {
-    grib_context_log(c,GRIB_LOG_ERROR,
-          "bufr_descriptors_array_new unable to allocate %d bytes\n",sizeof(bufr_descriptors_array));
-    return NULL;
-  }
-  v->context=c;
-  v->size=size;
-  v->n=0;
-  v->incsize=incsize;
-  v->v=(bufr_descriptor**)grib_context_malloc(c,sizeof(bufr_descriptor*)*size);
-  v->number_of_pop_front=0;
-  if (!v->v) {
-    grib_context_log(c,GRIB_LOG_ERROR,
-          "grib_bufr_descriptors_array_new unable to allocate %d bytes\n",sizeof(bufr_descriptor)*size);
-    return NULL;
-  }
-  return v;
+    bufr_descriptors_array* v=NULL;
+
+    if (!c) c=grib_context_get_default();
+
+    v=(bufr_descriptors_array*)grib_context_malloc(c,sizeof(bufr_descriptors_array));
+    if (!v) {
+        grib_context_log(c,GRIB_LOG_ERROR,
+                "bufr_descriptors_array_new unable to allocate %d bytes\n",sizeof(bufr_descriptors_array));
+        return NULL;
+    }
+    v->context=c;
+    v->size=size;
+    v->n=0;
+    v->incsize=incsize;
+    v->v=(bufr_descriptor**)grib_context_malloc(c,sizeof(bufr_descriptor*)*size);
+    v->number_of_pop_front=0;
+    if (!v->v) {
+        grib_context_log(c,GRIB_LOG_ERROR,
+                "grib_bufr_descriptors_array_new unable to allocate %d bytes\n",sizeof(bufr_descriptor)*size);
+        return NULL;
+    }
+    return v;
 }
 
 bufr_descriptor* grib_bufr_descriptors_array_pop(bufr_descriptors_array* a) {
@@ -51,126 +51,126 @@ bufr_descriptor* grib_bufr_descriptors_array_pop_front(bufr_descriptors_array* a
 }
 
 bufr_descriptors_array* grib_bufr_descriptors_array_resize_to(bufr_descriptors_array* v,size_t newsize) {
-  bufr_descriptor** newv;
-  size_t i;
-  grib_context* c=v->context;
+    bufr_descriptor** newv;
+    size_t i;
+    grib_context* c=v->context;
 
-  if (newsize<v->size) return v;
+    if (newsize<v->size) return v;
 
-  if (!c) c=grib_context_get_default();
+    if (!c) c=grib_context_get_default();
 
-  newv=(bufr_descriptor**)grib_context_malloc_clear(c,newsize*sizeof(bufr_descriptor*));
-  if (!newv) {
-    grib_context_log(c,GRIB_LOG_ERROR,
-          "grib_bufr_descriptors_array_resize unable to allocate %d bytes\n",sizeof(bufr_descriptor*)*newsize);
-    return NULL;
-  }
+    newv=(bufr_descriptor**)grib_context_malloc_clear(c,newsize*sizeof(bufr_descriptor*));
+    if (!newv) {
+        grib_context_log(c,GRIB_LOG_ERROR,
+                "grib_bufr_descriptors_array_resize unable to allocate %d bytes\n",sizeof(bufr_descriptor*)*newsize);
+        return NULL;
+    }
 
-  for (i=0;i<v->n;i++) newv[i]=v->v[i];
+    for (i=0;i<v->n;i++) newv[i]=v->v[i];
 
-  v->v-=v->number_of_pop_front;
-  grib_context_free(c,v->v);
+    v->v-=v->number_of_pop_front;
+    grib_context_free(c,v->v);
 
-  v->v=newv;
-  v->size=newsize;
-  v->number_of_pop_front=0;
+    v->v=newv;
+    v->size=newsize;
+    v->number_of_pop_front=0;
 
-  return v;
+    return v;
 }
 
 bufr_descriptors_array* grib_bufr_descriptors_array_resize(bufr_descriptors_array* v) {
-  int newsize=v->incsize+v->size;
+    int newsize=v->incsize+v->size;
 
-  return grib_bufr_descriptors_array_resize_to(v,newsize);
+    return grib_bufr_descriptors_array_resize_to(v,newsize);
 }
 
 bufr_descriptors_array* grib_bufr_descriptors_array_push(bufr_descriptors_array* v,bufr_descriptor* val) {
-  size_t start_size=100;
-  size_t start_incsize=100;
+    size_t start_size=100;
+    size_t start_incsize=100;
 
-  if (!v) v=grib_bufr_descriptors_array_new(0,start_size,start_incsize);
+    if (!v) v=grib_bufr_descriptors_array_new(0,start_size,start_incsize);
 
-  if (v->n >= v->size-v->number_of_pop_front)
-    v=grib_bufr_descriptors_array_resize(v);
+    if (v->n >= v->size-v->number_of_pop_front)
+        v=grib_bufr_descriptors_array_resize(v);
 
-  v->v[v->n]=val;
-  v->n++;
-  return v;
+    v->v[v->n]=val;
+    v->n++;
+    return v;
 }
 
 bufr_descriptors_array* grib_bufr_descriptors_array_append(bufr_descriptors_array* v,bufr_descriptors_array* ar) {
-  size_t start_size=100;
-  size_t start_incsize=100;
-  size_t i;
-  bufr_descriptor* vv=0;
+    size_t start_size=100;
+    size_t start_incsize=100;
+    size_t i;
+    bufr_descriptor* vv=0;
 
-  if (!v) v=grib_bufr_descriptors_array_new(0,start_size,start_incsize);
+    if (!v) v=grib_bufr_descriptors_array_new(0,start_size,start_incsize);
 
-  for (i=0;i<ar->n;i++) {
-    vv=grib_bufr_descriptor_clone(ar->v[i]);
-    grib_bufr_descriptors_array_push(v,vv);
-  }
+    for (i=0;i<ar->n;i++) {
+        vv=grib_bufr_descriptor_clone(ar->v[i]);
+        grib_bufr_descriptors_array_push(v,vv);
+    }
 
-  grib_bufr_descriptors_array_delete(ar);
-  ar=0;
+    grib_bufr_descriptors_array_delete(ar);
+    ar=0;
 
-  return v;
+    return v;
 }
 
 bufr_descriptors_array* grib_bufr_descriptors_array_push_front(bufr_descriptors_array* v,bufr_descriptor* val) {
-  size_t start_size=100;
-  size_t start_incsize=100;
-  int i;
-  if (!v) v=grib_bufr_descriptors_array_new(0,start_size,start_incsize);
-
-  if (v->number_of_pop_front) {
-    v->v--;
-    v->number_of_pop_front--;
-  } else {
-    if (v->n >= v->size) v=grib_bufr_descriptors_array_resize(v);
-    for (i=v->n;i>0;i--) v[i]=v[i-1];
-  }
-  v->v[0]=val;
-  v->n++;
-
-  return v;
+    size_t start_size=100;
+    size_t start_incsize=100;
+    int i;
+    if (!v) v=grib_bufr_descriptors_array_new(0,start_size,start_incsize);
+
+    if (v->number_of_pop_front) {
+        v->v--;
+        v->number_of_pop_front--;
+    } else {
+        if (v->n >= v->size) v=grib_bufr_descriptors_array_resize(v);
+        for (i=v->n;i>0;i--) v[i]=v[i-1];
+    }
+    v->v[0]=val;
+    v->n++;
+
+    return v;
 }
 
 bufr_descriptor* grib_bufr_descriptors_array_get(bufr_descriptors_array* a,size_t i) {
-  return a->v[i];
+    return a->v[i];
 }
 
 void grib_bufr_descriptors_array_set(bufr_descriptors_array* a,size_t i,bufr_descriptor* v) {
-  a->v[i]=v;
+    a->v[i]=v;
 }
 
 void grib_bufr_descriptors_array_delete(bufr_descriptors_array* v) {
-  grib_context* c;
+    grib_context* c;
 
-  if (!v) return;
-  c=v->context;
+    if (!v) return;
+    c=v->context;
 
-  grib_bufr_descriptors_array_delete_array(v);
+    grib_bufr_descriptors_array_delete_array(v);
 
-  grib_context_free(c,v);
+    grib_context_free(c,v);
 }
 
 void grib_bufr_descriptors_array_delete_array(bufr_descriptors_array* v) {
-  grib_context* c;
-  int i;
-  bufr_descriptor** vv=NULL;
-
-  if (!v) return;
-  c=v->context;
-
-  if (v->v) {
-    vv=v->v;
-    for (i=0;i<v->n;i++) {
-      grib_bufr_descriptor_delete(vv[i]);
+    grib_context* c;
+    int i;
+    bufr_descriptor** vv=NULL;
+
+    if (!v) return;
+    c=v->context;
+
+    if (v->v) {
+        vv=v->v;
+        for (i=0;i<v->n;i++) {
+            grib_bufr_descriptor_delete(vv[i]);
+        }
+        vv = v->v - v->number_of_pop_front;
+        grib_context_free(c,vv);
     }
-    vv = v->v - v->number_of_pop_front;
-    grib_context_free(c,vv);
-  }
 }
 
 bufr_descriptor** grib_bufr_descriptors_array_get_array(bufr_descriptors_array* v) {
diff --git a/src/grib_compressor.c b/src/grib_compressor.c
index ead1739..15cbde1 100644
--- a/src/grib_compressor.c
+++ b/src/grib_compressor.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_concept.c b/src/grib_concept.c
index 64f9589..f614682 100644
--- a/src/grib_concept.c
+++ b/src/grib_concept.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_concept_index.c b/src/grib_concept_index.c
index 24d7685..c0fa62b 100644
--- a/src/grib_concept_index.c
+++ b/src/grib_concept_index.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_context.c b/src/grib_context.c
index 0015b8d..ee19173 100644
--- a/src/grib_context.c
+++ b/src/grib_context.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -264,6 +264,11 @@ void grib_print_api_version(FILE* out)
     */
 }
 
+const char* grib_get_package_name()
+{
+    return "ecCodes";
+}
+
 static grib_context default_grib_context = {
         0,                            /* inited                     */
         0,                            /* debug                      */
@@ -340,6 +345,7 @@ static grib_context default_grib_context = {
         0,                            /* ieee_packing               */
         0,                            /* unpack                     */
         0,                            /* bufrdc_mode                */
+        0,                            /* bufr_set_to_missing_if_out_of_range */
         0,                            /* log_stream                 */
         0,                            /* classes                    */
         0                             /* lists                      */
@@ -374,10 +380,12 @@ grib_context* grib_context_get_default()
         const char* no_spd = NULL;
         const char* keep_matrix = NULL;
         const char* bufrdc_mode = NULL;
+        const char* bufr_set_to_missing_if_out_of_range = NULL;
         const char* nounpack = NULL;
 
         write_on_fail = codes_getenv("ECCODES_GRIB_WRITE_ON_FAIL");
         bufrdc_mode = codes_getenv("ECCODES_BUFRDC_MODE_ON");
+        bufr_set_to_missing_if_out_of_range = codes_getenv("ECCODES_BUFR_SET_TO_MISSING_IF_OUT_OF_RANGE");
         large_constant_fields = codes_getenv("ECCODES_GRIB_LARGE_CONSTANT_FIELDS");
         no_abort = codes_getenv("ECCODES_NO_ABORT");
         debug = codes_getenv("ECCODES_DEBUG");
@@ -473,6 +481,7 @@ grib_context* grib_context_get_default()
         default_grib_context.lists=grib_trie_new(&(default_grib_context));
         default_grib_context.classes=grib_trie_new(&(default_grib_context));
         default_grib_context.bufrdc_mode = bufrdc_mode ? atoi(bufrdc_mode) : 0;
+        default_grib_context.bufr_set_to_missing_if_out_of_range = bufr_set_to_missing_if_out_of_range ? atoi(bufr_set_to_missing_if_out_of_range) : 0;
     }
 
     GRIB_MUTEX_UNLOCK(&mutex_c);
diff --git a/src/grib_darray.c b/src/grib_darray.c
index 90c7463..9f7fa47 100644
--- a/src/grib_darray.c
+++ b/src/grib_darray.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -93,14 +93,14 @@ double* grib_darray_get_array(grib_context* c,grib_darray* v) {
   return ret;
 }
 
-int grib_darray_is_constant(grib_darray* v) {
+int grib_darray_is_constant(grib_darray* v,double eps) {
   int i;
   double val;
   if (v->n == 1) return 1;
 
   val=v->v[0];
   for (i=1;i<v->n;i++)  {
-    if (val!=v->v[i]) return 0;
+    if (fabs(val-v->v[i]) > eps) return 0;
   }
   return 1;
 }
diff --git a/src/grib_date.c b/src/grib_date.c
index e399a08..0bf6f25 100644
--- a/src/grib_date.c
+++ b/src/grib_date.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_db.c b/src/grib_db.c
index d55128d..ffe5b32 100644
--- a/src/grib_db.c
+++ b/src/grib_db.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_dependency.c b/src/grib_dependency.c
index 7cb850e..88f2bd6 100644
--- a/src/grib_dependency.c
+++ b/src/grib_dependency.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_dumper.c b/src/grib_dumper.c
index 9ccbb32..56602ec 100644
--- a/src/grib_dumper.c
+++ b/src/grib_dumper.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_dumper_class.c b/src/grib_dumper_class.c
index b377329..54edcb0 100644
--- a/src/grib_dumper_class.c
+++ b/src/grib_dumper_class.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -64,12 +64,9 @@ void grib_dump_accessors_block(grib_dumper* dumper,grib_block_of_accessors* bloc
 void grib_dump_accessors_list(grib_dumper* dumper,grib_accessors_list* al)
 {
     grib_accessors_list* cur=al;
-    grib_accessors_list* next=al->next;
-
-    while(next) {
+    while(cur) {
         grib_accessor_dump(cur->accessor,dumper);
-        cur=next;
-        next=cur->next;
+        cur = cur->next;
     }
 }
 
diff --git a/src/grib_dumper_class.h b/src/grib_dumper_class.h
index 531d72a..fb95eb3 100644
--- a/src/grib_dumper_class.h
+++ b/src/grib_dumper_class.h
@@ -17,4 +17,3 @@ extern grib_dumper_class* grib_dumper_class_keys;
 extern grib_dumper_class* grib_dumper_class_serialize;
 extern grib_dumper_class* grib_dumper_class_string;
 extern grib_dumper_class* grib_dumper_class_wmo;
-extern grib_dumper_class* grib_dumper_class_xml;
diff --git a/src/grib_dumper_class_bufr_decode_C.c b/src/grib_dumper_class_bufr_decode_C.c
index 6b0c225..89d67ea 100644
--- a/src/grib_dumper_class_bufr_decode_C.c
+++ b/src/grib_dumper_class_bufr_decode_C.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -122,7 +122,7 @@ static int init(grib_dumper* d)
     d->count=1;
     self->isLeaf=0;
     self->isAttribute=0;
-    self->keys=grib_context_malloc_clear(c,sizeof(grib_string_list));
+    self->keys=(grib_string_list*)grib_context_malloc_clear(c,sizeof(grib_string_list));
 
     return GRIB_SUCCESS;
 }
@@ -144,7 +144,7 @@ static int destroy(grib_dumper* d)
 
 static char* dval_to_string(grib_context* c, double v)
 {
-    char* sval=grib_context_malloc_clear(c,sizeof(char)*40);
+    char* sval=(char*)grib_context_malloc_clear(c,sizeof(char)*40);
     sprintf(sval,"%.18e",v);
     return sval;
 }
@@ -177,16 +177,16 @@ static void dump_values(grib_dumper* d, grib_accessor* a)
         fprintf(self->dumper.out,"  free(dValues);\n");
         fprintf(self->dumper.out,"  dValues = (double*)malloc(%lu*sizeof(double));\n", (unsigned long)size);
         fprintf(self->dumper.out,"  if (!dValues) { fprintf(stderr, \"Failed to allocate memory (dValues).\\n\"); return 1; }\n");
-        fprintf(self->dumper.out,"  size = %lu;\n", size);
+        fprintf(self->dumper.out,"  size = %lu;\n", (unsigned long)size);
 
         depth-=2;
 
-        if ((r=compute_key_rank(h,self->keys,a->name))!=0)
+        if ((r=compute_bufr_key_rank(h,self->keys,a->name))!=0)
             fprintf(self->dumper.out,"  CODES_CHECK(codes_get_double_array(h, \"#%d#%s\",dValues, &size), 0);\n", r, a->name);
         else
             fprintf(self->dumper.out,"  CODES_CHECK(codes_get_double_array(h, \"%s\", dValues, &size), 0);\n",a->name);
     } else {
-        r=compute_key_rank(h,self->keys,a->name);
+        r=compute_bufr_key_rank(h,self->keys,a->name);
         if( !grib_is_missing_double(a,value) ) {
 
             sval=dval_to_string(c,value);
@@ -204,7 +204,7 @@ static void dump_values(grib_dumper* d, grib_accessor* a)
         int dofree=0;
 
         if (r!=0) {
-            prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+            prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
             dofree=1;
             sprintf(prefix,"#%d#%s",r,a->name);
         } else prefix=(char*)a->name;
@@ -243,13 +243,13 @@ static void dump_values_attribute(grib_dumper* d, grib_accessor* a, const char*
         fprintf(self->dumper.out,"  free(dValues);\n");
         fprintf(self->dumper.out,"  dValues = (double*)malloc(%lu*sizeof(double));\n", (unsigned long)size);
         fprintf(self->dumper.out,"  if (!dValues) { fprintf(stderr, \"Failed to allocate memory (dValues).\\n\"); return 1; }\n");
-        fprintf(self->dumper.out,"  size = %lu\n;", size);
+        fprintf(self->dumper.out,"  size = %lu\n;", (unsigned long)size);
 
         depth-=2;
 
         fprintf(self->dumper.out,"  CODES_CHECK(codes_get_double_array(h, \"%s->%s\", dValues, &size), 0);\n", prefix,a->name);
     } else {
-        /* int r=compute_key_rank(h,self->keys,a->name); */
+        /* int r=compute_bufr_key_rank(h,self->keys,a->name); */
         if( !grib_is_missing_double(a,value) ) {
 
             sval=dval_to_string(c,value);
@@ -263,7 +263,7 @@ static void dump_values_attribute(grib_dumper* d, grib_accessor* a, const char*
     if (self->isLeaf==0) {
         char* prefix1;
 
-        prefix1=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+strlen(prefix)+5));
+        prefix1=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+strlen(prefix)+5));
         sprintf(prefix1,"%s->%s",prefix,a->name);
 
         dump_attributes(d,a,prefix1);
@@ -295,9 +295,9 @@ static void dump_long(grib_dumper* d,grib_accessor* a, const char* comment)
             char* prefix;
             int dofree=0;
 
-            r=compute_key_rank(h,self->keys,a->name);
+            r=compute_bufr_key_rank(h,self->keys,a->name);
             if (r!=0) {
-                prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+                prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
                 dofree=1;
                 sprintf(prefix,"#%d#%s",r,a->name);
             } else prefix=(char*)a->name;
@@ -320,17 +320,17 @@ static void dump_long(grib_dumper* d,grib_accessor* a, const char* comment)
         fprintf(self->dumper.out,"  free(iValues);\n");
         fprintf(self->dumper.out,"  iValues = (long*)malloc(%lu*sizeof(long));\n", (unsigned long)size);
         fprintf(self->dumper.out,"  if (!iValues) { fprintf(stderr, \"Failed to allocate memory (iValues).\\n\"); return 1; }\n");
-        fprintf(self->dumper.out,"  size = %lu;\n", size);
+        fprintf(self->dumper.out,"  size = %lu;\n", (unsigned long)size);
 
         depth-=2;
 
-        if ((r=compute_key_rank(h,self->keys,a->name))!=0)
+        if ((r=compute_bufr_key_rank(h,self->keys,a->name))!=0)
             fprintf(self->dumper.out,"  CODES_CHECK(codes_get_long_array(h, \"#%d#%s\", iValues, &size), 0);\n",r,a->name);
         else
             fprintf(self->dumper.out,"  CODES_CHECK(codes_get_long_array(h, \"%s\", iValues, &size), 0);\n",a->name);
 
     } else {
-        r=compute_key_rank(h,self->keys,a->name);
+        r=compute_bufr_key_rank(h,self->keys,a->name);
         if( !grib_is_missing_long(a,value) ) {
             if (r!=0)
                 fprintf(self->dumper.out,"  CODES_CHECK(codes_get_long(h, \"#%d#%s\", &iVal), 0);\n", r,a->name);
@@ -344,7 +344,7 @@ static void dump_long(grib_dumper* d,grib_accessor* a, const char* comment)
         int dofree=0;
 
         if (r!=0) {
-            prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+            prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
             dofree=1;
             sprintf(prefix,"#%d#%s",r,a->name);
         } else prefix=(char*)a->name;
@@ -381,14 +381,14 @@ static void dump_long_attribute(grib_dumper* d, grib_accessor* a, const char* pr
         fprintf(self->dumper.out,"  free(iValues);\n");
         fprintf(self->dumper.out,"  iValues = (long*)malloc(%lu*sizeof(long));\n", (unsigned long)size);
         fprintf(self->dumper.out,"  if (!iValues) { fprintf(stderr, \"Failed to allocate memory (iValues).\\n\"); return 1; }\n");
-        fprintf(self->dumper.out,"  size = %lu;\n", size);
+        fprintf(self->dumper.out,"  size = %lu;\n", (unsigned long)size);
 
         depth-=2;
 
         fprintf(self->dumper.out,"  CODES_CHECK(codes_get_long_array(h, \"%s->%s\", iValues, &size), 0);\n", prefix,a->name);
 
     } else {
-        /* int r=compute_key_rank(h,self->keys,a->name); */
+        /* int r=compute_bufr_key_rank(h,self->keys,a->name); */
         if( !grib_is_missing_long(a,value) ) {
             fprintf(self->dumper.out,"  CODES_CHECK(codes_get_long(h, \"%s->%s\", &iVal), 0);\n", prefix,a->name);
         }
@@ -397,7 +397,7 @@ static void dump_long_attribute(grib_dumper* d, grib_accessor* a, const char* pr
     if (self->isLeaf==0) {
         char* prefix1;
 
-        prefix1=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+strlen(prefix)+5));
+        prefix1=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+strlen(prefix)+5));
         sprintf(prefix1,"%s->%s",prefix,a->name);
 
         dump_attributes(d,a,prefix1);
@@ -427,7 +427,7 @@ static void dump_double(grib_dumper* d, grib_accessor* a, const char* comment)
 
     self->empty=0;
 
-    r=compute_key_rank(h,self->keys,a->name);
+    r=compute_bufr_key_rank(h,self->keys,a->name);
     if( !grib_is_missing_double(a,value) ) {
         sval=dval_to_string(c,value);
         if (r!=0)
@@ -443,7 +443,7 @@ static void dump_double(grib_dumper* d, grib_accessor* a, const char* comment)
         int dofree=0;
 
         if (r!=0) {
-            prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+            prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
             dofree=1;
             sprintf(prefix,"#%d#%s",r,a->name);
         } else prefix=(char*)a->name;
@@ -481,7 +481,7 @@ static void dump_string_array(grib_dumper* d, grib_accessor* a, const char* comm
     fprintf(self->dumper.out,"  free(sValues);\n");
     fprintf(self->dumper.out,"  sValues = (char**)malloc(%lu * sizeof(char*));\n", (unsigned long)size);
     fprintf(self->dumper.out,"  if (!sValues) { fprintf(stderr, \"Failed to allocate memory (sValues).\\n\"); return 1; }\n");
-    fprintf(self->dumper.out,"  size = %lu;\n", size);
+    fprintf(self->dumper.out,"  size = %lu;\n", (unsigned long)size);
 
     self->empty=0;
     values=(char**)grib_context_malloc_clear(c,size*sizeof(char*));
@@ -493,7 +493,7 @@ static void dump_string_array(grib_dumper* d, grib_accessor* a, const char* comm
     err = grib_unpack_string_array(a,values,&size);
 
     if (self->isLeaf==0) {
-        if ((r=compute_key_rank(h,self->keys,a->name))!=0)
+        if ((r=compute_bufr_key_rank(h,self->keys,a->name))!=0)
             fprintf(self->dumper.out,"  codes_get_string_array(h, \"#%d#%s\", sValues, &size);\n",r,a->name);
         else
             fprintf(self->dumper.out,"  codes_get_string_array(h, \"%s\", sValues, &size);\n",a->name);
@@ -504,7 +504,7 @@ static void dump_string_array(grib_dumper* d, grib_accessor* a, const char* comm
         int dofree=0;
 
         if (r!=0) {
-            prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+            prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
             dofree=1;
             sprintf(prefix,"#%d#%s",r,a->name);
         } else prefix=(char*)a->name;
@@ -545,7 +545,7 @@ static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment)
 
     err = grib_unpack_string(a,value,&size);
     p=value;
-    r=compute_key_rank(h,self->keys,a->name);
+    r=compute_bufr_key_rank(h,self->keys,a->name);
     if (grib_is_missing_string(a,(unsigned char *)value,size))
         return;
 
@@ -565,7 +565,7 @@ static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment)
         int dofree=0;
 
         if (r!=0) {
-            prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+            prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
             dofree=1;
             sprintf(prefix,"#%d#%s",r,a->name);
         } else prefix=(char*)a->name;
@@ -595,7 +595,7 @@ static void _dump_long_array(grib_handle* h, FILE* f, const char* key, const cha
     fprintf(f,"  free(iValues);\n");
     fprintf(f,"  iValues = (long*)malloc(%lu*sizeof(long));\n", (unsigned long)size);
     fprintf(f,"  if (!iValues) { fprintf(stderr, \"Failed to allocate memory (iValues).\\n\"); return 1; }\n");
-    fprintf(f,"  size = %lu;", size);
+    fprintf(f,"  size = %lu;", (unsigned long)size);
 
     fprintf(f,"  CODES_CHECK(codes_get_long_array(h, \"%s\", iValues, &size), 0);\n",print_key);
 }
diff --git a/src/grib_dumper_class_bufr_decode_filter.c b/src/grib_dumper_class_bufr_decode_filter.c
index 7bbcb21..4dcd27c 100644
--- a/src/grib_dumper_class_bufr_decode_filter.c
+++ b/src/grib_dumper_class_bufr_decode_filter.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -120,7 +120,7 @@ static int init(grib_dumper* d)
     self->empty=1;
     self->isLeaf=0;
     self->isAttribute=0;
-    self->keys=grib_context_malloc_clear(c,sizeof(grib_string_list));
+    self->keys=(grib_string_list*)grib_context_malloc_clear(c,sizeof(grib_string_list));
 
     return GRIB_SUCCESS;
 }
@@ -164,13 +164,13 @@ static void dump_values(grib_dumper* d, grib_accessor* a)
     self->empty=0;
 
     if (size>1) {
-        if ((r=compute_key_rank(h,self->keys,a->name))!=0)
+        if ((r=compute_bufr_key_rank(h,self->keys,a->name))!=0)
             fprintf(self->dumper.out,"print \"#%d#%s=[#%d#%s]\";\n", r, a->name, r, a->name);
         else
             fprintf(self->dumper.out,"print \"%s=[%s]\";\n", a->name, a->name);
 
     } else {
-        r=compute_key_rank(h,self->keys,a->name);
+        r=compute_bufr_key_rank(h,self->keys,a->name);
         if( !grib_is_missing_double(a,value) ) {
 
             if (r!=0)
@@ -185,7 +185,7 @@ static void dump_values(grib_dumper* d, grib_accessor* a)
         int dofree=0;
 
         if (r!=0) {
-            prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+            prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
             dofree=1;
             sprintf(prefix,"#%d#%s",r,a->name);
         } else prefix=(char*)a->name;
@@ -227,7 +227,7 @@ static void dump_values_attribute(grib_dumper* d,grib_accessor* a, const char* p
     }
 
     if (self->isLeaf==0) {
-        char* prefix1 = grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+strlen(prefix)+5));
+        char* prefix1 = (char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+strlen(prefix)+5));
         sprintf(prefix1,"%s->%s",prefix,a->name);
 
         dump_attributes(d,a,prefix1);
@@ -259,9 +259,9 @@ static void dump_long(grib_dumper* d, grib_accessor* a, const char* comment)
             char* prefix;
             int dofree=0;
             
-            r=compute_key_rank(h,self->keys,a->name);
+            r=compute_bufr_key_rank(h,self->keys,a->name);
             if (r!=0) {
-                prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+                prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
                 dofree=1;
                 sprintf(prefix,"#%d#%s",r,a->name);
             } else prefix=(char*)a->name;
@@ -281,13 +281,13 @@ static void dump_long(grib_dumper* d, grib_accessor* a, const char* comment)
     self->empty=0;
 
     if (size>1) {
-        if ((r=compute_key_rank(h,self->keys,a->name))!=0)
+        if ((r=compute_bufr_key_rank(h,self->keys,a->name))!=0)
             fprintf(self->dumper.out,"print \"#%d#%s=[#%d#%s]\";\n", r,a->name, r,a->name);
         else
             fprintf(self->dumper.out,"print \"%s=[%s]\";\n", a->name, a->name);
 
     } else {
-        r=compute_key_rank(h,self->keys,a->name);
+        r=compute_bufr_key_rank(h,self->keys,a->name);
         if( !grib_is_missing_long(a,value) ) {
             if (r!=0)
                 fprintf(self->dumper.out,"print \"#%d#%s=[#%d#%s]\";\n", r,a->name, r,a->name);
@@ -301,7 +301,7 @@ static void dump_long(grib_dumper* d, grib_accessor* a, const char* comment)
         int dofree=0;
 
         if (r!=0) {
-            prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+            prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
             dofree=1;
             sprintf(prefix,"#%d#%s",r,a->name);
         } else prefix=(char*)a->name;
@@ -326,7 +326,7 @@ static void dump_long_attribute(grib_dumper* d, grib_accessor* a, const char* pr
     fprintf(self->dumper.out,"print \"%s->%s = [%s->%s]\";\n", prefix, a->name, prefix, a->name);
 
     if (self->isLeaf==0) {
-        char* prefix1 = grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+strlen(prefix)+5));
+        char* prefix1 = (char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+strlen(prefix)+5));
         sprintf(prefix1,"%s->%s",prefix,a->name);
 
         dump_attributes(d,a,prefix1);
@@ -356,7 +356,7 @@ static void dump_double(grib_dumper* d, grib_accessor* a, const char* comment)
     self->begin=0;
     self->empty=0;
 
-    r=compute_key_rank(h,self->keys,a->name);
+    r=compute_bufr_key_rank(h,self->keys,a->name);
     if( !grib_is_missing_double(a,value) ) {
         if (r!=0)
             fprintf(self->dumper.out,"print \"#%d#%s=[#%d#%s]\";\n", r,a->name, r,a->name);
@@ -369,7 +369,7 @@ static void dump_double(grib_dumper* d, grib_accessor* a, const char* comment)
         int dofree=0;
 
         if (r!=0) {
-            prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+            prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
             dofree=1;
             sprintf(prefix,"#%d#%s",r,a->name);
         } else prefix=(char*)a->name;
@@ -406,7 +406,7 @@ static void dump_string_array(grib_dumper* d, grib_accessor* a, const char* comm
 
     if (self->isLeaf==0) {
         depth+=2;
-        if ((r=compute_key_rank(h,self->keys,a->name))!=0)
+        if ((r=compute_bufr_key_rank(h,self->keys,a->name))!=0)
             fprintf(self->dumper.out,"print \"#%d#%s=[#%d#%s]\";\n", r,a->name, r,a->name);
         else
             fprintf(self->dumper.out,"print \"%s=[%s]\";\n", a->name, a->name);
@@ -419,7 +419,7 @@ static void dump_string_array(grib_dumper* d, grib_accessor* a, const char* comm
         int dofree=0;
 
         if (r!=0) {
-            prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+            prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
             dofree=1;
             sprintf(prefix,"#%d#%s",r,a->name);
         } else prefix=(char*)a->name;
@@ -461,7 +461,7 @@ static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment)
 
     err = grib_unpack_string(a,value,&size);
     p=value;
-    r=compute_key_rank(h,self->keys,a->name);
+    r=compute_bufr_key_rank(h,self->keys,a->name);
     if (grib_is_missing_string(a,(unsigned char *)value,size))
         return;
 
@@ -480,7 +480,7 @@ static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment)
         int dofree=0;
 
         if (r!=0) {
-            prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+            prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
             dofree=1;
             sprintf(prefix,"#%d#%s",r,a->name);
         } else prefix=(char*)a->name;
diff --git a/src/grib_dumper_class_bufr_decode_fortran.c b/src/grib_dumper_class_bufr_decode_fortran.c
index f80885d..3ad1d4d 100644
--- a/src/grib_dumper_class_bufr_decode_fortran.c
+++ b/src/grib_dumper_class_bufr_decode_fortran.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -122,7 +122,7 @@ static int init(grib_dumper* d)
     d->count=1;
     self->isLeaf=0;
     self->isAttribute=0;
-    self->keys=grib_context_malloc_clear(c,sizeof(grib_string_list));
+    self->keys=(grib_string_list*)grib_context_malloc_clear(c,sizeof(grib_string_list));
 
     return GRIB_SUCCESS;
 }
@@ -167,12 +167,12 @@ static void dump_values(grib_dumper* d, grib_accessor* a)
     if (size>1) {
         depth-=2;
 
-        if ((r=compute_key_rank(h,self->keys,a->name))!=0)
+        if ((r=compute_bufr_key_rank(h,self->keys,a->name))!=0)
             fprintf(self->dumper.out,"  call codes_get(ibufr, '#%d#%s', rValues)\n",r,a->name);
         else
             fprintf(self->dumper.out,"  call codes_get(ibufr, '%s', rValues)\n",a->name);
     } else {
-        r=compute_key_rank(h,self->keys,a->name);
+        r=compute_bufr_key_rank(h,self->keys,a->name);
         if( !grib_is_missing_double(a,value) ) {
             if (r!=0)
                 fprintf(self->dumper.out,"  call codes_get(ibufr, '#%d#%s', rVal)\n", r, a->name);
@@ -186,7 +186,7 @@ static void dump_values(grib_dumper* d, grib_accessor* a)
         int dofree=0;
 
         if (r!=0) {
-            prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+            prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
             dofree=1;
             sprintf(prefix,"#%d#%s",r,a->name);
         } else prefix=(char*)a->name;
@@ -230,7 +230,7 @@ static void dump_values_attribute(grib_dumper* d, grib_accessor* a, const char*
     if (self->isLeaf==0) {
         char* prefix1;
 
-        prefix1=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+strlen(prefix)+5));
+        prefix1=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+strlen(prefix)+5));
         sprintf(prefix1,"%s->%s",prefix,a->name);
 
         dump_attributes(d,a,prefix1);
@@ -262,9 +262,9 @@ static void dump_long(grib_dumper* d,grib_accessor* a, const char* comment)
             char* prefix;
             int dofree=0;
 
-            r=compute_key_rank(h,self->keys,a->name);
+            r=compute_bufr_key_rank(h,self->keys,a->name);
             if (r!=0) {
-                prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+                prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
                 dofree=1;
                 sprintf(prefix,"#%d#%s",r,a->name);
             } else prefix=(char*)a->name;
@@ -286,13 +286,13 @@ static void dump_long(grib_dumper* d,grib_accessor* a, const char* comment)
         depth-=2;
         fprintf(self->dumper.out,"  if(allocated(iValues)) deallocate(iValues)\n");
 
-        if ((r=compute_key_rank(h,self->keys,a->name))!=0)
+        if ((r=compute_bufr_key_rank(h,self->keys,a->name))!=0)
             fprintf(self->dumper.out,"  call codes_get(ibufr, '#%d#%s', iValues)\n", r,a->name);
         else
             fprintf(self->dumper.out,"  call codes_get(ibufr, '%s', iValues)\n", a->name);
 
     } else {
-        r=compute_key_rank(h,self->keys,a->name);
+        r=compute_bufr_key_rank(h,self->keys,a->name);
         if( !grib_is_missing_long(a,value) ) {
             if (r!=0)
                 fprintf(self->dumper.out,"  call codes_get(ibufr, '#%d#%s', iVal)\n", r, a->name);
@@ -306,7 +306,7 @@ static void dump_long(grib_dumper* d,grib_accessor* a, const char* comment)
         int dofree=0;
 
         if (r!=0) {
-            prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+            prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
             dofree=1;
             sprintf(prefix,"#%d#%s",r,a->name);
         } else prefix=(char*)a->name;
@@ -353,7 +353,7 @@ static void dump_long_attribute(grib_dumper* d, grib_accessor* a, const char* pr
     if (self->isLeaf==0) {
         char* prefix1;
 
-        prefix1=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+strlen(prefix)+5));
+        prefix1=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+strlen(prefix)+5));
         sprintf(prefix1,"%s->%s",prefix,a->name);
 
         dump_attributes(d,a,prefix1);
@@ -382,7 +382,7 @@ static void dump_double(grib_dumper* d, grib_accessor* a, const char* comment)
 
     self->empty=0;
 
-    r=compute_key_rank(h,self->keys,a->name);
+    r=compute_bufr_key_rank(h,self->keys,a->name);
     if( !grib_is_missing_double(a,value) ) {
         if (r!=0)
             fprintf(self->dumper.out,"  call codes_get(ibufr,'#%d#%s', rVal)\n",r,a->name);
@@ -395,7 +395,7 @@ static void dump_double(grib_dumper* d, grib_accessor* a, const char* comment)
         int dofree=0;
 
         if (r!=0) {
-            prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+            prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
             dofree=1;
             sprintf(prefix,"#%d#%s",r,a->name);
         } else prefix=(char*)a->name;
@@ -434,7 +434,7 @@ static void dump_string_array(grib_dumper* d, grib_accessor* a, const char* comm
     self->empty=0;
 
     if (self->isLeaf==0) {
-        if ((r=compute_key_rank(h,self->keys,a->name))!=0)
+        if ((r=compute_bufr_key_rank(h,self->keys,a->name))!=0)
             fprintf(self->dumper.out,"  call codes_get_string_array(ibufr,'#%d#%s',sValues)\n",r,a->name);
         else
             fprintf(self->dumper.out,"  call codes_get_string_array(ibufr,'%s',sValues)\n",a->name);
@@ -445,7 +445,7 @@ static void dump_string_array(grib_dumper* d, grib_accessor* a, const char* comm
         int dofree=0;
 
         if (r!=0) {
-            prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+            prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
             dofree=1;
             sprintf(prefix,"#%d#%s",r,a->name);
         } else prefix=(char*)a->name;
@@ -485,7 +485,7 @@ static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment)
 
     err = grib_unpack_string(a,value,&size);
     p=value;
-    r=compute_key_rank(h,self->keys,a->name);
+    r=compute_bufr_key_rank(h,self->keys,a->name);
     if (grib_is_missing_string(a,(unsigned char *)value,size))
         return;
 
@@ -506,7 +506,7 @@ static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment)
         int dofree=0;
 
         if (r!=0) {
-            prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+            prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
             dofree=1;
             sprintf(prefix,"#%d#%s",r,a->name);
         } else prefix=(char*)a->name;
diff --git a/src/grib_dumper_class_bufr_decode_python.c b/src/grib_dumper_class_bufr_decode_python.c
index b9cd750..324812c 100644
--- a/src/grib_dumper_class_bufr_decode_python.c
+++ b/src/grib_dumper_class_bufr_decode_python.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -122,7 +122,7 @@ static int init(grib_dumper* d)
     d->count=1;
     self->isLeaf=0;
     self->isAttribute=0;
-    self->keys=grib_context_malloc_clear(c,sizeof(grib_string_list));
+    self->keys=(grib_string_list*)grib_context_malloc_clear(c,sizeof(grib_string_list));
 
     return GRIB_SUCCESS;
 }
@@ -144,7 +144,7 @@ static int destroy(grib_dumper* d)
 
 static char* dval_to_string(const grib_context* c,double v)
 {
-    char* sval=grib_context_malloc_clear(c,sizeof(char)*40);
+    char* sval=(char*)grib_context_malloc_clear(c,sizeof(char)*40);
     sprintf(sval,"%.18e",v);
     return sval;
 }
@@ -174,12 +174,12 @@ static void dump_values(grib_dumper* d,grib_accessor* a)
 
     if (size>1) {
         depth-=2;
-        if ((r=compute_key_rank(h,self->keys,a->name))!=0)
+        if ((r=compute_bufr_key_rank(h,self->keys,a->name))!=0)
             fprintf(self->dumper.out,"    dVals = codes_get_array(ibufr, '#%d#%s')\n",r,a->name);
         else
             fprintf(self->dumper.out,"    dVals = codes_get_array(ibufr, '%s')\n",a->name);
     } else {
-        r=compute_key_rank(h,self->keys,a->name);
+        r=compute_bufr_key_rank(h,self->keys,a->name);
         if( !grib_is_missing_double(a,value) ) {
 
             sval=dval_to_string(c,value);
@@ -197,7 +197,7 @@ static void dump_values(grib_dumper* d,grib_accessor* a)
         int dofree=0;
 
         if (r!=0) {
-            prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+            prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
             dofree=1;
             sprintf(prefix,"#%d#%s",r,a->name);
         } else prefix=(char*)a->name;
@@ -235,7 +235,7 @@ static void dump_values_attribute(grib_dumper* d,grib_accessor* a, const char* p
         depth-=2;
         fprintf(self->dumper.out,"    dVals = codes_get_array(ibufr, '%s->%s')\n", prefix,a->name);
     } else {
-        /* int r=compute_key_rank(h,self->keys,a->name); */
+        /* int r=compute_bufr_key_rank(h,self->keys,a->name); */
         if( !grib_is_missing_double(a,value) ) {
 
             sval=dval_to_string(c,value);
@@ -248,7 +248,7 @@ static void dump_values_attribute(grib_dumper* d,grib_accessor* a, const char* p
     if (self->isLeaf==0) {
         char* prefix1;
 
-        prefix1=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+strlen(prefix)+5));
+        prefix1=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+strlen(prefix)+5));
         sprintf(prefix1,"%s->%s",prefix,a->name);
 
         dump_attributes(d,a,prefix1);
@@ -280,9 +280,9 @@ static void dump_long(grib_dumper* d, grib_accessor* a, const char* comment)
             char* prefix;
             int dofree=0;
 
-            r=compute_key_rank(h,self->keys,a->name);
+            r=compute_bufr_key_rank(h,self->keys,a->name);
             if (r!=0) {
-                prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+                prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
                 dofree=1;
                 sprintf(prefix,"#%d#%s",r,a->name);
             } else prefix=(char*)a->name;
@@ -302,13 +302,13 @@ static void dump_long(grib_dumper* d, grib_accessor* a, const char* comment)
 
     if (size>1) {
         depth-=2;
-        if ((r=compute_key_rank(h,self->keys,a->name))!=0)
+        if ((r=compute_bufr_key_rank(h,self->keys,a->name))!=0)
             fprintf(self->dumper.out,"    iValues = codes_get_array(ibufr, '#%d#%s')\n",r,a->name);
         else
             fprintf(self->dumper.out,"    iValues = codes_get_array(ibufr, '%s')\n",a->name);
 
     } else {
-        r=compute_key_rank(h,self->keys,a->name);
+        r=compute_bufr_key_rank(h,self->keys,a->name);
         if( !grib_is_missing_long(a,value) ) {
             if (r!=0)
                 fprintf(self->dumper.out,"    iVal = codes_get(ibufr, '#%d#%s')\n",r,a->name);
@@ -322,7 +322,7 @@ static void dump_long(grib_dumper* d, grib_accessor* a, const char* comment)
         int dofree=0;
 
         if (r!=0) {
-            prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+            prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
             dofree=1;
             sprintf(prefix,"#%d#%s",r,a->name);
         } else prefix=(char*)a->name;
@@ -366,7 +366,7 @@ static void dump_long_attribute(grib_dumper* d, grib_accessor* a, const char* pr
     if (self->isLeaf==0) {
         char* prefix1;
 
-        prefix1=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+strlen(prefix)+5));
+        prefix1=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+strlen(prefix)+5));
         sprintf(prefix1,"%s->%s",prefix,a->name);
 
         dump_attributes(d,a,prefix1);
@@ -396,7 +396,7 @@ static void dump_double(grib_dumper* d,grib_accessor* a,const char* comment)
 
     self->empty=0;
 
-    r=compute_key_rank(h,self->keys,a->name);
+    r=compute_bufr_key_rank(h,self->keys,a->name);
     if( !grib_is_missing_double(a,value) ) {
         sval=dval_to_string(c,value);
         if (r!=0)
@@ -412,7 +412,7 @@ static void dump_double(grib_dumper* d,grib_accessor* a,const char* comment)
         int dofree=0;
 
         if (r!=0) {
-            prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+            prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
             dofree=1;
             sprintf(prefix,"#%d#%s",r,a->name);
         } else prefix=(char*)a->name;
@@ -448,7 +448,7 @@ static void dump_string_array(grib_dumper* d,grib_accessor* a,const char* commen
     self->empty=0;
 
     if (self->isLeaf==0) {
-        if ((r=compute_key_rank(h,self->keys,a->name))!=0)
+        if ((r=compute_bufr_key_rank(h,self->keys,a->name))!=0)
             fprintf(self->dumper.out,"    sVals = codes_get_string_array(ibufr, '#%d#%s')\n",r,a->name);
         else
             fprintf(self->dumper.out,"    sVals = codes_get_string_array(ibufr, '%s')\n",a->name);
@@ -459,7 +459,7 @@ static void dump_string_array(grib_dumper* d,grib_accessor* a,const char* commen
         int dofree=0;
 
         if (r!=0) {
-            prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+            prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
             dofree=1;
             sprintf(prefix,"#%d#%s",r,a->name);
         } else prefix=(char*)a->name;
@@ -499,7 +499,7 @@ static void dump_string(grib_dumper* d,grib_accessor* a,const char* comment)
 
     err = grib_unpack_string(a,value,&size);
     p=value;
-    r=compute_key_rank(h,self->keys,a->name);
+    r=compute_bufr_key_rank(h,self->keys,a->name);
     if (grib_is_missing_string(a,(unsigned char *)value,size))
         return;
 
@@ -518,7 +518,7 @@ static void dump_string(grib_dumper* d,grib_accessor* a,const char* comment)
         int dofree=0;
 
         if (r!=0) {
-            prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+            prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
             dofree=1;
             sprintf(prefix,"#%d#%s",r,a->name);
         } else prefix=(char*)a->name;
diff --git a/src/grib_dumper_class_bufr_encode_C.c b/src/grib_dumper_class_bufr_encode_C.c
index 9a8ce8d..042712a 100644
--- a/src/grib_dumper_class_bufr_encode_C.c
+++ b/src/grib_dumper_class_bufr_encode_C.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -122,7 +122,7 @@ static int init(grib_dumper* d)
     d->count=1;
     self->isLeaf=0;
     self->isAttribute=0;
-    self->keys=grib_context_malloc_clear(c,sizeof(grib_string_list));
+    self->keys=(grib_string_list*)grib_context_malloc_clear(c,sizeof(grib_string_list));
 
     return GRIB_SUCCESS;
 }
@@ -144,7 +144,7 @@ static int destroy(grib_dumper* d)
 
 static char* dval_to_string(grib_context* c, double v)
 {
-    char* sval=grib_context_malloc_clear(c,sizeof(char)*40);
+    char* sval=(char*)grib_context_malloc_clear(c,sizeof(char)*40);
     sprintf(sval,"%.18e",v);
     return sval;
 }
@@ -181,7 +181,7 @@ static void dump_values(grib_dumper* d, grib_accessor* a)
         fprintf(self->dumper.out,"  free(rvalues); rvalues = NULL;\n\n");
         fprintf(self->dumper.out,"  rvalues = (double*)malloc(%lu*sizeof(double));\n", (unsigned long)size);
         fprintf(self->dumper.out,"  if (!rvalues) { fprintf(stderr, \"Failed to allocate memory (rvalues).\\n\"); return 1; }\n");
-        fprintf(self->dumper.out,"  size = %lu;", size);
+        fprintf(self->dumper.out,"  size = %lu;", (unsigned long)size);
 
         icount=0;
         for (i=0; i<size-1; ++i) {
@@ -200,12 +200,12 @@ static void dump_values(grib_dumper* d, grib_accessor* a)
         fprintf(self->dumper.out,"\n");
         grib_context_free(c,values);
 
-        if ((r=compute_key_rank(h,self->keys,a->name))!=0)
+        if ((r=compute_bufr_key_rank(h,self->keys,a->name))!=0)
             fprintf(self->dumper.out,"  CODES_CHECK(codes_set_double_array(h, \"#%d#%s\",rvalues, size), 0);\n", r, a->name);
         else
             fprintf(self->dumper.out,"  CODES_CHECK(codes_set_double_array(h, \"%s\", rvalues, size), 0);\n",a->name);
     } else {
-        r=compute_key_rank(h,self->keys,a->name);
+        r=compute_bufr_key_rank(h,self->keys,a->name);
         if( !grib_is_missing_double(a,value) ) {
 
             sval=dval_to_string(c,value);
@@ -223,7 +223,7 @@ static void dump_values(grib_dumper* d, grib_accessor* a)
         int dofree=0;
 
         if (r!=0) {
-            prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+            prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
             dofree=1;
             sprintf(prefix,"#%d#%s",r,a->name);
         } else prefix=(char*)a->name;
@@ -267,7 +267,7 @@ static void dump_values_attribute(grib_dumper* d, grib_accessor* a, const char*
         fprintf(self->dumper.out,"  free(rvalues); rvalues = NULL;\n");
         fprintf(self->dumper.out,"  rvalues = (double*)malloc(%lu*sizeof(double));\n", (unsigned long)size);
         fprintf(self->dumper.out,"  if (!rvalues) { fprintf(stderr, \"Failed to allocate memory (rvalues).\\n\"); return 1; }\n");
-        fprintf(self->dumper.out,"  size = %lu;", size);
+        fprintf(self->dumper.out,"  size = %lu;", (unsigned long)size);
 
         icount=0;
         for (i=0; i<size-1; ++i) {
@@ -288,7 +288,7 @@ static void dump_values_attribute(grib_dumper* d, grib_accessor* a, const char*
 
         fprintf(self->dumper.out,"  CODES_CHECK(codes_set_double_array(h, \"%s->%s\", rvalues, size), 0);\n", prefix,a->name);
     } else {
-        /* int r=compute_key_rank(h,self->keys,a->name); */
+        /* int r=compute_bufr_key_rank(h,self->keys,a->name); */
         if( !grib_is_missing_double(a,value) ) {
 
             sval=dval_to_string(c,value);
@@ -302,7 +302,7 @@ static void dump_values_attribute(grib_dumper* d, grib_accessor* a, const char*
     if (self->isLeaf==0) {
         char* prefix1;
 
-        prefix1=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+strlen(prefix)+5));
+        prefix1=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+strlen(prefix)+5));
         sprintf(prefix1,"%s->%s",prefix,a->name);
 
         dump_attributes(d,a,prefix1);
@@ -336,9 +336,9 @@ static void dump_long(grib_dumper* d,grib_accessor* a, const char* comment)
             char* prefix;
             int dofree=0;
 
-            r=compute_key_rank(h,self->keys,a->name);
+            r=compute_bufr_key_rank(h,self->keys,a->name);
             if (r!=0) {
-                prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+                prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
                 dofree=1;
                 sprintf(prefix,"#%d#%s",r,a->name);
             } else prefix=(char*)a->name;
@@ -363,7 +363,7 @@ static void dump_long(grib_dumper* d,grib_accessor* a, const char* comment)
         fprintf(self->dumper.out,"  free(ivalues); ivalues = NULL;\n\n");
         fprintf(self->dumper.out,"  ivalues = (long*)malloc(%lu*sizeof(long));\n", (unsigned long)size);
         fprintf(self->dumper.out,"  if (!ivalues) { fprintf(stderr, \"Failed to allocate memory (ivalues).\\n\"); return 1; }\n");
-        fprintf(self->dumper.out,"  size = %lu;", size);
+        fprintf(self->dumper.out,"  size = %lu;", (unsigned long)size);
 
         icount=0;
         for (i=0;i<size-1;i++) {
@@ -378,13 +378,13 @@ static void dump_long(grib_dumper* d,grib_accessor* a, const char* comment)
         fprintf(self->dumper.out,"\n");
         grib_context_free(a->context,values);
 
-        if ((r=compute_key_rank(h,self->keys,a->name))!=0)
+        if ((r=compute_bufr_key_rank(h,self->keys,a->name))!=0)
             fprintf(self->dumper.out,"  CODES_CHECK(codes_set_long_array(h, \"#%d#%s\", ivalues, size), 0);\n",r,a->name);
         else
             fprintf(self->dumper.out,"  CODES_CHECK(codes_set_long_array(h, \"%s\", ivalues, size), 0);\n",a->name);
 
     } else {
-        r=compute_key_rank(h,self->keys,a->name);
+        r=compute_bufr_key_rank(h,self->keys,a->name);
         if( !grib_is_missing_long(a,value) ) {
             if (r!=0)
                 fprintf(self->dumper.out,"  CODES_CHECK(codes_set_long(h, \"#%d#%s\", ", r,a->name);
@@ -400,7 +400,7 @@ static void dump_long(grib_dumper* d,grib_accessor* a, const char* comment)
         int dofree=0;
 
         if (r!=0) {
-            prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+            prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
             dofree=1;
             sprintf(prefix,"#%d#%s",r,a->name);
         } else prefix=(char*)a->name;
@@ -442,7 +442,7 @@ static void dump_long_attribute(grib_dumper* d, grib_accessor* a, const char* pr
         fprintf(self->dumper.out,"  free(ivalues); ivalues = NULL;\n");
         fprintf(self->dumper.out,"  ivalues = (long*)malloc(%lu*sizeof(long));\n", (unsigned long)size);
         fprintf(self->dumper.out,"  if (!ivalues) { fprintf(stderr, \"Failed to allocate memory (ivalues).\\n\"); return 1; }\n");
-        fprintf(self->dumper.out,"  size = %lu;", size);
+        fprintf(self->dumper.out,"  size = %lu;", (unsigned long)size);
 
         icount=0;
         for (i=0;i<size-1;i++) {
@@ -460,7 +460,7 @@ static void dump_long_attribute(grib_dumper* d, grib_accessor* a, const char* pr
         fprintf(self->dumper.out,"  CODES_CHECK(codes_set_long_array(h, \"%s->%s\", ivalues, size), 0);\n", prefix,a->name);
 
     } else {
-        /* int r=compute_key_rank(h,self->keys,a->name); */
+        /* int r=compute_bufr_key_rank(h,self->keys,a->name); */
         if( !grib_is_missing_long(a,value) ) {
             fprintf(self->dumper.out,"  CODES_CHECK(codes_set_long(h, \"%s->%s\", ", prefix,a->name);
             fprintf(self->dumper.out,"%ld), 0);\n",value);
@@ -470,7 +470,7 @@ static void dump_long_attribute(grib_dumper* d, grib_accessor* a, const char* pr
     if (self->isLeaf==0) {
         char* prefix1;
 
-        prefix1=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+strlen(prefix)+5));
+        prefix1=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+strlen(prefix)+5));
         sprintf(prefix1,"%s->%s",prefix,a->name);
 
         dump_attributes(d,a,prefix1);
@@ -500,13 +500,13 @@ static void dump_double(grib_dumper* d, grib_accessor* a, const char* comment)
 
     self->empty=0;
 
-    r=compute_key_rank(h,self->keys,a->name);
+    r=compute_bufr_key_rank(h,self->keys,a->name);
     if( !grib_is_missing_double(a,value) ) {
         sval=dval_to_string(c,value);
         if (r!=0)
-            fprintf(self->dumper.out,"  codes_set_double(h, \"#%d#%s\", %s);\n", r,a->name, sval);
+            fprintf(self->dumper.out,"  CODES_CHECK(codes_set_double(h, \"#%d#%s\", %s), 0);\n", r,a->name, sval);
         else
-            fprintf(self->dumper.out,"  codes_set_double(h, \"%s\", %s);\n", a->name, sval);
+            fprintf(self->dumper.out,"  CODES_CHECK(codes_set_double(h, \"%s\", %s), 0);\n", a->name, sval);
 
         grib_context_free(c,sval);
     }
@@ -516,7 +516,7 @@ static void dump_double(grib_dumper* d, grib_accessor* a, const char* comment)
         int dofree=0;
 
         if (r!=0) {
-            prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+            prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
             dofree=1;
             sprintf(prefix,"#%d#%s",r,a->name);
         } else prefix=(char*)a->name;
@@ -553,7 +553,7 @@ static void dump_string_array(grib_dumper* d, grib_accessor* a, const char* comm
     fprintf(self->dumper.out,"  free(svalues);\n");
     fprintf(self->dumper.out,"  svalues = (char**)malloc(%lu * sizeof(char*));\n", (unsigned long)size);
     fprintf(self->dumper.out,"  if (!svalues) { fprintf(stderr, \"Failed to allocate memory (svalues).\\n\"); return 1; }\n");
-    fprintf(self->dumper.out,"  size = %lu;\n", size);
+    fprintf(self->dumper.out,"  size = %lu;\n", (unsigned long)size);
 
     self->empty=0;
     values=(char**)grib_context_malloc_clear(c,size*sizeof(char*));
@@ -569,7 +569,7 @@ static void dump_string_array(grib_dumper* d, grib_accessor* a, const char* comm
     fprintf(self->dumper.out,"  svalues[%lu]=\"%s\";\n", i, values[i]);
 
     if (self->isLeaf==0) {
-        if ((r=compute_key_rank(h,self->keys,a->name))!=0)
+        if ((r=compute_bufr_key_rank(h,self->keys,a->name))!=0)
             fprintf(self->dumper.out,"  codes_set_string_array(h, \"#%d#%s\", (const char **)svalues, size);\n",r,a->name);
         else
             fprintf(self->dumper.out,"  codes_set_string_array(h, \"%s\", (const char **)svalues, size);\n",a->name);
@@ -580,7 +580,7 @@ static void dump_string_array(grib_dumper* d, grib_accessor* a, const char* comm
         int dofree=0;
 
         if (r!=0) {
-            prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+            prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
             dofree=1;
             sprintf(prefix,"#%d#%s",r,a->name);
         } else prefix=(char*)a->name;
@@ -621,7 +621,7 @@ static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment)
 
     err = grib_unpack_string(a,value,&size);
     p=value;
-    r=compute_key_rank(h,self->keys,a->name);
+    r=compute_bufr_key_rank(h,self->keys,a->name);
     if (grib_is_missing_string(a,(unsigned char *)value,size))
         return;
 
@@ -641,7 +641,7 @@ static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment)
         int dofree=0;
 
         if (r!=0) {
-            prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+            prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
             dofree=1;
             sprintf(prefix,"#%d#%s",r,a->name);
         } else prefix=(char*)a->name;
@@ -674,9 +674,9 @@ static void _dump_long_array(grib_handle* h, FILE* f, const char* key, const cha
     fprintf(f,"  free(ivalues); ivalues = NULL;\n");
     fprintf(f,"  ivalues = (long*)malloc(%lu*sizeof(long));\n", (unsigned long)size);
     fprintf(f,"  if (!ivalues) { fprintf(stderr, \"Failed to allocate memory (ivalues).\\n\"); return 1; }\n");
-    fprintf(f,"  size = %lu;", size);
+    fprintf(f,"  size = %lu;", (unsigned long)size);
 
-    val=grib_context_malloc_clear(h->context,sizeof(long)*size);
+    val=(long*)grib_context_malloc_clear(h->context,sizeof(long)*size);
     grib_get_long_array(h,key,val,&size);
     for (i=0;i<size-1;i++) {
         if (icount>cols || i==0) {fprintf(f,"\n  ");icount=0;}
@@ -802,7 +802,7 @@ static void header(grib_dumper* d, grib_handle* h)
 static void footer(grib_dumper* d, grib_handle* h)
 {
     grib_dumper_bufr_encode_C *self = (grib_dumper_bufr_encode_C*)d;
-    fprintf(self->dumper.out,"\n  codes_set_long(h, \"pack\", 1);\n");
+    fprintf(self->dumper.out,"\n  CODES_CHECK(codes_set_long(h, \"pack\", 1), 0);\n");
     if (d->count==1)
         fprintf(self->dumper.out,"  fout = fopen(\"outfile.bufr\", \"w\");\n");
     else
@@ -810,7 +810,7 @@ static void footer(grib_dumper* d, grib_handle* h)
 
     /*fprintf(self->dumper.out,"  fout = fopen(\"outfile.bufr\", \"w\");");*/
     fprintf(self->dumper.out,"  if (!fout) {\n");
-    fprintf(self->dumper.out,"    fprintf(stderr, \"Failed to open output file.\\n\");\n");
+    fprintf(self->dumper.out,"    fprintf(stderr, \"Failed to open (create) output file.\\n\");\n");
     fprintf(self->dumper.out,"    return 1;\n");
     fprintf(self->dumper.out,"  }\n");
     fprintf(self->dumper.out,"  CODES_CHECK(codes_get_message(h,&buffer,&size),0);\n");
@@ -824,6 +824,7 @@ static void footer(grib_dumper* d, grib_handle* h)
     fprintf(self->dumper.out,"  }\n");
     fprintf(self->dumper.out,"  \n");
     fprintf(self->dumper.out,"  codes_handle_delete(h);\n");
+    fprintf(self->dumper.out,"  printf(\"Created output BUFR file 'outfile.bufr'.\\n\");\n");
     fprintf(self->dumper.out,"  free(ivalues); ivalues = NULL;\n");
     fprintf(self->dumper.out,"  free(rvalues); rvalues = NULL;\n");
     fprintf(self->dumper.out,"  free(svalues); svalues = NULL;\n\n");
diff --git a/src/grib_dumper_class_bufr_encode_filter.c b/src/grib_dumper_class_bufr_encode_filter.c
index 3136115..7584d3e 100644
--- a/src/grib_dumper_class_bufr_encode_filter.c
+++ b/src/grib_dumper_class_bufr_encode_filter.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -120,7 +120,7 @@ static int init(grib_dumper* d)
     self->empty=1;
     self->isLeaf=0;
     self->isAttribute=0;
-    self->keys=grib_context_malloc_clear(c,sizeof(grib_string_list));
+    self->keys=(grib_string_list*)grib_context_malloc_clear(c,sizeof(grib_string_list));
 
     return GRIB_SUCCESS;
 }
@@ -171,7 +171,7 @@ static void dump_values(grib_dumper* d, grib_accessor* a)
     if (size>1) {
         int icount=0;
 
-        if ((r=compute_key_rank(h,self->keys,a->name))!=0)
+        if ((r=compute_bufr_key_rank(h,self->keys,a->name))!=0)
             fprintf(self->dumper.out,"set #%d#%s=",r,a->name);
         else
             fprintf(self->dumper.out,"set %s=",a->name);
@@ -190,7 +190,7 @@ static void dump_values(grib_dumper* d, grib_accessor* a)
         fprintf(self->dumper.out,"};\n");
         grib_context_free(c,values);
     } else {
-        r=compute_key_rank(h,self->keys,a->name);
+        r=compute_bufr_key_rank(h,self->keys,a->name);
         if( !grib_is_missing_double(a,value) ) {
 
             if (r!=0)
@@ -207,7 +207,7 @@ static void dump_values(grib_dumper* d, grib_accessor* a)
         int dofree=0;
 
         if (r!=0) {
-            prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+            prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
             dofree=1;
             sprintf(prefix,"#%d#%s",r,a->name);
         } else prefix=(char*)a->name;
@@ -261,7 +261,7 @@ static void dump_values_attribute(grib_dumper* d,grib_accessor* a, const char* p
         fprintf(self->dumper.out,"};\n");
         grib_context_free(c,values);
     } else {
-        /* int r=compute_key_rank(h,self->keys,a->name); */
+        /* int r=compute_bufr_key_rank(h,self->keys,a->name); */
         if( !grib_is_missing_double(a,value) ) {
             fprintf(self->dumper.out,"set %s->%s = %.18e;\n", prefix, a->name, value);
         }
@@ -270,7 +270,7 @@ static void dump_values_attribute(grib_dumper* d,grib_accessor* a, const char* p
     if (self->isLeaf==0) {
         char* prefix1;
 
-        prefix1=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+strlen(prefix)+5));
+        prefix1=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+strlen(prefix)+5));
         sprintf(prefix1,"%s->%s",prefix,a->name);
 
         dump_attributes(d,a,prefix1);
@@ -304,9 +304,9 @@ static void dump_long(grib_dumper* d, grib_accessor* a, const char* comment)
             char* prefix;
             int dofree=0;
             
-            r=compute_key_rank(h,self->keys,a->name);
+            r=compute_bufr_key_rank(h,self->keys,a->name);
             if (r!=0) {
-                prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+                prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
                 dofree=1;
                 sprintf(prefix,"#%d#%s",r,a->name);
             } else prefix=(char*)a->name;
@@ -330,7 +330,7 @@ static void dump_long(grib_dumper* d, grib_accessor* a, const char* comment)
 
     if (size>1) {
         icount=0;
-        if ((r=compute_key_rank(h,self->keys,a->name))!=0)
+        if ((r=compute_bufr_key_rank(h,self->keys,a->name))!=0)
             fprintf(self->dumper.out,"set #%d#%s=",r,a->name);
         else
             fprintf(self->dumper.out,"set %s=",a->name);
@@ -349,7 +349,7 @@ static void dump_long(grib_dumper* d, grib_accessor* a, const char* comment)
         fprintf(self->dumper.out,"};\n");
         grib_context_free(a->context,values);
     } else {
-        r=compute_key_rank(h,self->keys,a->name);
+        r=compute_bufr_key_rank(h,self->keys,a->name);
         if( !grib_is_missing_long(a,value) ) {
             if (r!=0)
                 fprintf(self->dumper.out,"set #%d#%s=",r,a->name);
@@ -365,7 +365,7 @@ static void dump_long(grib_dumper* d, grib_accessor* a, const char* comment)
         int dofree=0;
 
         if (r!=0) {
-            prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+            prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
             dofree=1;
             sprintf(prefix,"#%d#%s",r,a->name);
         } else prefix=(char*)a->name;
@@ -418,7 +418,7 @@ static void dump_long_attribute(grib_dumper* d, grib_accessor* a, const char* pr
         grib_context_free(a->context,values);
 
     } else {
-        /* int r=compute_key_rank(h,self->keys,a->name); */
+        /* int r=compute_bufr_key_rank(h,self->keys,a->name); */
         if( !grib_is_missing_long(a,value) ) {
             fprintf(self->dumper.out,"set %s->%s = ",prefix,a->name);
             fprintf(self->dumper.out,"%ld ;\n",value);
@@ -428,7 +428,7 @@ static void dump_long_attribute(grib_dumper* d, grib_accessor* a, const char* pr
     if (self->isLeaf==0) {
         char* prefix1;
 
-        prefix1=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+strlen(prefix)+5));
+        prefix1=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+strlen(prefix)+5));
         sprintf(prefix1,"%s->%s",prefix,a->name);
 
         dump_attributes(d,a,prefix1);
@@ -458,7 +458,7 @@ static void dump_double(grib_dumper* d, grib_accessor* a, const char* comment)
     self->begin=0;
     self->empty=0;
 
-    r=compute_key_rank(h,self->keys,a->name);
+    r=compute_bufr_key_rank(h,self->keys,a->name);
     if( !grib_is_missing_double(a,value) ) {
         if (r!=0)
             fprintf(self->dumper.out,"set #%d#%s=",r,a->name);
@@ -473,7 +473,7 @@ static void dump_double(grib_dumper* d, grib_accessor* a, const char* comment)
         int dofree=0;
 
         if (r!=0) {
-            prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+            prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
             dofree=1;
             sprintf(prefix,"#%d#%s",r,a->name);
         } else prefix=(char*)a->name;
@@ -511,7 +511,7 @@ static void dump_string_array(grib_dumper* d, grib_accessor* a, const char* comm
 
     if (self->isLeaf==0) {
         depth+=2;
-        if ((r=compute_key_rank(h,self->keys,a->name))!=0)
+        if ((r=compute_bufr_key_rank(h,self->keys,a->name))!=0)
             fprintf(self->dumper.out,"set #%d#%s=",r,a->name);
         else
             fprintf(self->dumper.out,"set %s=",a->name);
@@ -543,7 +543,7 @@ static void dump_string_array(grib_dumper* d, grib_accessor* a, const char* comm
         int dofree=0;
 
         if (r!=0) {
-            prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+            prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
             dofree=1;
             sprintf(prefix,"#%d#%s",r,a->name);
         } else prefix=(char*)a->name;
@@ -586,7 +586,7 @@ static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment)
 
     err = grib_unpack_string(a,value,&size);
     p=value;
-    r=compute_key_rank(h,self->keys,a->name);
+    r=compute_bufr_key_rank(h,self->keys,a->name);
     if (grib_is_missing_string(a,(unsigned char *)value,size))
         return;
 
@@ -607,7 +607,7 @@ static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment)
         int dofree=0;
 
         if (r!=0) {
-            prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+            prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
             dofree=1;
             sprintf(prefix,"#%d#%s",r,a->name);
         } else prefix=(char*)a->name;
@@ -637,7 +637,7 @@ static void _dump_long_array(grib_handle* h, FILE* f, const char* key, const cha
 
     if (grib_get_size(h,key,&size)==GRIB_NOT_FOUND) return;
 
-    val=grib_context_malloc_clear(h->context,sizeof(long)*size);
+    val=(long*)grib_context_malloc_clear(h->context,sizeof(long)*size);
     grib_get_long_array(h,key,val,&size);
     fprintf(f,"set %s= {",print_key);
     for (i=0;i<size-1;i++) {
diff --git a/src/grib_dumper_class_bufr_encode_fortran.c b/src/grib_dumper_class_bufr_encode_fortran.c
index e9b2659..6302e5b 100644
--- a/src/grib_dumper_class_bufr_encode_fortran.c
+++ b/src/grib_dumper_class_bufr_encode_fortran.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -122,7 +122,7 @@ static int init(grib_dumper* d)
     d->count=1;
     self->isLeaf=0;
     self->isAttribute=0;
-    self->keys=grib_context_malloc_clear(c,sizeof(grib_string_list));
+    self->keys=(grib_string_list*)grib_context_malloc_clear(c,sizeof(grib_string_list));
 
     return GRIB_SUCCESS;
 }
@@ -144,7 +144,7 @@ static int destroy(grib_dumper* d)
 
 static char* dval_to_string(grib_context* c, double v)
 {
-    char* sval=grib_context_malloc_clear(c,sizeof(char)*40);
+    char* sval=(char*)grib_context_malloc_clear(c,sizeof(char)*40);
     char* p;
     sprintf(sval,"%.18e",v);
     p=sval;
@@ -207,12 +207,12 @@ static void dump_values(grib_dumper* d, grib_accessor* a)
         fprintf(self->dumper.out,"/)\n");
         grib_context_free(c,values);
 
-        if ((r=compute_key_rank(h,self->keys,a->name))!=0)
+        if ((r=compute_bufr_key_rank(h,self->keys,a->name))!=0)
             fprintf(self->dumper.out,"  call codes_set(ibufr,'#%d#%s',rvalues)\n",r,a->name);
         else
             fprintf(self->dumper.out,"  call codes_set(ibufr,'%s',rvalues)\n",a->name);
     } else {
-        r=compute_key_rank(h,self->keys,a->name);
+        r=compute_bufr_key_rank(h,self->keys,a->name);
         if( !grib_is_missing_double(a,value) ) {
 
             sval=dval_to_string(c,value);
@@ -231,7 +231,7 @@ static void dump_values(grib_dumper* d, grib_accessor* a)
         int dofree=0;
 
         if (r!=0) {
-            prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+            prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
             dofree=1;
             sprintf(prefix,"#%d#%s",r,a->name);
         } else prefix=(char*)a->name;
@@ -310,7 +310,7 @@ static void dump_values_attribute(grib_dumper* d, grib_accessor* a, const char*
     if (self->isLeaf==0) {
         char* prefix1;
 
-        prefix1=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+strlen(prefix)+5));
+        prefix1=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+strlen(prefix)+5));
         sprintf(prefix1,"%s->%s",prefix,a->name);
 
         dump_attributes(d,a,prefix1);
@@ -344,9 +344,9 @@ static void dump_long(grib_dumper* d,grib_accessor* a, const char* comment)
             char* prefix;
             int dofree=0;
 
-            r=compute_key_rank(h,self->keys,a->name);
+            r=compute_bufr_key_rank(h,self->keys,a->name);
             if (r!=0) {
-                prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+                prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
                 dofree=1;
                 sprintf(prefix,"#%d#%s",r,a->name);
             } else prefix=(char*)a->name;
@@ -385,13 +385,13 @@ static void dump_long(grib_dumper* d,grib_accessor* a, const char* comment)
         fprintf(self->dumper.out,"/)\n");
         grib_context_free(a->context,values);
 
-        if ((r=compute_key_rank(h,self->keys,a->name))!=0)
+        if ((r=compute_bufr_key_rank(h,self->keys,a->name))!=0)
             fprintf(self->dumper.out,"  call codes_set(ibufr,'#%d#%s',ivalues)\n",r,a->name);
         else
             fprintf(self->dumper.out,"  call codes_set(ibufr,'%s',ivalues)\n",a->name);
 
     } else {
-        r=compute_key_rank(h,self->keys,a->name);
+        r=compute_bufr_key_rank(h,self->keys,a->name);
         if( !grib_is_missing_long(a,value) ) {
             if (r!=0)
                 fprintf(self->dumper.out,"  call codes_set(ibufr,'#%d#%s',",r,a->name);
@@ -407,7 +407,7 @@ static void dump_long(grib_dumper* d,grib_accessor* a, const char* comment)
         int dofree=0;
 
         if (r!=0) {
-            prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+            prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
             dofree=1;
             sprintf(prefix,"#%d#%s",r,a->name);
         } else prefix=(char*)a->name;
@@ -466,7 +466,7 @@ static void dump_long_attribute(grib_dumper* d, grib_accessor* a, const char* pr
         fprintf(self->dumper.out,"  call codes_set(ibufr,'%s->%s' &\n,ivalues)\n",prefix,a->name);
 
     } else {
-        /* int r=compute_key_rank(h,self->keys,a->name); */
+        /* int r=compute_bufr_key_rank(h,self->keys,a->name); */
         if( !grib_is_missing_long(a,value) ) {
             fprintf(self->dumper.out,"  call codes_set(ibufr,'%s->%s'&\n,",prefix,a->name);
             fprintf(self->dumper.out,"%ld)\n",value);
@@ -476,7 +476,7 @@ static void dump_long_attribute(grib_dumper* d, grib_accessor* a, const char* pr
     if (self->isLeaf==0) {
         char* prefix1;
 
-        prefix1=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+strlen(prefix)+5));
+        prefix1=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+strlen(prefix)+5));
         sprintf(prefix1,"%s->%s",prefix,a->name);
 
         dump_attributes(d,a,prefix1);
@@ -506,7 +506,7 @@ static void dump_double(grib_dumper* d, grib_accessor* a, const char* comment)
 
     self->empty=0;
 
-    r=compute_key_rank(h,self->keys,a->name);
+    r=compute_bufr_key_rank(h,self->keys,a->name);
     if( !grib_is_missing_double(a,value) ) {
         sval=dval_to_string(c,value);
         if (r!=0)
@@ -522,7 +522,7 @@ static void dump_double(grib_dumper* d, grib_accessor* a, const char* comment)
         int dofree=0;
 
         if (r!=0) {
-            prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+            prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
             dofree=1;
             sprintf(prefix,"#%d#%s",r,a->name);
         } else prefix=(char*)a->name;
@@ -577,7 +577,7 @@ static void dump_string_array(grib_dumper* d, grib_accessor* a, const char* comm
     fprintf(self->dumper.out,"    \"%s\" /)\n",values[i]);
 
     if (self->isLeaf==0) {
-        if ((r=compute_key_rank(h,self->keys,a->name))!=0)
+        if ((r=compute_bufr_key_rank(h,self->keys,a->name))!=0)
             fprintf(self->dumper.out,"  call codes_set_string_array(ibufr,'#%d#%s',svalues)\n",r,a->name);
         else
             fprintf(self->dumper.out,"  call codes_set_string_array(ibufr,'%s',svalues)\n",a->name);
@@ -588,7 +588,7 @@ static void dump_string_array(grib_dumper* d, grib_accessor* a, const char* comm
         int dofree=0;
 
         if (r!=0) {
-            prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+            prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
             dofree=1;
             sprintf(prefix,"#%d#%s",r,a->name);
         } else prefix=(char*)a->name;
@@ -629,7 +629,7 @@ static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment)
 
     err = grib_unpack_string(a,value,&size);
     p=value;
-    r=compute_key_rank(h,self->keys,a->name);
+    r=compute_bufr_key_rank(h,self->keys,a->name);
     if (grib_is_missing_string(a,(unsigned char *)value,size))
         return;
 
@@ -650,7 +650,7 @@ static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment)
         int dofree=0;
 
         if (r!=0) {
-            prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+            prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
             dofree=1;
             sprintf(prefix,"#%d#%s",r,a->name);
         } else prefix=(char*)a->name;
@@ -685,7 +685,7 @@ static void _dump_long_array(grib_handle* h, FILE* f, const char* key, const cha
 
     fprintf(f,"  ivalues=(/ ");
 
-    val=grib_context_malloc_clear(h->context,sizeof(long)*size);
+    val=(long*)grib_context_malloc_clear(h->context,sizeof(long)*size);
     grib_get_long_array(h,key,val,&size);
     for (i=0;i<size-1;i++) {
         if (icount>cols || i==0) {fprintf(f,"  &\n      ");icount=0;}
@@ -816,6 +816,7 @@ static void footer(grib_dumper* d, grib_handle* h)
     fprintf(self->dumper.out,"  call codes_write(ibufr,outfile)\n");
     fprintf(self->dumper.out,"  call codes_close_file(outfile)\n");
     fprintf(self->dumper.out,"  call codes_release(ibufr)\n");
+    fprintf(self->dumper.out,"  print *, \"Created output BUFR file 'outfile.bufr'\"\n");
     fprintf(self->dumper.out,"  if(allocated(ivalues)) deallocate(ivalues)\n");
     fprintf(self->dumper.out,"  if(allocated(rvalues)) deallocate(rvalues)\n");
     fprintf(self->dumper.out,"  if(allocated(svalues)) deallocate(svalues)\n");
diff --git a/src/grib_dumper_class_bufr_encode_python.c b/src/grib_dumper_class_bufr_encode_python.c
index 26abceb..747ea48 100644
--- a/src/grib_dumper_class_bufr_encode_python.c
+++ b/src/grib_dumper_class_bufr_encode_python.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -122,7 +122,7 @@ static int init(grib_dumper* d)
     d->count=1;
     self->isLeaf=0;
     self->isAttribute=0;
-    self->keys=grib_context_malloc_clear(c,sizeof(grib_string_list));
+    self->keys=(grib_string_list*)grib_context_malloc_clear(c,sizeof(grib_string_list));
 
     return GRIB_SUCCESS;
 }
@@ -144,7 +144,7 @@ static int destroy(grib_dumper* d)
 
 static char* dval_to_string(const grib_context* c,double v)
 {
-    char* sval=grib_context_malloc_clear(c,sizeof(char)*40);
+    char* sval=(char*)grib_context_malloc_clear(c,sizeof(char)*40);
     sprintf(sval,"%.18e",v);
     return sval;
 }
@@ -198,12 +198,12 @@ static void dump_values(grib_dumper* d,grib_accessor* a)
         fprintf(self->dumper.out,",)\n");
         grib_context_free(c,values);
 
-        if ((r=compute_key_rank(h,self->keys,a->name))!=0)
+        if ((r=compute_bufr_key_rank(h,self->keys,a->name))!=0)
             fprintf(self->dumper.out,"    codes_set_array(ibufr, '#%d#%s', rvalues)\n",r,a->name);
         else
             fprintf(self->dumper.out,"    codes_set_array(ibufr, '%s', rvalues)\n",a->name);
     } else {
-        r=compute_key_rank(h,self->keys,a->name);
+        r=compute_bufr_key_rank(h,self->keys,a->name);
         if( !grib_is_missing_double(a,value) ) {
 
             sval=dval_to_string(c,value);
@@ -221,7 +221,7 @@ static void dump_values(grib_dumper* d,grib_accessor* a)
         int dofree=0;
 
         if (r!=0) {
-            prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+            prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
             dofree=1;
             sprintf(prefix,"#%d#%s",r,a->name);
         } else prefix=(char*)a->name;
@@ -285,7 +285,7 @@ static void dump_values_attribute(grib_dumper* d,grib_accessor* a, const char* p
 
         fprintf(self->dumper.out,"    codes_set_array(ibufr, '%s->%s' \n, rvalues)\n",prefix,a->name);
     } else {
-        /* int r=compute_key_rank(h,self->keys,a->name); */
+        /* int r=compute_bufr_key_rank(h,self->keys,a->name); */
         if( !grib_is_missing_double(a,value) ) {
 
             sval=dval_to_string(c,value);
@@ -298,7 +298,7 @@ static void dump_values_attribute(grib_dumper* d,grib_accessor* a, const char* p
     if (self->isLeaf==0) {
         char* prefix1;
 
-        prefix1=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+strlen(prefix)+5));
+        prefix1=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+strlen(prefix)+5));
         sprintf(prefix1,"%s->%s",prefix,a->name);
 
         dump_attributes(d,a,prefix1);
@@ -332,9 +332,9 @@ static void dump_long(grib_dumper* d, grib_accessor* a, const char* comment)
             char* prefix;
             int dofree=0;
 
-            r=compute_key_rank(h,self->keys,a->name);
+            r=compute_bufr_key_rank(h,self->keys,a->name);
             if (r!=0) {
-                prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+                prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
                 dofree=1;
                 sprintf(prefix,"#%d#%s",r,a->name);
             } else prefix=(char*)a->name;
@@ -371,13 +371,13 @@ static void dump_long(grib_dumper* d, grib_accessor* a, const char* comment)
         fprintf(self->dumper.out,",)\n");
         grib_context_free(a->context,values);
 
-        if ((r=compute_key_rank(h,self->keys,a->name))!=0)
+        if ((r=compute_bufr_key_rank(h,self->keys,a->name))!=0)
             fprintf(self->dumper.out,"    codes_set_array(ibufr, '#%d#%s', ivalues)\n",r,a->name);
         else
             fprintf(self->dumper.out,"    codes_set_array(ibufr, '%s', ivalues)\n",a->name);
 
     } else {
-        r=compute_key_rank(h,self->keys,a->name);
+        r=compute_bufr_key_rank(h,self->keys,a->name);
         if( !grib_is_missing_long(a,value) ) {
             if (r!=0)
                 fprintf(self->dumper.out,"    codes_set(ibufr, '#%d#%s', ",r,a->name);
@@ -393,7 +393,7 @@ static void dump_long(grib_dumper* d, grib_accessor* a, const char* comment)
         int dofree=0;
 
         if (r!=0) {
-            prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+            prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
             dofree=1;
             sprintf(prefix,"#%d#%s",r,a->name);
         } else prefix=(char*)a->name;
@@ -450,7 +450,7 @@ static void dump_long_attribute(grib_dumper* d, grib_accessor* a, const char* pr
         fprintf(self->dumper.out,"    codes_set_array(ibufr, '%s->%s' \n,ivalues)\n",prefix,a->name);
 
     } else {
-        /* int r=compute_key_rank(h,self->keys,a->name); */
+        /* int r=compute_bufr_key_rank(h,self->keys,a->name); */
         if( !grib_is_missing_long(a,value) ) {
             fprintf(self->dumper.out,"    codes_set(ibufr, '%s->%s'\n,",prefix,a->name);
             fprintf(self->dumper.out,"%ld)\n",value);
@@ -460,7 +460,7 @@ static void dump_long_attribute(grib_dumper* d, grib_accessor* a, const char* pr
     if (self->isLeaf==0) {
         char* prefix1;
 
-        prefix1=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+strlen(prefix)+5));
+        prefix1=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+strlen(prefix)+5));
         sprintf(prefix1,"%s->%s",prefix,a->name);
 
         dump_attributes(d,a,prefix1);
@@ -490,7 +490,7 @@ static void dump_double(grib_dumper* d,grib_accessor* a,const char* comment)
 
     self->empty=0;
 
-    r=compute_key_rank(h,self->keys,a->name);
+    r=compute_bufr_key_rank(h,self->keys,a->name);
     if( !grib_is_missing_double(a,value) ) {
         sval=dval_to_string(c,value);
         if (r!=0)
@@ -506,7 +506,7 @@ static void dump_double(grib_dumper* d,grib_accessor* a,const char* comment)
         int dofree=0;
 
         if (r!=0) {
-            prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+            prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
             dofree=1;
             sprintf(prefix,"#%d#%s",r,a->name);
         } else prefix=(char*)a->name;
@@ -558,7 +558,7 @@ static void dump_string_array(grib_dumper* d,grib_accessor* a,const char* commen
     fprintf(self->dumper.out,"    \"%s\", )\n",values[i]);
 
     if (self->isLeaf==0) {
-        if ((r=compute_key_rank(h,self->keys,a->name))!=0)
+        if ((r=compute_bufr_key_rank(h,self->keys,a->name))!=0)
             fprintf(self->dumper.out,"    codes_set_string_array(ibufr, '#%d#%s', svalues)\n",r,a->name);
         else
             fprintf(self->dumper.out,"    codes_set_string_array(ibufr, '%s', svalues)\n",a->name);
@@ -569,7 +569,7 @@ static void dump_string_array(grib_dumper* d,grib_accessor* a,const char* commen
         int dofree=0;
 
         if (r!=0) {
-            prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+            prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
             dofree=1;
             sprintf(prefix,"#%d#%s",r,a->name);
         } else prefix=(char*)a->name;
@@ -610,7 +610,7 @@ static void dump_string(grib_dumper* d,grib_accessor* a,const char* comment)
 
     err = grib_unpack_string(a,value,&size);
     p=value;
-    r=compute_key_rank(h,self->keys,a->name);
+    r=compute_bufr_key_rank(h,self->keys,a->name);
     if (grib_is_missing_string(a,(unsigned char *)value,size))
         return;
 
@@ -631,7 +631,7 @@ static void dump_string(grib_dumper* d,grib_accessor* a,const char* comment)
         int dofree=0;
 
         if (r!=0) {
-            prefix=grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
+            prefix=(char*)grib_context_malloc_clear(c,sizeof(char)*(strlen(a->name)+10));
             dofree=1;
             sprintf(prefix,"#%d#%s",r,a->name);
         } else prefix=(char*)a->name;
@@ -663,7 +663,7 @@ static void _dump_long_array(grib_handle* h, FILE* f, const char* key, const cha
 
     fprintf(f,"    ivalues = (");
 
-    val=grib_context_malloc_clear(h->context,sizeof(long)*size);
+    val=(long*)grib_context_malloc_clear(h->context,sizeof(long)*size);
     grib_get_long_array(h,key,val,&size);
     for (i=0;i<size-1;i++) {
         if (icount>cols || i==0) {fprintf(f,"  \n      ");icount=0;}
@@ -784,6 +784,7 @@ static void footer(grib_dumper* d, grib_handle* h)
         fprintf(self->dumper.out,"    outfile = open('outfile.bufr', 'a')\n");
 
     fprintf(self->dumper.out,"    codes_write(ibufr, outfile)\n");
+    fprintf(self->dumper.out,"    print \"Created output BUFR file 'outfile.bufr'.\"\n");
     /*fprintf(self->dumper.out,"    codes_close_file(outfile)\n");*/
     fprintf(self->dumper.out,"    codes_release(ibufr)\n");
 }
diff --git a/src/grib_dumper_class_debug.c b/src/grib_dumper_class_debug.c
index f4a6f05..e3754f6 100644
--- a/src/grib_dumper_class_debug.c
+++ b/src/grib_dumper_class_debug.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_dumper_class_default.c b/src/grib_dumper_class_default.c
index a1aba85..2e40333 100644
--- a/src/grib_dumper_class_default.c
+++ b/src/grib_dumper_class_default.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -409,8 +409,10 @@ static void dump_string(grib_dumper* d,grib_accessor* a,const char* comment)
     err = grib_unpack_string(a,value,&size);
     p=value;
 
-    if ( (a->flags & GRIB_ACCESSOR_FLAG_DUMP) == 0)
+    if ( (a->flags & GRIB_ACCESSOR_FLAG_DUMP) == 0) {
+        grib_context_free(c,value);
         return;
+    }
 
     while(*p) { if(!isprint(*p)) *p = '.'; p++; }
 
diff --git a/src/grib_dumper_class_grib_encode_C.c b/src/grib_dumper_class_grib_encode_C.c
index 6c1bb4d..ad69acb 100644
--- a/src/grib_dumper_class_grib_encode_C.c
+++ b/src/grib_dumper_class_grib_encode_C.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_dumper_class_json.c b/src/grib_dumper_class_json.c
index 5f5e545..f12b412 100644
--- a/src/grib_dumper_class_json.c
+++ b/src/grib_dumper_class_json.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -327,7 +327,7 @@ static void dump_double(grib_dumper* d,grib_accessor* a,const char* comment)
 static void dump_string_array(grib_dumper* d,grib_accessor* a,const char* comment)
 {
     grib_dumper_json *self = (grib_dumper_json*)d;
-    char **values;
+    char **values = NULL;
     size_t size = 0,i=0;
     grib_context* c=NULL;
     int err = 0;
@@ -371,7 +371,7 @@ static void dump_string_array(grib_dumper* d,grib_accessor* a,const char* commen
     }
     fprintf(self->dumper.out,"\n%-*s[",depth," ");
     depth+=2;
-    for  (i=0;i<size-1;i++) {
+    for (i=0;i<size-1;i++) {
         fprintf(self->dumper.out,"%-*s\"%s\",\n",depth," ",values[i]);
     }
     fprintf(self->dumper.out,"%-*s\"%s\"\n",depth," ",values[i]);
@@ -387,6 +387,9 @@ static void dump_string_array(grib_dumper* d,grib_accessor* a,const char* commen
         fprintf(self->dumper.out,"\n%-*s}",depth," ");
     }
 
+    for (i=0;i<size;i++) {
+        grib_context_free(c, values[i]);
+    }
     grib_context_free(c,values);
     (void)err; /* TODO */
 }
diff --git a/src/grib_dumper_class_keys.c b/src/grib_dumper_class_keys.c
index 6fcebf8..eb8c847 100644
--- a/src/grib_dumper_class_keys.c
+++ b/src/grib_dumper_class_keys.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_dumper_class_serialize.c b/src/grib_dumper_class_serialize.c
index 391f64c..83e5048 100644
--- a/src/grib_dumper_class_serialize.c
+++ b/src/grib_dumper_class_serialize.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_dumper_class_wmo.c b/src/grib_dumper_class_wmo.c
index 3231ba3..3ea0186 100644
--- a/src/grib_dumper_class_wmo.c
+++ b/src/grib_dumper_class_wmo.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -249,7 +249,7 @@ static void dump_bits(grib_dumper* d,grib_accessor* a,const char* comment)
 static void dump_double(grib_dumper* d,grib_accessor* a,const char* comment)
 {
     grib_dumper_wmo *self = (grib_dumper_wmo*)d;
-    double value; size_t size = 1;
+    double value=0; size_t size = 1;
     int err = grib_unpack_double(a,&value,&size);
 
 
diff --git a/src/grib_dumper_class_xml.c b/src/grib_dumper_class_xml.c
deleted file mode 100644
index 29c91c4..0000000
--- a/src/grib_dumper_class_xml.c
+++ /dev/null
@@ -1,693 +0,0 @@
-/*
- * Copyright 2005-2016 ECMWF.
- *
- * This software is licensed under the terms of the Apache Licence Version 2.0
- * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
- *
- * In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
- * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
- */
-
-/**************************************
- *  Enrico Fucile
- **************************************/
-
-
-#include "grib_api_internal.h"
-#include <ctype.h>
-/*
-   This is used by make_class.pl
-
-   START_CLASS_DEF
-   CLASS      = dumper
-   IMPLEMENTS = dump_long;dump_bits
-   IMPLEMENTS = dump_double;dump_string;dump_string_array
-   IMPLEMENTS = dump_bytes;dump_values
-   IMPLEMENTS = dump_label;dump_section
-   IMPLEMENTS = init;destroy
-   MEMBERS = long section_offset
-   MEMBERS = long begin
-   MEMBERS = long end
-   END_CLASS_DEF
-
- */
-
-
-/* START_CLASS_IMP */
-
-/*
-
-Don't edit anything between START_CLASS_IMP and END_CLASS_IMP
-Instead edit values between START_CLASS_DEF and END_CLASS_DEF
-or edit "dumper.class" and rerun ./make_class.pl
-
-*/
-
-static void init_class      (grib_dumper_class*);
-static int init            (grib_dumper* d);
-static int destroy         (grib_dumper*);
-static void dump_long       (grib_dumper* d, grib_accessor* a,const char* comment);
-static void dump_bits       (grib_dumper* d, grib_accessor* a,const char* comment);
-static void dump_double     (grib_dumper* d, grib_accessor* a,const char* comment);
-static void dump_string     (grib_dumper* d, grib_accessor* a,const char* comment);
-static void dump_string_array     (grib_dumper* d, grib_accessor* a,const char* comment);
-static void dump_bytes      (grib_dumper* d, grib_accessor* a,const char* comment);
-static void dump_values     (grib_dumper* d, grib_accessor* a);
-static void dump_label      (grib_dumper* d, grib_accessor* a,const char* comment);
-static void dump_section    (grib_dumper* d, grib_accessor* a,grib_block_of_accessors* block);
-
-typedef struct grib_dumper_xml {
-    grib_dumper          dumper;  
-/* Members defined in xml */
-	long section_offset;
-	long begin;
-	long end;
-} grib_dumper_xml;
-
-
-static grib_dumper_class _grib_dumper_class_xml = {
-    0,                              /* super                     */
-    "xml",                              /* name                      */
-    sizeof(grib_dumper_xml),     /* size                      */
-    0,                                   /* inited */
-    &init_class,                         /* init_class */
-    &init,                               /* init                      */
-    &destroy,                            /* free mem                       */
-    &dump_long,                          /* dump long         */
-    &dump_double,                        /* dump double    */
-    &dump_string,                        /* dump string    */
-    &dump_string_array,                        /* dump string array   */
-    &dump_label,                         /* dump labels  */
-    &dump_bytes,                         /* dump bytes  */
-    &dump_bits,                          /* dump bits   */
-    &dump_section,                       /* dump section      */
-    &dump_values,                        /* dump values   */
-    0,                             /* header   */
-    0,                             /* footer   */
-};
-
-grib_dumper_class* grib_dumper_class_xml = &_grib_dumper_class_xml;
-
-/* END_CLASS_IMP */
-
-static void print_offset(FILE* out,grib_dumper* d,grib_accessor* a);
-
-static void init_class      (grib_dumper_class* c){}
-
-static int  init(grib_dumper* d)
-{
-    grib_dumper_xml *self = (grib_dumper_xml*)d;
-    self->section_offset=0;
-
-    return GRIB_SUCCESS;
-}
-
-static int  destroy  (grib_dumper* d)
-{
-    return GRIB_SUCCESS;
-}
-
-static void aliases(grib_dumper* d,grib_accessor* a)
-{
-    int i;
-    grib_dumper_xml *self = (grib_dumper_xml*)d;
-
-    if( (d->option_flags & GRIB_DUMP_FLAG_ALIASES) == 0)
-        return;
-
-    if(a->all_names[1])
-    {
-        char *sep = "";
-        fprintf(self->dumper.out,"  ");
-        fprintf(self->dumper.out,"# ALIASES: ");
-
-        for(i = 1; i < MAX_ACCESSOR_NAMES; i++)
-        {
-            if(a->all_names[i])
-            {
-                if(a->all_name_spaces[i])
-                    fprintf(self->dumper.out,"%s%s.%s", sep,a->all_name_spaces[i],a->all_names[i]);
-                else
-                    fprintf(self->dumper.out,"%s%s", sep,a->all_names[i]);
-            }
-            sep = ", ";
-        }
-        fprintf(self->dumper.out,"\n");
-    }
-}
-
-static void dump_long(grib_dumper* d,grib_accessor* a,const char* comment)
-{
-    grib_dumper_xml *self = (grib_dumper_xml*)d;
-    long value; size_t size = 1;
-    long *values=NULL;
-    int err = 0;
-    int i;
-    long count=0;
-
-    grib_value_count(a,&count);
-    size=count;
-
-    if ( (a->flags & GRIB_ACCESSOR_FLAG_XML) == 0)
-        return;
-
-    print_offset(self->dumper.out,d,a);
-
-    if ((d->option_flags & GRIB_DUMP_FLAG_TYPE) != 0){
-        fprintf(self->dumper.out,"  ");
-        fprintf(self->dumper.out,"# type %s \n",a->creator->op);
-    }
-
-    if (size>1) {
-        values=(long*)grib_context_malloc_clear(a->context,sizeof(long)*size);
-        err=grib_unpack_long(a,values,&size);
-    } else {
-        err=grib_unpack_long(a,&value,&size);
-    }
-
-    aliases(d,a);
-    if(comment) {
-        fprintf(self->dumper.out,"  ");
-        fprintf(self->dumper.out,"# %s \n",comment);
-    }
-
-    if (a->flags & GRIB_ACCESSOR_FLAG_READ_ONLY) {
-        fprintf(self->dumper.out,"  ");
-        fprintf(self->dumper.out,"#-READ ONLY- ");
-    } else
-        fprintf(self->dumper.out,"  ");
-
-    if (size>1) {
-        int cols=9;
-        int icount=0;
-        int lens=strlen(a->name);
-        fprintf(self->dumper.out,"%s = { ",a->name);
-        for (i=0;i<size;i++) {
-            if (icount>cols) {fprintf(self->dumper.out,"\n%-*s",lens+7," ");icount=0;}
-            fprintf(self->dumper.out,"%ld, ",values[i]);
-            icount++;
-        }
-        fprintf(self->dumper.out,"\n%-*s}",lens+5," ");
-        grib_context_free(a->context,values);
-    } else {
-        if( ((a->flags & GRIB_ACCESSOR_FLAG_CAN_BE_MISSING) != 0) && grib_is_missing_internal(a) )
-            fprintf(self->dumper.out,"%s = MISSING;",a->name);
-        else
-            fprintf(self->dumper.out,"%s = %ld;",a->name,value);
-    }
-
-    if(err) {
-        fprintf(self->dumper.out,"  ");
-        fprintf(self->dumper.out,"# *** ERR=%d (%s)",err,grib_get_error_message(err));
-    }
-
-    fprintf(self->dumper.out,"\n");
-}
-
-static int test_bit(long a, long b) {return a&(1<<b);}
-
-static void dump_bits(grib_dumper* d,grib_accessor* a,const char* comment)
-{
-    grib_dumper_xml *self = (grib_dumper_xml*)d;
-    int i;
-    long lvalue;
-    double dvalue;
-    size_t size = 1;
-    int err = 0;
-    int isDouble=0;
-
-    switch (grib_accessor_get_native_type(a)) {
-    case GRIB_TYPE_LONG:
-        grib_unpack_long(a,&lvalue,&size);
-        break;
-    case GRIB_TYPE_DOUBLE:
-        grib_unpack_double(a,&dvalue,&size);
-        isDouble=1;
-        break;
-    default:
-        break;
-    }
-
-    if ( (a->flags & GRIB_ACCESSOR_FLAG_XML) == 0)
-        return;
-
-    print_offset(self->dumper.out,d,a);
-
-    if ((d->option_flags & GRIB_DUMP_FLAG_TYPE) != 0) {
-        fprintf(self->dumper.out,"  ");
-        fprintf(self->dumper.out,"# type %s \n",a->creator->op);
-    }
-
-    aliases(d,a);
-    if(comment) {
-        fprintf(self->dumper.out,"  ");
-        fprintf(self->dumper.out,"# %s \n",comment);
-    }
-
-    fprintf(self->dumper.out,"  ");
-    fprintf(self->dumper.out,"# flags: ");
-    for(i=0;i<(a->length*8);i++) {
-        if(test_bit(lvalue,a->length*8-i-1))
-            fprintf(self->dumper.out,"1");
-        else
-            fprintf(self->dumper.out,"0");
-    }
-    fprintf(self->dumper.out,"\n");
-
-    if (a->flags & GRIB_ACCESSOR_FLAG_READ_ONLY) {
-        fprintf(self->dumper.out,"  ");
-        fprintf(self->dumper.out,"#-READ ONLY- ");
-    } else
-        fprintf(self->dumper.out,"  ");
-
-    if( ((a->flags & GRIB_ACCESSOR_FLAG_CAN_BE_MISSING) != 0) && grib_is_missing_internal(a) )
-        fprintf(self->dumper.out,"%s = MISSING;",a->name);
-    else {
-        if (isDouble)
-            fprintf(self->dumper.out,"%s = %g;",a->name,dvalue);
-        else
-            fprintf(self->dumper.out,"%s = %ld;",a->name,lvalue);
-    }
-
-    if(err) {
-        fprintf(self->dumper.out,"  ");
-        fprintf(self->dumper.out,"# *** ERR=%d (%s)",err,grib_get_error_message(err));
-    }
-
-    fprintf(self->dumper.out,"\n");
-}
-
-static void dump_double(grib_dumper* d,grib_accessor* a,const char* comment)
-{
-    grib_dumper_xml *self = (grib_dumper_xml*)d;
-    double value; size_t size = 1;
-    int err = grib_unpack_double(a,&value,&size);
-
-
-    if ( (a->flags & GRIB_ACCESSOR_FLAG_XML) == 0)
-        return;
-
-    print_offset(self->dumper.out,d,a);
-
-    if ((d->option_flags & GRIB_DUMP_FLAG_TYPE) != 0) {
-        fprintf(self->dumper.out,"  ");
-        fprintf(self->dumper.out,"# type %s \n",a->creator->op);
-    }
-
-    aliases(d,a);
-    if(comment) {
-        fprintf(self->dumper.out,"  ");
-        fprintf(self->dumper.out,"# %s \n",comment);
-    }
-
-
-    if (a->flags & GRIB_ACCESSOR_FLAG_READ_ONLY) {
-        fprintf(self->dumper.out,"  ");
-        fprintf(self->dumper.out,"#-READ ONLY- ");
-    } else
-        fprintf(self->dumper.out,"  ");
-
-    if( ((a->flags & GRIB_ACCESSOR_FLAG_CAN_BE_MISSING) != 0) && grib_is_missing_internal(a) )
-        fprintf(self->dumper.out,"%s = MISSING;",a->name);
-    else
-        fprintf(self->dumper.out,"%s = %g;",a->name,value);
-
-
-    if(err) {
-        fprintf(self->dumper.out,"  ");
-        fprintf(self->dumper.out,"# *** ERR=%d (%s)",err,grib_get_error_message(err));
-    }
-
-    fprintf(self->dumper.out,"\n");
-}
-
-static void dump_string_array(grib_dumper* d,grib_accessor* a,const char* comment)
-{
-    grib_dumper_xml *self = (grib_dumper_xml*)d;
-    char **values;
-    size_t size = 0,i=0;
-    grib_context* c=NULL;
-    int err = 0;
-    int tab=0;
-    long count=0;
-
-    c=a->context;
-
-    grib_value_count(a,&count);
-    size=count;
-
-    values=(char**)grib_context_malloc_clear(c,size*sizeof(char*));
-    if (!values) {
-        grib_context_log(c,GRIB_LOG_FATAL,"unable to allocate %d bytes",(int)size);
-        return;
-    }
-
-    err = grib_unpack_string_array(a,values,&size);
-
-    if ( (a->flags & GRIB_ACCESSOR_FLAG_XML) == 0)
-        return;
-
-
-    print_offset(self->dumper.out,d,a);
-
-    if ((d->option_flags & GRIB_DUMP_FLAG_TYPE) != 0) {
-        fprintf(self->dumper.out,"  ");
-        fprintf(self->dumper.out,"# type %s \n",a->creator->op);
-    }
-
-    aliases(d,a);
-    if(comment) {
-        fprintf(self->dumper.out,"  ");
-        fprintf(self->dumper.out,"# %s \n",comment);
-    }
-
-    if (a->flags & GRIB_ACCESSOR_FLAG_READ_ONLY) {
-        fprintf(self->dumper.out,"  ");
-        fprintf(self->dumper.out,"#-READ ONLY- ");
-        tab=13;
-    } else
-        fprintf(self->dumper.out,"  ");
-
-    tab++;
-    fprintf(self->dumper.out,"%s = {\n",a->name);
-    for  (i=0;i<size;i++) {
-        fprintf(self->dumper.out,"%-*s\"%s\",\n",(int)(tab+strlen(a->name)+4)," ",values[i]);
-    }
-    fprintf(self->dumper.out,"  }");
-
-    if(err) {
-        fprintf(self->dumper.out,"  ");
-        fprintf(self->dumper.out,"# *** ERR=%d (%s)",err,grib_get_error_message(err));
-    }
-
-    fprintf(self->dumper.out,"\n");
-    grib_context_free(c,values);
-}
-
-static void dump_string(grib_dumper* d,grib_accessor* a,const char* comment)
-{
-    grib_dumper_xml *self = (grib_dumper_xml*)d;
-    char *value=NULL;
-    char *p = NULL;
-    size_t size = 0;
-    grib_context* c=NULL;
-    int err = _grib_get_string_length(a,&size);
-
-    c=a->context;
-    if (size==0) return;
-
-    value=(char*)grib_context_malloc_clear(c,size);
-    if (!value) {
-        grib_context_log(c,GRIB_LOG_FATAL,"unable to allocate %d bytes",(int)size);
-        return;
-    }
-
-    err = grib_unpack_string(a,value,&size);
-    p=value;
-
-    if ( (a->flags & GRIB_ACCESSOR_FLAG_XML) == 0)
-        return;
-
-    while(*p) { if(!isprint(*p)) *p = '.'; p++; }
-
-    print_offset(self->dumper.out,d,a);
-
-    if ((d->option_flags & GRIB_DUMP_FLAG_TYPE) != 0) {
-        fprintf(self->dumper.out,"  ");
-        fprintf(self->dumper.out,"# type %s \n",a->creator->op);
-    }
-
-    aliases(d,a);
-    if(comment) {
-        fprintf(self->dumper.out,"  ");
-        fprintf(self->dumper.out,"# %s \n",comment);
-    }
-
-    if (a->flags & GRIB_ACCESSOR_FLAG_READ_ONLY) {
-        fprintf(self->dumper.out,"  ");
-        fprintf(self->dumper.out,"#-READ ONLY- ");
-    } else
-        fprintf(self->dumper.out,"  ");
-
-    if( ((a->flags & GRIB_ACCESSOR_FLAG_CAN_BE_MISSING) != 0) && grib_is_missing_internal(a) )
-        fprintf(self->dumper.out,"%s = MISSING;",a->name);
-    else
-        fprintf(self->dumper.out,"%s = %s;",a->name,value);
-
-
-    if(err) {
-        fprintf(self->dumper.out,"  ");
-        fprintf(self->dumper.out,"# *** ERR=%d (%s)",err,grib_get_error_message(err));
-    }
-
-    fprintf(self->dumper.out,"\n");
-    grib_context_free(c,value);
-}
-
-static void dump_bytes(grib_dumper* d,grib_accessor* a,const char* comment)
-{
-
-#if 0
-    grib_dumper_xml *self = (grib_dumper_xml*)d;
-    int i,k,err =0;
-    int more = 0;
-    size_t size = a->length;
-    unsigned char* buf = grib_context_malloc(d->handle->context,size);
-
-    if ( (a->flags & GRIB_ACCESSOR_FLAG_XML) == 0)
-        return;
-
-
-    if (a->flags & GRIB_ACCESSOR_FLAG_READ_ONLY)
-        fprintf(self->dumper.out,"-READ ONLY- ");
-
-    /*for(i = 0; i < d->depth ; i++) fprintf(self->dumper.out," ");*/
-    /*print_offset(self->dumper.out,self->begin,self->end);*/
-    if ((d->option_flags & GRIB_DUMP_FLAG_TYPE) != 0)
-        fprintf(self->dumper.out,"%s ",a->creator->op);
-
-    fprintf(self->dumper.out,"%s = %ld",a->name,a->length);
-    aliases(d,a);
-    fprintf(self->dumper.out," {");
-
-    if(!buf)
-    {
-        if(size == 0)
-            fprintf(self->dumper.out,"}\n");
-        else
-            fprintf(self->dumper.out," *** ERR cannot malloc(%ld) }\n",(long)size);
-        return;
-    }
-
-    fprintf(self->dumper.out,"\n");
-
-    err = grib_unpack_bytes(a,buf,&size);
-    if(err){
-        grib_context_free(d->handle->context,buf);
-        fprintf(self->dumper.out," *** ERR=%d (%s) \n}",err,grib_get_error_message(err));
-        return ;
-    }
-
-    if(size > 100) {
-        more = size - 100;
-        size = 100;
-    }
-
-    k = 0;
-    /* if(size > 100) size = 100;  */
-    while(k < size)
-    {
-        int j;
-        for(i = 0; i < d->depth + 3 ; i++) fprintf(self->dumper.out," ");
-        for(j = 0; j < 16 && k < size; j++, k++)
-        {
-            fprintf(self->dumper.out,"%02x",buf[k]);
-            if(k != size-1)
-                fprintf(self->dumper.out,", ");
-        }
-        fprintf(self->dumper.out,"\n");
-    }
-
-    if(more)
-    {
-        for(i = 0; i < d->depth + 3 ; i++) fprintf(self->dumper.out," ");
-        fprintf(self->dumper.out,"... %d more values\n",more);
-    }
-
-    for(i = 0; i < d->depth ; i++) fprintf(self->dumper.out," ");
-    fprintf(self->dumper.out,"} # %s %s \n",a->creator->op, a->name);
-    grib_context_free(d->handle->context,buf);
-#endif
-}
-
-static void dump_values(grib_dumper* d,grib_accessor* a)
-{
-    grib_dumper_xml *self = (grib_dumper_xml*)d;
-    int k,err =0;
-    int more = 0;
-    double*  buf = NULL;
-    size_t size=0;
-    long count=0;
-
-    if ( (a->flags & GRIB_ACCESSOR_FLAG_XML) == 0)
-        return;
-
-    grib_value_count(a,&count);
-    size=count;
-    if(size == 1){
-        dump_double(d,a,NULL);
-        return ;
-    }
-    buf = (double*)grib_context_malloc(d->handle->context,size * sizeof(double));
-
-    print_offset(self->dumper.out,d,a);
-
-    if ((d->option_flags & GRIB_DUMP_FLAG_TYPE) != 0) {
-        fprintf(self->dumper.out,"  ");
-        fprintf(self->dumper.out,"# type %s \n",a->creator->op);
-    }
-
-    aliases(d,a);
-
-    if (a->flags & GRIB_ACCESSOR_FLAG_READ_ONLY) {
-        fprintf(self->dumper.out,"  ");
-        fprintf(self->dumper.out,"#-READ ONLY- ");
-    } else
-        fprintf(self->dumper.out,"  ");
-
-    fprintf(self->dumper.out,"%s(%ld) = ",a->name,(long)size);
-    fprintf(self->dumper.out," {");
-
-    if(!buf)
-    {
-        if(size == 0)
-            fprintf(self->dumper.out,"}\n");
-        else
-            fprintf(self->dumper.out," *** ERR cannot malloc(%ld) }\n",(long)size);
-        return;
-    }
-
-    fprintf(self->dumper.out,"\n");
-
-    err =  grib_unpack_double(a,buf,&size);
-
-    if(err){
-        grib_context_free(d->handle->context,buf);
-        fprintf(self->dumper.out," *** ERR=%d (%s) \n}",err,grib_get_error_message(err));
-        return ;
-    }
-
-    if(!(d->option_flags & GRIB_DUMP_FLAG_ALL_DATA) && size > 100) {
-        more = size - 100;
-        size = 100;
-    }
-
-    k = 0;
-    while(k < size)  {
-#if 1
-        int j;
-        fprintf(self->dumper.out,"  ");
-        for(j = 0; j < 5 && k < size; j++, k++)  {
-            fprintf(self->dumper.out,"%g",buf[k]);
-            if(k != size-1)
-                fprintf(self->dumper.out,", ");
-        }
-        fprintf(self->dumper.out,"\n");
-#else
-
-        fprintf(self->dumper.out,"%d %g\n",k,buf[k]);
-
-#endif
-
-    }  if(more)  {
-        fprintf(self->dumper.out,"  ");
-        fprintf(self->dumper.out,"... %d more values\n",more);
-    }
-
-    fprintf(self->dumper.out,"  ");
-    fprintf(self->dumper.out,"} \n");
-    grib_context_free(d->handle->context,buf);
-}
-
-static void dump_label(grib_dumper* d,grib_accessor* a,const char* comment)
-{
-    /*grib_dumper_xml *self = (grib_dumper_xml*)d;
-
-  for(i = 0; i < d->depth ; i++) fprintf(self->dumper.out," ");
-  fprintf(self->dumper.out,"----> %s %s %s\n",a->creator->op, a->name,comment?comment:"");*/
-}
-
-static void dump_section(grib_dumper* d,grib_accessor* a,grib_block_of_accessors* block)
-{
-    grib_dumper_xml *self = (grib_dumper_xml*)d;
-    int i;
-    /* grib_section* s = grib_get_sub_section(a); */
-    grib_section* s = a->sub_section;
-
-    if ( (a->flags & GRIB_ACCESSOR_FLAG_XML) == 0)
-        return;
-
-#if 1
-    if(a->name[0] == '_'){
-        grib_dump_accessors_block(d,block);
-        return;
-    }
-#endif
-    for(i = 0; i < d->depth ; i++) fprintf(self->dumper.out," ");
-    fprintf(self->dumper.out,"======> %s %s (%ld,%ld,%ld)\n",a->creator->op,
-            a->name,a->length,(long)s->length,(long)s->padding);
-    if (!strncmp(a->name,"section",7)) self->section_offset=a->offset;
-    /*printf("------------- section_offset = %ld\n",self->section_offset);*/
-    d->depth += 3;
-    grib_dump_accessors_block(d,block);
-    d->depth -= 3;
-
-    for(i = 0; i < d->depth ; i++) fprintf(self->dumper.out," ");
-    fprintf(self->dumper.out,"<===== %s %s\n",a->creator->op, a->name);
-}
-
-static void print_offset(FILE* out,grib_dumper* d,grib_accessor* a) {
-    int i,k;
-    long offset;
-    long begin=0,end=0;
-    size_t size=0,more=0;
-    grib_dumper_xml *self = (grib_dumper_xml*)d;
-    grib_handle* h=grib_handle_of_accessor(a);
-
-    begin=a->offset-self->section_offset+1;;
-    end =grib_get_next_position_offset(a)-self->section_offset;
-
-    if ((d->option_flags & GRIB_DUMP_FLAG_HEXADECIMAL) != 0 && a->length != 0) {
-        if (begin == end) {
-            fprintf(self->dumper.out,"  ");
-            fprintf(out,"# Octet: ");
-            fprintf(out,"%ld" ,begin);
-        }
-        else {
-            fprintf(self->dumper.out,"  ");
-            fprintf(out,"# Octets: ");
-            fprintf(out,"%ld-%ld" ,begin,end);
-        }
-        fprintf(out,"  = ");
-        size=a->length;
-
-        if(!(d->option_flags & GRIB_DUMP_FLAG_ALL_DATA) && size > 112) {
-            more = size - 112;
-            size = 112;
-        }
-
-        k = 0;
-        while(k < size)  {
-            offset=a->offset;
-            for (i=0;i<14 && k<size;i++,k++) {
-                fprintf(out," 0x%.2X",h->buffer->data[offset]);
-                offset++;
-            }
-            if (k<size) fprintf(self->dumper.out,"\n  #");
-        }  if(more)  {
-            fprintf(self->dumper.out,"\n  #... %d more values\n",(int)more);
-        }
-        fprintf(self->dumper.out,"\n");
-
-    }
-}
diff --git a/src/grib_dumper_factory.h b/src/grib_dumper_factory.h
index 7f1be63..42d00f5 100644
--- a/src/grib_dumper_factory.h
+++ b/src/grib_dumper_factory.h
@@ -1,19 +1,16 @@
 /* This file is automatically generated by ./make_class.pl, do not edit */
-{ "bufr_decode_C",       &grib_dumper_class_bufr_decode_C, },
-{ "bufr_decode_filter",  &grib_dumper_class_bufr_decode_filter, },
+{ "bufr_decode_C", &grib_dumper_class_bufr_decode_C, },
+{ "bufr_decode_filter", &grib_dumper_class_bufr_decode_filter, },
 { "bufr_decode_fortran", &grib_dumper_class_bufr_decode_fortran, },
-{ "bufr_decode_python",  &grib_dumper_class_bufr_decode_python, },
-
-{ "bufr_encode_C",       &grib_dumper_class_bufr_encode_C, },
-{ "bufr_encode_filter",  &grib_dumper_class_bufr_encode_filter, },
+{ "bufr_decode_python", &grib_dumper_class_bufr_decode_python, },
+{ "bufr_encode_C", &grib_dumper_class_bufr_encode_C, },
+{ "bufr_encode_filter", &grib_dumper_class_bufr_encode_filter, },
 { "bufr_encode_fortran", &grib_dumper_class_bufr_encode_fortran, },
-{ "bufr_encode_python",  &grib_dumper_class_bufr_encode_python, },
-
-{ "debug",               &grib_dumper_class_debug, },
-{ "default",             &grib_dumper_class_default, },
-{ "grib_encode_C",       &grib_dumper_class_grib_encode_C, },
-{ "json",                &grib_dumper_class_json, },
-{ "keys",                &grib_dumper_class_keys, },
-{ "serialize",           &grib_dumper_class_serialize, },
-{ "wmo",                 &grib_dumper_class_wmo, },
-{ "xml",                 &grib_dumper_class_xml, },
+{ "bufr_encode_python", &grib_dumper_class_bufr_encode_python, },
+{ "debug", &grib_dumper_class_debug, },
+{ "default", &grib_dumper_class_default, },
+{ "grib_encode_C", &grib_dumper_class_grib_encode_C, },
+{ "json", &grib_dumper_class_json, },
+{ "keys", &grib_dumper_class_keys, },
+{ "serialize", &grib_dumper_class_serialize, },
+{ "wmo", &grib_dumper_class_wmo, },
diff --git a/src/grib_emoslib.h b/src/grib_emoslib.h
index 171af85..b9fe81d 100644
--- a/src/grib_emoslib.h
+++ b/src/grib_emoslib.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_errors.c b/src/grib_errors.c
index 831f4fd..41010c4 100644
--- a/src/grib_errors.c
+++ b/src/grib_errors.c
@@ -20,7 +20,7 @@ static const char *errors[] = {
 "Encoding invalid",		/* -14 GRIB_ENCODING_ERROR */
 "Code cannot unpack because of string too small",		/* -15 GRIB_NO_MORE_IN_SET */
 "Problem with calculation of geographic attributes",		/* -16 GRIB_GEOCALCULUS_PROBLEM */
-"Out of memory",		/* -17 GRIB_OUT_OF_MEMORY */
+"Memory allocation error",		/* -17 GRIB_OUT_OF_MEMORY */
 "Value is read only",		/* -18 GRIB_READ_ONLY */
 "Invalid argument",		/* -19 GRIB_INVALID_ARGUMENT */
 "Null handle",		/* -20 GRIB_NULL_HANDLE */
diff --git a/src/grib_errors.txt b/src/grib_errors.txt
index 367f30c..28616a0 100644
--- a/src/grib_errors.txt
+++ b/src/grib_errors.txt
@@ -17,7 +17,7 @@ GRIB_DECODING_ERROR                 Decoding invalid
 GRIB_ENCODING_ERROR                 Encoding invalid
 GRIB_NO_MORE_IN_SET                 Code cannot unpack because of string too small
 GRIB_GEOCALCULUS_PROBLEM            Problem with calculation of geographic attributes
-GRIB_OUT_OF_MEMORY                  Out of memory
+GRIB_OUT_OF_MEMORY                  Memory allocation error
 GRIB_READ_ONLY                      Value is read only
 GRIB_INVALID_ARGUMENT               Invalid argument
 GRIB_NULL_HANDLE                    Null handle
diff --git a/src/grib_expression.c b/src/grib_expression.c
index 9055a4c..76ae331 100644
--- a/src/grib_expression.c
+++ b/src/grib_expression.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -93,27 +93,6 @@ void grib_expression_print(grib_context* ctx,grib_expression* g,grib_handle* f)
     Assert(1==0);
 }
 
-void grib_expression_compile(grib_expression* g,grib_compiler* f)
-{
-    grib_expression_class *c = g->cclass;
-    if(!c->compile)
-    {
-        fprintf(stderr, "NO COMPILE METHOD %s\n", c->name);
-        Assert(0);
-    }
-    while(c)
-    {
-        if(c->compile)
-        {
-            c->compile(g,f);
-            return;
-        }
-        c = c->super ? *(c->super) : NULL;
-    }
-    Assert(1==0);
-
-}
-
 void grib_expression_free(grib_context* ctx,grib_expression* g)
 {
     grib_expression_class *c = g->cclass;
diff --git a/src/grib_expression.h b/src/grib_expression.h
index 5b20db4..b5baecc 100644
--- a/src/grib_expression.h
+++ b/src/grib_expression.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_expression_class_accessor.c b/src/grib_expression_class_accessor.c
index 2a9fa3c..0671b8c 100644
--- a/src/grib_expression_class_accessor.c
+++ b/src/grib_expression_class_accessor.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -23,7 +23,6 @@
    IMPLEMENTS = evaluate_double
    IMPLEMENTS = evaluate_string
    IMPLEMENTS = print
-   IMPLEMENTS = compile
    IMPLEMENTS = add_dependency
    MEMBERS    = char *name
    MEMBERS    = long start
@@ -49,7 +48,6 @@ static void init_class              (grib_expression_class*);
 static void        destroy(grib_context*,grib_expression* e);
 
 static void        print(grib_context*,grib_expression*,grib_handle*);
-static void        compile(grib_expression*,grib_compiler*);
 static void        add_dependency(grib_expression* e, grib_accessor* observer);
 static string get_name(grib_expression* e);
 
@@ -77,7 +75,6 @@ static grib_expression_class _grib_expression_class_accessor = {
     0,                     /* constructor               */
     &destroy,                  /* destructor                */
     &print,                 
-    &compile,                 
     &add_dependency,       
 
 	&native_type,
@@ -98,103 +95,96 @@ static void init_class(grib_expression_class* c)
 
 static const char* get_name(grib_expression* g)
 {
-  grib_expression_accessor* e = (grib_expression_accessor*)g;
-  return e->name;
+    grib_expression_accessor* e = (grib_expression_accessor*)g;
+    return e->name;
 }
 
 static int evaluate_long(grib_expression* g,grib_handle *h,long* result)
 {
-  grib_expression_accessor* e = (grib_expression_accessor*)g;
-  return grib_get_long_internal(h,e->name,result);
+    grib_expression_accessor* e = (grib_expression_accessor*)g;
+    return grib_get_long_internal(h,e->name,result);
 }
 
 static int evaluate_double(grib_expression *g,grib_handle *h,double* result)
 {
-  grib_expression_accessor* e = (grib_expression_accessor*)g;
-  return grib_get_double_internal(h,e->name,result);
+    grib_expression_accessor* e = (grib_expression_accessor*)g;
+    return grib_get_double_internal(h,e->name,result);
 }
 
 static string evaluate_string(grib_expression* g,grib_handle* h,char* buf,size_t* size,int* err)
 {
-  grib_expression_accessor* e = (grib_expression_accessor*)g;
-  char mybuf[1024]={0,};
-  long start=e->start;
-
-  Assert(buf);
-  if((*err=grib_get_string_internal(h,e->name,mybuf,size)) != GRIB_SUCCESS)
-      return NULL;
-  
-  if (e->start<0) start+=*size;
-
-  if (e->length != 0) {
-    memcpy(buf,mybuf+start,e->length);
-    buf[e->length]=0;
-  } else {
-    memcpy(buf,mybuf,*size);
-    buf[*size]=0;
-  }
-  return buf;
+    grib_expression_accessor* e = (grib_expression_accessor*)g;
+    char mybuf[1024]={0,};
+    long start=e->start;
+
+    Assert(buf);
+    if((*err=grib_get_string_internal(h,e->name,mybuf,size)) != GRIB_SUCCESS)
+        return NULL;
+
+    if (e->start<0) start+=*size;
+
+    if (e->length != 0) {
+        memcpy(buf,mybuf+start,e->length);
+        buf[e->length]=0;
+    } else {
+        memcpy(buf,mybuf,*size);
+        if (*size==1024) *size = *size - 1;  /* ECC-336 */
+        buf[*size]=0;
+    }
+    return buf;
 }
 
 static void print(grib_context* c,grib_expression* g,grib_handle* f)
 {
-  grib_expression_accessor* e = (grib_expression_accessor*)g;
-  printf("access('%s",e->name);
-  if(f)
-  {
-    long s = 0;
-    grib_get_long(f,e->name,&s);
-    printf("=%ld",s);
-  }
-  printf("')");
+    grib_expression_accessor* e = (grib_expression_accessor*)g;
+    printf("access('%s",e->name);
+    if(f)
+    {
+        long s = 0;
+        grib_get_long(f,e->name,&s);
+        printf("=%ld",s);
+    }
+    printf("')");
 }
 
 static void destroy(grib_context* c,grib_expression* g)
 {
-  grib_expression_accessor* e = (grib_expression_accessor*)g;
-  grib_context_free_persistent(c,e->name);
+    grib_expression_accessor* e = (grib_expression_accessor*)g;
+    grib_context_free_persistent(c,e->name);
 }
 
-
 static void  add_dependency(grib_expression* g, grib_accessor* observer){
-  grib_expression_accessor* e = (grib_expression_accessor*)g;
-  grib_accessor *observed = grib_find_accessor(grib_handle_of_accessor(observer),e->name);
-
-  if(!observed)
-  {
-    /* grib_context_log(observer->context, GRIB_LOG_ERROR, */
-         /* "Error in accessor_add_dependency: cannot find [%s]", e->name); */
-       /* Assert(observed); */
-    return;
-  }
-
-  grib_dependency_add(observer,observed);
+    grib_expression_accessor* e = (grib_expression_accessor*)g;
+    grib_accessor *observed = grib_find_accessor(grib_handle_of_accessor(observer),e->name);
+
+    if(!observed)
+    {
+        /* grib_context_log(observer->context, GRIB_LOG_ERROR, */
+        /* "Error in accessor_add_dependency: cannot find [%s]", e->name); */
+        /* Assert(observed); */
+        return;
+    }
+
+    grib_dependency_add(observer,observed);
 }
 
 grib_expression* new_accessor_expression(grib_context* c,const char *name,long start, size_t length)
 {
-  grib_expression_accessor* e = (grib_expression_accessor*)grib_context_malloc_clear_persistent(c,sizeof(grib_expression_accessor));
-  e->base.cclass                 = grib_expression_class_accessor;
-  e->name                   = grib_context_strdup_persistent(c,name);
-  e->start                  = start;
-  e->length                 = length;
-  return (grib_expression*)e;
-}
-
-static void compile(grib_expression* g,grib_compiler* c)
-{
-	grib_expression_accessor* e = (grib_expression_accessor*)g;
-    fprintf(c->out,"new_accessor_expression(ctx,\"%s\")",e->name);
+    grib_expression_accessor* e = (grib_expression_accessor*)grib_context_malloc_clear_persistent(c,sizeof(grib_expression_accessor));
+    e->base.cclass                 = grib_expression_class_accessor;
+    e->name                   = grib_context_strdup_persistent(c,name);
+    e->start                  = start;
+    e->length                 = length;
+    return (grib_expression*)e;
 }
 
 static int native_type(grib_expression* g,grib_handle *h)
 {
-  grib_expression_accessor* e = (grib_expression_accessor*)g;
-  int type = 0;
-  int err;
-  if((err=grib_get_native_type(h,e->name,&type)) != GRIB_SUCCESS)
-    grib_context_log(h->context, GRIB_LOG_ERROR,
-    "Error in native_type %s : %s", e->name,grib_get_error_message(err));
-  return type;
+    grib_expression_accessor* e = (grib_expression_accessor*)g;
+    int type = 0;
+    int err;
+    if((err=grib_get_native_type(h,e->name,&type)) != GRIB_SUCCESS)
+        grib_context_log(h->context, GRIB_LOG_ERROR,
+                "Error in native_type %s : %s", e->name,grib_get_error_message(err));
+    return type;
 }
-
diff --git a/src/grib_expression_class_binop.c b/src/grib_expression_class_binop.c
index c722bef..dd71051 100644
--- a/src/grib_expression_class_binop.c
+++ b/src/grib_expression_class_binop.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -21,7 +21,6 @@
    IMPLEMENTS = evaluate_long
    IMPLEMENTS = evaluate_double
    IMPLEMENTS = print
-   IMPLEMENTS = compile
    IMPLEMENTS = add_dependency
    MEMBERS    = grib_expression *left
    MEMBERS = grib_expression *right
@@ -49,7 +48,6 @@ static void init_class              (grib_expression_class*);
 static void        destroy(grib_context*,grib_expression* e);
 
 static void        print(grib_context*,grib_expression*,grib_handle*);
-static void        compile(grib_expression*,grib_compiler*);
 static void        add_dependency(grib_expression* e, grib_accessor* observer);
 
 static int        native_type(grib_expression*,grib_handle*);
@@ -77,7 +75,6 @@ static grib_expression_class _grib_expression_class_binop = {
     0,                     /* constructor               */
     &destroy,                  /* destructor                */
     &print,                 
-    &compile,                 
     &add_dependency,       
 
 	&native_type,
@@ -200,18 +197,6 @@ grib_expression* new_binop_expression(grib_context* c,
     return (grib_expression*)e;
 }
 
-static void compile(grib_expression* g,grib_compiler* c)
-{
-    grib_expression_binop* e = (grib_expression_binop*)g;
-    fprintf(c->out,"new_binop_expression(ctx,");
-    fprintf(c->out,"%s,",grib_binop_long_proc_name(e->long_func));
-    fprintf(c->out,"%s,",grib_binop_double_proc_name(e->double_func));
-    grib_expression_compile(e->left,c);
-    fprintf(c->out,",");
-    grib_expression_compile(e->right,c);
-    fprintf(c->out,")");
-}
-
 static int native_type(grib_expression* g,grib_handle *h)
 {
     grib_expression_binop* e = (grib_expression_binop*)g;
diff --git a/src/grib_expression_class_column.c b/src/grib_expression_class_column.c
index bc57374..1b823ed 100644
--- a/src/grib_expression_class_column.c
+++ b/src/grib_expression_class_column.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -72,7 +72,6 @@ static grib_expression_class _grib_expression_class_column = {
     0,                     /* constructor               */
     &destroy,                  /* destructor                */
     0,                 
-    0,                 
     0,       
 
 	&native_type,
diff --git a/src/grib_expression_class_constant.c b/src/grib_expression_class_constant.c
index 6c4ca2e..43bd199 100644
--- a/src/grib_expression_class_constant.c
+++ b/src/grib_expression_class_constant.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -68,7 +68,6 @@ static grib_expression_class _grib_expression_class_constant = {
     0,                     /* constructor               */
     &destroy,                  /* destructor                */
     &print,                 
-    0,                 
     &add_dependency,       
 
 	&native_type,
diff --git a/src/grib_expression_class_double.c b/src/grib_expression_class_double.c
index a43ce58..d8d7129 100644
--- a/src/grib_expression_class_double.c
+++ b/src/grib_expression_class_double.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -21,7 +21,6 @@
    IMPLEMENTS = evaluate_long
    IMPLEMENTS = evaluate_double
    IMPLEMENTS = print
-   IMPLEMENTS = compile
    IMPLEMENTS = add_dependency
    MEMBERS    = double value
    END_CLASS_DEF
@@ -45,7 +44,6 @@ static void init_class              (grib_expression_class*);
 static void        destroy(grib_context*,grib_expression* e);
 
 static void        print(grib_context*,grib_expression*,grib_handle*);
-static void        compile(grib_expression*,grib_compiler*);
 static void        add_dependency(grib_expression* e, grib_accessor* observer);
 
 static int        native_type(grib_expression*,grib_handle*);
@@ -69,7 +67,6 @@ static grib_expression_class _grib_expression_class_double = {
     0,                     /* constructor               */
     &destroy,                  /* destructor                */
     &print,                 
-    &compile,                 
     &add_dependency,       
 
 	&native_type,
@@ -125,12 +122,6 @@ grib_expression* new_double_expression(grib_context* c,double value)
 	return (grib_expression*)e;
 }
 
-static void compile(grib_expression* g,grib_compiler* c)
-{
-	grib_expression_double* e = (grib_expression_double*)g;
-    fprintf(c->out,"new_double_expression(ctx,%g)",e->value);
-}
-
 static int native_type(grib_expression* g,grib_handle *h)
 {
 	return GRIB_TYPE_DOUBLE;
diff --git a/src/grib_expression_class_functor.c b/src/grib_expression_class_functor.c
index d81f49b..68b4e2b 100644
--- a/src/grib_expression_class_functor.c
+++ b/src/grib_expression_class_functor.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -20,7 +20,6 @@
    IMPLEMENTS = native_type
    IMPLEMENTS = evaluate_long
    IMPLEMENTS = print
-   IMPLEMENTS = compile
    IMPLEMENTS = add_dependency
    MEMBERS    = char *name
    MEMBERS    = grib_arguments *args
@@ -45,7 +44,6 @@ static void init_class              (grib_expression_class*);
 static void        destroy(grib_context*,grib_expression* e);
 
 static void        print(grib_context*,grib_expression*,grib_handle*);
-static void        compile(grib_expression*,grib_compiler*);
 static void        add_dependency(grib_expression* e, grib_accessor* observer);
 
 static int        native_type(grib_expression*,grib_handle*);
@@ -69,7 +67,6 @@ static grib_expression_class _grib_expression_class_functor = {
     0,                     /* constructor               */
     &destroy,                  /* destructor                */
     &print,                 
-    &compile,                 
     &add_dependency,       
 
 	&native_type,
@@ -183,15 +180,6 @@ grib_expression* new_func_expression(grib_context* c,const char *name,grib_argum
     return (grib_expression*)e;
 }
 
-static void compile(grib_expression* g,grib_compiler* c)
-{
-    grib_expression_functor* e = (grib_expression_functor*)g;
-    fprintf(c->out,"new_func_expression(ctx,");
-    fprintf(c->out,"\"%s\",",e->name);
-    grib_compile_arguments(e->args,c);
-    fprintf(c->out,")");
-}
-
 static int native_type(grib_expression* g,grib_handle *h)
 {
     return GRIB_TYPE_LONG;
diff --git a/src/grib_expression_class_is_in_dict.c b/src/grib_expression_class_is_in_dict.c
index 21d0e92..0d79ad2 100644
--- a/src/grib_expression_class_is_in_dict.c
+++ b/src/grib_expression_class_is_in_dict.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -23,7 +23,6 @@
    IMPLEMENTS = evaluate_double
    IMPLEMENTS = evaluate_string
    IMPLEMENTS = print
-   IMPLEMENTS = compile
    MEMBERS    = const char *key
    MEMBERS    = const char *dictionary
    END_CLASS_DEF
@@ -46,7 +45,6 @@ static void init_class              (grib_expression_class*);
 
 
 static void        print(grib_context*,grib_expression*,grib_handle*);
-static void        compile(grib_expression*,grib_compiler*);
 static void        add_dependency(grib_expression* e, grib_accessor* observer);
 static string get_name(grib_expression* e);
 
@@ -73,7 +71,6 @@ static grib_expression_class _grib_expression_class_is_in_dict = {
     0,                     /* constructor               */
     0,                  /* destructor                */
     &print,                 
-    &compile,                 
     &add_dependency,       
 
 	&native_type,
@@ -234,12 +231,6 @@ grib_expression* new_is_in_dict_expression(grib_context* c,const char* name,cons
   return (grib_expression*)e;
 }
 
-static void compile(grib_expression* g,grib_compiler* c)
-{
-	grib_expression_is_in_dict* e = (grib_expression_is_in_dict*)g;
-    fprintf(c->out,"new_is_in_dict_expression(ctx,\"%s\")",e->key);
-}
-
 static int native_type(grib_expression* g,grib_handle *h)
 {
   grib_expression_is_in_dict* e = (grib_expression_is_in_dict*)g;
diff --git a/src/grib_expression_class_is_in_list.c b/src/grib_expression_class_is_in_list.c
index ec21a0d..05c3903 100644
--- a/src/grib_expression_class_is_in_list.c
+++ b/src/grib_expression_class_is_in_list.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -23,7 +23,6 @@
    IMPLEMENTS = evaluate_double
    IMPLEMENTS = evaluate_string
    IMPLEMENTS = print
-   IMPLEMENTS = compile
    IMPLEMENTS = add_dependency
    MEMBERS    = const char *name
    MEMBERS    = const char *list
@@ -48,7 +47,6 @@ static void init_class              (grib_expression_class*);
 static void        destroy(grib_context*,grib_expression* e);
 
 static void        print(grib_context*,grib_expression*,grib_handle*);
-static void        compile(grib_expression*,grib_compiler*);
 static void        add_dependency(grib_expression* e, grib_accessor* observer);
 static string get_name(grib_expression* e);
 
@@ -75,7 +73,6 @@ static grib_expression_class _grib_expression_class_is_in_list = {
     0,                     /* constructor               */
     &destroy,                  /* destructor                */
     &print,                 
-    &compile,                 
     &add_dependency,       
 
 	&native_type,
@@ -248,12 +245,6 @@ grib_expression* new_is_in_list_expression(grib_context* c,const char* name,cons
   return (grib_expression*)e;
 }
 
-static void compile(grib_expression* g,grib_compiler* c)
-{
-	grib_expression_is_in_list* e = (grib_expression_is_in_list*)g;
-    fprintf(c->out,"new_is_in_list_expression(ctx,\"%s\")",e->name);
-}
-
 static int native_type(grib_expression* g,grib_handle *h)
 {
   grib_expression_is_in_list* e = (grib_expression_is_in_list*)g;
diff --git a/src/grib_expression_class_is_integer.c b/src/grib_expression_class_is_integer.c
index b732467..a2fa1a1 100644
--- a/src/grib_expression_class_is_integer.c
+++ b/src/grib_expression_class_is_integer.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -23,7 +23,6 @@
    IMPLEMENTS = evaluate_double
    IMPLEMENTS = evaluate_string
    IMPLEMENTS = print
-   IMPLEMENTS = compile
    IMPLEMENTS = add_dependency
    MEMBERS    = char *name
    MEMBERS    = size_t start
@@ -49,7 +48,6 @@ static void init_class              (grib_expression_class*);
 static void        destroy(grib_context*,grib_expression* e);
 
 static void        print(grib_context*,grib_expression*,grib_handle*);
-static void        compile(grib_expression*,grib_compiler*);
 static void        add_dependency(grib_expression* e, grib_accessor* observer);
 static string get_name(grib_expression* e);
 
@@ -77,7 +75,6 @@ static grib_expression_class _grib_expression_class_is_integer = {
     0,                     /* constructor               */
     &destroy,                  /* destructor                */
     &print,                 
-    &compile,                 
     &add_dependency,       
 
 	&native_type,
@@ -194,12 +191,6 @@ grib_expression* new_is_integer_expression(grib_context* c,const char *name,int
   return (grib_expression*)e;
 }
 
-static void compile(grib_expression* g,grib_compiler* c)
-{
-	grib_expression_is_integer* e = (grib_expression_is_integer*)g;
-    fprintf(c->out,"new_is_integer_expression(ctx,\"%s\")",e->name);
-}
-
 static int native_type(grib_expression* g,grib_handle *h)
 {
   grib_expression_is_integer* e = (grib_expression_is_integer*)g;
diff --git a/src/grib_expression_class_length.c b/src/grib_expression_class_length.c
index ae2434b..2f85813 100644
--- a/src/grib_expression_class_length.c
+++ b/src/grib_expression_class_length.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -23,7 +23,6 @@
    IMPLEMENTS = evaluate_double
    IMPLEMENTS = evaluate_string
    IMPLEMENTS = print
-   IMPLEMENTS = compile
    IMPLEMENTS = add_dependency
    MEMBERS    = char *name
    MEMBERS    = size_t start
@@ -49,7 +48,6 @@ static void init_class              (grib_expression_class*);
 static void        destroy(grib_context*,grib_expression* e);
 
 static void        print(grib_context*,grib_expression*,grib_handle*);
-static void        compile(grib_expression*,grib_compiler*);
 static void        add_dependency(grib_expression* e, grib_accessor* observer);
 static string get_name(grib_expression* e);
 
@@ -77,7 +75,6 @@ static grib_expression_class _grib_expression_class_length = {
     0,                     /* constructor               */
     &destroy,                  /* destructor                */
     &print,                 
-    &compile,                 
     &add_dependency,       
 
 	&native_type,
@@ -183,12 +180,6 @@ grib_expression* new_length_expression(grib_context* c,const char *name)
     return (grib_expression*)e;
 }
 
-static void compile(grib_expression* g,grib_compiler* c)
-{
-    grib_expression_length* e = (grib_expression_length*)g;
-    fprintf(c->out,"new_length_expression(ctx,\"%s\")",e->name);
-}
-
 static int native_type(grib_expression* g,grib_handle *h)
 {
     grib_expression_length* e = (grib_expression_length*)g;
diff --git a/src/grib_expression_class_long.c b/src/grib_expression_class_long.c
index 78b6b33..e008127 100644
--- a/src/grib_expression_class_long.c
+++ b/src/grib_expression_class_long.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -21,7 +21,6 @@
    IMPLEMENTS = evaluate_long
    IMPLEMENTS = evaluate_double
    IMPLEMENTS = print
-   IMPLEMENTS = compile
    IMPLEMENTS = add_dependency
    MEMBERS    = long value
    END_CLASS_DEF
@@ -45,7 +44,6 @@ static void init_class              (grib_expression_class*);
 static void        destroy(grib_context*,grib_expression* e);
 
 static void        print(grib_context*,grib_expression*,grib_handle*);
-static void        compile(grib_expression*,grib_compiler*);
 static void        add_dependency(grib_expression* e, grib_accessor* observer);
 
 static int        native_type(grib_expression*,grib_handle*);
@@ -69,7 +67,6 @@ static grib_expression_class _grib_expression_class_long = {
     0,                     /* constructor               */
     &destroy,                  /* destructor                */
     &print,                 
-    &compile,                 
     &add_dependency,       
 
 	&native_type,
@@ -129,9 +126,3 @@ static int native_type(grib_expression* g,grib_handle *h)
 {
 	return GRIB_TYPE_LONG;
 }
-
-static void compile(grib_expression* g,grib_compiler* c)
-{
-	grib_expression_long* e = (grib_expression_long*)g;
-    fprintf(c->out,"new_long_expression(ctx,%ld)",e->value);
-}
diff --git a/src/grib_expression_class_string.c b/src/grib_expression_class_string.c
index 7dacf0d..5e3195b 100644
--- a/src/grib_expression_class_string.c
+++ b/src/grib_expression_class_string.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -20,7 +20,6 @@
    IMPLEMENTS = destroy
    IMPLEMENTS = evaluate_string
    IMPLEMENTS = print
-   IMPLEMENTS = compile
    IMPLEMENTS = add_dependency
    MEMBERS    = char* value
    END_CLASS_DEF
@@ -44,7 +43,6 @@ static void init_class              (grib_expression_class*);
 static void        destroy(grib_context*,grib_expression* e);
 
 static void        print(grib_context*,grib_expression*,grib_handle*);
-static void        compile(grib_expression*,grib_compiler*);
 static void        add_dependency(grib_expression* e, grib_accessor* observer);
 
 static int        native_type(grib_expression*,grib_handle*);
@@ -67,7 +65,6 @@ static grib_expression_class _grib_expression_class_string = {
     0,                     /* constructor               */
     &destroy,                  /* destructor                */
     &print,                 
-    &compile,                 
     &add_dependency,       
 
 	&native_type,
@@ -117,12 +114,6 @@ grib_expression* new_string_expression(grib_context* c,const char* value)
 	return (grib_expression*)e;
 }
 
-static void compile(grib_expression* g,grib_compiler* c)
-{
-	grib_expression_string* e = (grib_expression_string*)g;
-    fprintf(c->out,"new_string_expression(ctx,\"%s\")",e->value);
-}
-
 static int native_type(grib_expression* g,grib_handle *h)
 {
 	return GRIB_TYPE_STRING;
diff --git a/src/grib_expression_class_string_compare.c b/src/grib_expression_class_string_compare.c
index 1613db9..fb60b8b 100644
--- a/src/grib_expression_class_string_compare.c
+++ b/src/grib_expression_class_string_compare.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -20,7 +20,7 @@
    IMPLEMENTS = native_type
    IMPLEMENTS = evaluate_long
    IMPLEMENTS = evaluate_double
-   IMPLEMENTS = print;compile
+   IMPLEMENTS = print
    IMPLEMENTS = add_dependency
    MEMBERS    = grib_expression *left
    MEMBERS = grib_expression *right
@@ -45,7 +45,6 @@ static void init_class              (grib_expression_class*);
 static void        destroy(grib_context*,grib_expression* e);
 
 static void        print(grib_context*,grib_expression*,grib_handle*);
-static void        compile(grib_expression*,grib_compiler*);
 static void        add_dependency(grib_expression* e, grib_accessor* observer);
 
 static int        native_type(grib_expression*,grib_handle*);
@@ -70,7 +69,6 @@ static grib_expression_class _grib_expression_class_string_compare = {
     0,                     /* constructor               */
     &destroy,                  /* destructor                */
     &print,                 
-    &compile,                 
     &add_dependency,       
 
 	&native_type,
@@ -158,16 +156,6 @@ grib_expression* new_string_compare_expression(grib_context* c,
     return (grib_expression*)e;
 }
 
-static void compile(grib_expression* g,grib_compiler* c)
-{
-    grib_expression_string_compare* e = (grib_expression_string_compare*)g;
-    fprintf(c->out,"new_string_compare_expression(ctx,");
-    grib_expression_compile(e->left,c);
-    fprintf(c->out,",");
-    grib_expression_compile(e->right,c);
-    fprintf(c->out,")");
-}
-
 static int native_type(grib_expression* g,grib_handle *h)
 {
     return GRIB_TYPE_LONG ;
diff --git a/src/grib_expression_class_sub_string.c b/src/grib_expression_class_sub_string.c
index 72b97ca..b06213e 100644
--- a/src/grib_expression_class_sub_string.c
+++ b/src/grib_expression_class_sub_string.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -20,7 +20,6 @@
    IMPLEMENTS = destroy
    IMPLEMENTS = evaluate_string
    IMPLEMENTS = print
-   IMPLEMENTS = compile
    IMPLEMENTS = add_dependency
    MEMBERS    = char* value
    END_CLASS_DEF
@@ -44,7 +43,6 @@ static void init_class              (grib_expression_class*);
 static void        destroy(grib_context*,grib_expression* e);
 
 static void        print(grib_context*,grib_expression*,grib_handle*);
-static void        compile(grib_expression*,grib_compiler*);
 static void        add_dependency(grib_expression* e, grib_accessor* observer);
 
 static int        native_type(grib_expression*,grib_handle*);
@@ -67,7 +65,6 @@ static grib_expression_class _grib_expression_class_sub_string = {
     0,                     /* constructor               */
     &destroy,                  /* destructor                */
     &print,                 
-    &compile,                 
     &add_dependency,       
 
 	&native_type,
@@ -124,14 +121,6 @@ grib_expression* new_sub_string_expression(grib_context* c,const char* value,siz
 	return (grib_expression*)e;
 }
 
-
-static void compile(grib_expression* g,grib_compiler* c)
-{
-	grib_expression_sub_string* e = (grib_expression_sub_string*)g;
-    fprintf(c->out,"new_sub_string_expression(ctx,\"%s\")",e->value);
-}
-
-
 static int native_type(grib_expression* g,grib_handle *h)
 {
 	return GRIB_TYPE_STRING;
diff --git a/src/grib_expression_class_true.c b/src/grib_expression_class_true.c
index 9d7726b..ac2639c 100644
--- a/src/grib_expression_class_true.c
+++ b/src/grib_expression_class_true.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -65,7 +65,6 @@ static grib_expression_class _grib_expression_class_true = {
     0,                     /* constructor               */
     &destroy,                  /* destructor                */
     &print,                 
-    0,                 
     &add_dependency,       
 
 	&native_type,
diff --git a/src/grib_expression_class_unop.c b/src/grib_expression_class_unop.c
index 0ccf0c0..90bbec2 100644
--- a/src/grib_expression_class_unop.c
+++ b/src/grib_expression_class_unop.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -21,7 +21,6 @@
    IMPLEMENTS = evaluate_long
    IMPLEMENTS = evaluate_double
    IMPLEMENTS = print
-   IMPLEMENTS = compile
    IMPLEMENTS = add_dependency
    MEMBERS    = grib_expression *exp
    MEMBERS = grib_unop_long_proc  long_func
@@ -47,7 +46,6 @@ static void init_class              (grib_expression_class*);
 static void        destroy(grib_context*,grib_expression* e);
 
 static void        print(grib_context*,grib_expression*,grib_handle*);
-static void        compile(grib_expression*,grib_compiler*);
 static void        add_dependency(grib_expression* e, grib_accessor* observer);
 
 static int        native_type(grib_expression*,grib_handle*);
@@ -73,7 +71,6 @@ static grib_expression_class _grib_expression_class_unop = {
     0,                     /* constructor               */
     &destroy,                  /* destructor                */
     &print,                 
-    &compile,                 
     &add_dependency,       
 
 	&native_type,
@@ -148,16 +145,6 @@ grib_expression* new_unop_expression(grib_context* c,
     return (grib_expression*)e;
 }
 
-static void compile(grib_expression* g,grib_compiler* c)
-{
-    grib_expression_unop* e = (grib_expression_unop*)g;
-    fprintf(c->out,"new_unop_expression(ctx,");
-    fprintf(c->out,"%s,",grib_unop_long_proc_name(e->long_func));
-    fprintf(c->out,"%s,",grib_unop_double_proc_name(e->double_func));
-    grib_expression_compile(e->exp,c);
-    fprintf(c->out,")");
-}
-
 static int native_type(grib_expression* g,grib_handle *h)
 {
     grib_expression_unop* e = (grib_expression_unop*)g;
diff --git a/src/grib_fieldset.c b/src/grib_fieldset.c
index 61d5e19..59c7769 100644
--- a/src/grib_fieldset.c
+++ b/src/grib_fieldset.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -33,7 +33,7 @@ static grib_fieldset* grib_fieldset_create_from_order_by(grib_context* c,grib_or
         int* err);
 static int grib_fieldset_resize(grib_fieldset* set,size_t newsize);
 static void grib_trim(char** x);
-static grib_order_by* grib_fieldset_new_order_by(grib_context* c,char* z);
+static grib_order_by* grib_fieldset_new_order_by(grib_context* c, const char* z);
 static int grib_fieldset_compare(grib_fieldset* set,int* i,int* j);
 static void grib_fieldset_sort(grib_fieldset* set, int beg, int theEnd);
 static int grib_fieldset_columns_resize(grib_fieldset* set,size_t newsize);
@@ -238,8 +238,8 @@ int grib_fieldset_column_copy_from_handle(grib_handle* h,grib_fieldset* set,int
 
 /* --------------- grib_fieldset functions ------------------*/
 grib_fieldset* grib_fieldset_new_from_files(grib_context* c,char* filenames[],
-        int nfiles, char** keys,int nkeys,
-        char* where_string,char* order_by_string,int* err)
+        int nfiles, char** keys, int nkeys,
+        const char* where_string, const char* order_by_string, int* err)
 {
     int i=0;
     int ret=GRIB_SUCCESS;
@@ -403,7 +403,7 @@ int grib_fieldset_apply_order_by(grib_fieldset* set,const char* order_by_string)
         set->order_by=0;
     }
 
-    ob=grib_fieldset_new_order_by(set->context,(char*)order_by_string);
+    ob=grib_fieldset_new_order_by(set->context, order_by_string);
     if ((err=grib_fieldset_set_order_by(set,ob)) != GRIB_SUCCESS)
         return err;
 
@@ -509,7 +509,7 @@ void grib_fieldset_delete_order_by(grib_context* c,grib_order_by* order_by)
     return;
 }
 
-static grib_order_by* grib_fieldset_new_order_by(grib_context* c,char* obstr)
+static grib_order_by* grib_fieldset_new_order_by(grib_context* c, const char* obstr)
 {
     char *t1=0,*t2=0,*p=0;
     int id=0;
diff --git a/src/grib_filepool.c b/src/grib_filepool.c
index b20a19a..95eba65 100644
--- a/src/grib_filepool.c
+++ b/src/grib_filepool.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_gaussian_reduced.c b/src/grib_gaussian_reduced.c
index 77bec34..12b978c 100644
--- a/src/grib_gaussian_reduced.c
+++ b/src/grib_gaussian_reduced.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_geography.c b/src/grib_geography.c
index f33c65c..0476984 100644
--- a/src/grib_geography.c
+++ b/src/grib_geography.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -115,3 +115,30 @@ int grib_get_gaussian_latitudes(long trunc, double *lats)
 		lats[trunc + 1] = 0.0;
 	return GRIB_SUCCESS;
 }
+
+/* Boolean return type: 1 if the reduced gaussian field is global, 0 for sub area */
+int is_gaussian_global(
+        double lat1, double lat2, double lon1, double lon2,/* bounding box*/
+        long num_points_equator, /* num points on latitude at equator */
+        const double* latitudes, /* array of Gaussian latitudes (size 2*N) */
+        double angular_precision /* tolerance for angle comparison */
+)
+{
+    int global = 1;
+    const double d = fabs(latitudes[0] - latitudes[1]);
+    /* Compute the expected last longitude for a global field */
+    const double lon2_global = 360.0 - 360.0/num_points_equator;
+    /* Compute difference between expected longitude and actual one */
+    const double lon2_diff = fabs( lon2  - lon2_global ) - 360.0/num_points_equator;
+
+    /* Note: final gaussian latitude = -first latitude */
+    if ( (fabs(lat1 - latitudes[0]) >= d ) ||
+         (fabs(lat2 + latitudes[0]) >= d ) ||
+         lon1 != 0                         ||
+         lon2_diff > angular_precision
+    )
+    {
+        global = 0; /* sub area */
+    }
+    return global;
+}
diff --git a/src/grib_handle.c b/src/grib_handle.c
index 610c1ce..1c53e8a 100644
--- a/src/grib_handle.c
+++ b/src/grib_handle.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -394,7 +394,7 @@ grib_handle* grib_handle_new_from_partial_message_copy ( grib_context* c, const
     return g;
 }
 
-grib_handle* grib_handle_new_from_partial_message ( grib_context* c,void* data, size_t buflen )
+grib_handle* grib_handle_new_from_partial_message ( grib_context* c, const void* data, size_t buflen )
 {
     grib_handle  *gl = NULL;
     if ( c == NULL ) c = grib_context_get_default();
diff --git a/src/grib_hash_array.c b/src/grib_hash_array.c
index 960b571..e8472aa 100644
--- a/src/grib_hash_array.c
+++ b/src/grib_hash_array.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_hash_keys.c b/src/grib_hash_keys.c
index 9af0680..a75c042 100644
--- a/src/grib_hash_keys.c
+++ b/src/grib_hash_keys.c
@@ -7728,7 +7728,7 @@ grib_keys_hash_get (const char *str, unsigned int len)
   return 0;
 }
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -8124,7 +8124,7 @@ int grib_hash_keys_insert(grib_itrie* t,const char* key)
       (*(t->count))++;
   } else {
       grib_context_log(t->context,GRIB_LOG_ERROR,
-        "grib_hash_keys_get_id: too many accessors, increase ACCESSORS_ARRAY_SIZE\n");
+        "grib_hash_keys_insert: too many accessors, increase ACCESSORS_ARRAY_SIZE\n");
       Assert(*(t->count)+TOTAL_KEYWORDS < ACCESSORS_ARRAY_SIZE);
   }
 
diff --git a/src/grib_header_compute.c b/src/grib_header_compute.c
index 1e7ebd1..999eece 100644
--- a/src/grib_header_compute.c
+++ b/src/grib_header_compute.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_iarray.c b/src/grib_iarray.c
index 670398c..c1202f3 100644
--- a/src/grib_iarray.c
+++ b/src/grib_iarray.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_ibmfloat.c b/src/grib_ibmfloat.c
index 69c5fbb..4e32c24 100644
--- a/src/grib_ibmfloat.c
+++ b/src/grib_ibmfloat.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_ieeefloat.c b/src/grib_ieeefloat.c
index 3c1c21a..38e02a1 100644
--- a/src/grib_ieeefloat.c
+++ b/src/grib_ieeefloat.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_index.c b/src/grib_index.c
index 64b2c26..9d78d72 100644
--- a/src/grib_index.c
+++ b/src/grib_index.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -803,7 +803,7 @@ grib_index* grib_index_read(grib_context* c, const char* filename, int *err)
     fh=fopen(filename,"r");
     if (!fh) {
         grib_context_log(c,(GRIB_LOG_ERROR)|(GRIB_LOG_PERROR),
-                "Unable to write in file %s",filename);
+                "Unable to read file %s",filename);
         perror(filename);
         *err=GRIB_IO_PROBLEM;
         return NULL;
@@ -940,6 +940,7 @@ int _codes_index_add_file(grib_index* index,const char* filename,int message_typ
 {
     double dval;
     size_t svallen;
+    size_t message_count = 0;
     long length,lval;
     char buf[1024]={0,};
     int err=0;
@@ -990,6 +991,7 @@ int _codes_index_add_file(grib_index* index,const char* filename,int message_typ
         index_key=index->keys;
         field_tree=index->fields;
         index_key->value[0]=0;
+        message_count++;
 
         while (index_key) {
             if (index_key->type==GRIB_TYPE_UNDEFINED) {
@@ -1071,7 +1073,6 @@ int _codes_index_add_file(grib_index* index,const char* filename,int message_typ
         if (err) return err;
         field->length=length;
 
-
         if (field_tree->field) {
             grib_field* pfield=field_tree->field;
             while (pfield->next) pfield=pfield->next;
@@ -1080,15 +1081,17 @@ int _codes_index_add_file(grib_index* index,const char* filename,int message_typ
             field_tree->field=field;
 
         if (h) grib_handle_delete(h);
-
     }
 
     grib_file_close(file->name, 0, &err);
 
     if (err) return err;
     index->rewind=1;
+    if (message_count == 0) {
+        grib_context_log(c,GRIB_LOG_ERROR,"File %s contains no messages", filename);
+        return GRIB_END_OF_FILE;
+    }
     return GRIB_SUCCESS;
-
 }
 
 #if 0
diff --git a/src/grib_io.c b/src/grib_io.c
index 060b339..ff84970 100644
--- a/src/grib_io.c
+++ b/src/grib_io.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -54,15 +54,17 @@ typedef struct reader {
 
 static int read_the_rest(reader* r,size_t message_length,unsigned char* tmp, int already_read, int check7777)
 {
-    int err            = 0;
+    int err = GRIB_SUCCESS;
     size_t buffer_size;
     size_t rest;
     unsigned char* buffer;
 
+    if (message_length==0)
+        return GRIB_BUFFER_TOO_SMALL;
+
     buffer_size = message_length;
     rest=message_length-already_read;
     r->message_size=message_length;
-
     buffer = (unsigned char*)r->alloc(r->alloc_data,&buffer_size,&err);
     if(err) return err;
 
diff --git a/src/grib_iterator.c b/src/grib_iterator.c
index daccec6..2c3235b 100644
--- a/src/grib_iterator.c
+++ b/src/grib_iterator.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_iterator_class.c b/src/grib_iterator_class.c
index 25997e7..41db906 100644
--- a/src/grib_iterator_class.c
+++ b/src/grib_iterator_class.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_iterator_class.h b/src/grib_iterator_class.h
index 6c8d4ff..043a201 100644
--- a/src/grib_iterator_class.h
+++ b/src/grib_iterator_class.h
@@ -8,3 +8,4 @@ extern grib_iterator_class* grib_iterator_class_latlon;
 extern grib_iterator_class* grib_iterator_class_latlon_reduced;
 extern grib_iterator_class* grib_iterator_class_polar_stereographic;
 extern grib_iterator_class* grib_iterator_class_regular;
+extern grib_iterator_class* grib_iterator_class_space_view;
diff --git a/src/grib_iterator_class_gaussian.c b/src/grib_iterator_class_gaussian.c
index 0cecae4..3ed3119 100644
--- a/src/grib_iterator_class_gaussian.c
+++ b/src/grib_iterator_class_gaussian.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_iterator_class_gaussian_reduced.c b/src/grib_iterator_class_gaussian_reduced.c
index c9633bb..fe3c6ac 100644
--- a/src/grib_iterator_class_gaussian_reduced.c
+++ b/src/grib_iterator_class_gaussian_reduced.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -186,7 +186,6 @@ static int init(grib_iterator* iter,grib_handle* h,grib_arguments* args)
             if (ilon_first>ilon_last) ilon_first-=pl[j];
             for (i=ilon_first;i<=ilon_last;i++) {
 #ifdef DEBUG
-                Assert(0);
                 Assert(iter->e < iter->nv);
 #endif
                 self->los[iter->e]=((i)*360.0)/pl[j];
diff --git a/src/grib_iterator_class_gen.c b/src/grib_iterator_class_gen.c
index 44daf4b..8b5495a 100644
--- a/src/grib_iterator_class_gen.c
+++ b/src/grib_iterator_class_gen.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_iterator_class_lambert_azimuthal_equal_area.c b/src/grib_iterator_class_lambert_azimuthal_equal_area.c
index 9cdb6db..83c3218 100644
--- a/src/grib_iterator_class_lambert_azimuthal_equal_area.c
+++ b/src/grib_iterator_class_lambert_azimuthal_equal_area.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_iterator_class_lambert_conformal.c b/src/grib_iterator_class_lambert_conformal.c
index f8c52c2..7ebde39 100644
--- a/src/grib_iterator_class_lambert_conformal.c
+++ b/src/grib_iterator_class_lambert_conformal.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_iterator_class_latlon.c b/src/grib_iterator_class_latlon.c
index 2c71169..3cc9baf 100644
--- a/src/grib_iterator_class_latlon.c
+++ b/src/grib_iterator_class_latlon.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_iterator_class_latlon_reduced.c b/src/grib_iterator_class_latlon_reduced.c
index 45440f1..136eaa5 100644
--- a/src/grib_iterator_class_latlon_reduced.c
+++ b/src/grib_iterator_class_latlon_reduced.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_iterator_class_polar_stereographic.c b/src/grib_iterator_class_polar_stereographic.c
index 7d57445..e9e3955 100644
--- a/src/grib_iterator_class_polar_stereographic.c
+++ b/src/grib_iterator_class_polar_stereographic.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_iterator_class_regular.c b/src/grib_iterator_class_regular.c
index 3c12544..b729766 100644
--- a/src/grib_iterator_class_regular.c
+++ b/src/grib_iterator_class_regular.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_iterator_class_space_view.c b/src/grib_iterator_class_space_view.c
new file mode 100644
index 0000000..9e15ed4
--- /dev/null
+++ b/src/grib_iterator_class_space_view.c
@@ -0,0 +1,328 @@
+/*
+ * Copyright 2005-2017 ECMWF.
+ *
+ * This software is licensed under the terms of the Apache Licence Version 2.0
+ * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+ *
+ * In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
+ * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
+ */
+
+#include "grib_api_internal.h"
+#include <math.h>
+
+/*
+   This is used by make_class.pl
+
+   START_CLASS_DEF
+   CLASS      = iterator
+   SUPER      = grib_iterator_class_gen
+   IMPLEMENTS = destroy
+   IMPLEMENTS = init;next
+   MEMBERS     =   double *lats
+   MEMBERS     =   double *lons
+   MEMBERS     =   long nam
+   END_CLASS_DEF
+*/
+
+/* START_CLASS_IMP */
+
+/*
+
+Don't edit anything between START_CLASS_IMP and END_CLASS_IMP
+Instead edit values between START_CLASS_DEF and END_CLASS_DEF
+or edit "iterator.class" and rerun ./make_class.pl
+
+*/
+
+
+static void init_class              (grib_iterator_class*);
+
+static int init               (grib_iterator* i,grib_handle*,grib_arguments*);
+static int next               (grib_iterator* i, double *lat, double *lon, double *val);
+static int destroy            (grib_iterator* i);
+
+
+typedef struct grib_iterator_space_view{
+  grib_iterator it;
+/* Members defined in gen */
+	long carg;
+	const char* missingValue;
+/* Members defined in space_view */
+	double *lats;
+	double *lons;
+	long nam;
+} grib_iterator_space_view;
+
+extern grib_iterator_class* grib_iterator_class_gen;
+
+static grib_iterator_class _grib_iterator_class_space_view = {
+    &grib_iterator_class_gen,                    /* super                     */
+    "space_view",                    /* name                      */
+    sizeof(grib_iterator_space_view),/* size of instance          */
+    0,                           /* inited */
+    &init_class,                 /* init_class */
+    &init,                     /* constructor               */
+    &destroy,                  /* destructor                */
+    &next,                     /* Next Value                */
+    0,                 /*  Previous Value           */
+    0,                    /* Reset the counter         */
+    0,                 /* has next values           */
+};
+
+grib_iterator_class* grib_iterator_class_space_view = &_grib_iterator_class_space_view;
+
+
+static void init_class(grib_iterator_class* c)
+{
+	c->previous	=	(*(c->super))->previous;
+	c->reset	=	(*(c->super))->reset;
+	c->has_next	=	(*(c->super))->has_next;
+}
+/* END_CLASS_IMP */
+
+static int next(grib_iterator* i, double *lat, double *lon, double *val)
+{
+    grib_iterator_space_view* self = (grib_iterator_space_view*)i;
+
+    if((long)i->e >= (long)(i->nv-1))
+        return 0;
+    i->e++;
+
+    *lat = self->lats[i->e];
+    *lon = self->lons[i->e];
+    *val = i->data[i->e];
+
+    return 1;
+}
+
+#define RAD2DEG   57.29577951308232087684  /* 180 over pi */
+#define DEG2RAD   0.01745329251994329576   /* pi over 180 */
+
+static int init(grib_iterator* iter, grib_handle* h, grib_arguments* args)
+{
+    /* REFERENCE:
+    *  LRIT/HRIT Global Specification (CGMS 03, Issue 2.6, 12.08.1999)
+    */
+    int ret = GRIB_SUCCESS;
+    double *lats,*lons; /* arrays of latitudes and longitudes */
+    double latOfSubSatellitePointInDegrees,lonOfSubSatellitePointInDegrees;
+    double orientationInDegrees, nrInRadiusOfEarth;
+    double radius=0,xpInGridLengths=0,ypInGridLengths=0;
+    long nx, ny, earthIsOblate=0;
+    long alternativeRowScanning,iScansNegatively;
+    long Xo, Yo, jScansPositively,jPointsAreConsecutive, i;
+
+    double major, minor, r_eq, r_pol, height;
+    double lap, lop, orient_angle, angular_size;
+    double xp, yp, dx, dy, rx, ry, x, y;
+    double cos_x, cos_y, sin_x, sin_y;
+    double factor_1, factor_2, tmp1, Sd, Sn, Sxy, S1, S2, S3;
+    int x0, y0, ix, iy;
+    double *s_x, *c_x; /* arrays storing sin and cos values */
+    size_t array_size = (iter->nv * sizeof(double));
+    
+    grib_iterator_space_view* self = (grib_iterator_space_view*)iter;
+
+    const char* sradius                 = grib_arguments_get_name(h,args,self->carg++);
+    const char* sEarthIsOblate          = grib_arguments_get_name(h,args,self->carg++);
+    const char* sMajorAxisInMetres      = grib_arguments_get_name(h,args,self->carg++);
+    const char* sMinorAxisInMetres      = grib_arguments_get_name(h,args,self->carg++);
+    const char* snx                     = grib_arguments_get_name(h,args,self->carg++);
+    const char* sny                     = grib_arguments_get_name(h,args,self->carg++);
+    const char* sLatOfSubSatellitePointInDegrees = grib_arguments_get_name(h,args,self->carg++);
+    const char* sLonOfSubSatellitePointInDegrees = grib_arguments_get_name(h,args,self->carg++);
+    const char* sDx                     = grib_arguments_get_name(h,args,self->carg++);
+    const char* sDy                     = grib_arguments_get_name(h,args,self->carg++);
+    const char* sXpInGridLengths        = grib_arguments_get_name(h,args,self->carg++);
+    const char* sYpInGridLengths        = grib_arguments_get_name(h,args,self->carg++);
+    const char* sOrientationInDegrees   = grib_arguments_get_name(h,args,self->carg++);
+    const char* sNrInRadiusOfEarth      = grib_arguments_get_name(h,args,self->carg++);
+    const char* sXo                     = grib_arguments_get_name(h,args,self->carg++);
+    const char* sYo                     = grib_arguments_get_name(h,args,self->carg++);
+
+    const char* siScansNegatively       = grib_arguments_get_name(h,args,self->carg++);
+    const char* sjScansPositively       = grib_arguments_get_name(h,args,self->carg++);
+    const char* sjPointsAreConsecutive  = grib_arguments_get_name(h,args,self->carg++);
+    const char* sAlternativeRowScanning = grib_arguments_get_name(h,args,self->carg++);
+
+    if((ret = grib_get_long_internal(h, snx,&nx)) != GRIB_SUCCESS)
+        return ret;
+    if((ret = grib_get_long_internal(h, sny,&ny)) != GRIB_SUCCESS)
+        return ret;
+    if((ret = grib_get_long_internal(h, sEarthIsOblate, &earthIsOblate)) != GRIB_SUCCESS)
+        return ret;
+
+    if (earthIsOblate) {
+        if((ret = grib_get_double_internal(h, sMajorAxisInMetres, &major)) != GRIB_SUCCESS)
+            return ret;
+        if((ret = grib_get_double_internal(h, sMinorAxisInMetres, &minor)) != GRIB_SUCCESS)
+            return ret;
+    } else {
+        if((ret = grib_get_double_internal(h, sradius, &radius)) != GRIB_SUCCESS)
+            return ret;
+    }
+    
+    if (iter->nv!=nx*ny) {
+        grib_context_log(h->context,GRIB_LOG_ERROR, "Wrong number of points (%ld!=%ldx%ld)", iter->nv,nx,ny);
+        return GRIB_WRONG_GRID;
+    }
+    if((ret = grib_get_double_internal(h, sLatOfSubSatellitePointInDegrees,&latOfSubSatellitePointInDegrees)) != GRIB_SUCCESS)
+        return ret;
+    if((ret = grib_get_double_internal(h, sLonOfSubSatellitePointInDegrees,&lonOfSubSatellitePointInDegrees)) != GRIB_SUCCESS)
+        return ret;
+    if((ret = grib_get_double_internal(h, sDx, &dx)) != GRIB_SUCCESS)
+        return ret;
+    if((ret = grib_get_double_internal(h, sDy, &dy)) != GRIB_SUCCESS)
+        return ret;
+    if((ret = grib_get_double_internal(h, sXpInGridLengths,&xpInGridLengths)) != GRIB_SUCCESS)
+        return ret;
+    if((ret = grib_get_double_internal(h, sYpInGridLengths,&ypInGridLengths)) != GRIB_SUCCESS)
+        return ret;
+    if((ret = grib_get_double_internal(h, sOrientationInDegrees,&orientationInDegrees)) != GRIB_SUCCESS)
+        return ret;
+
+    /* Orthographic not supported. This happens when Nr (camera altitude) is missing */
+    if (grib_is_missing(h, sNrInRadiusOfEarth, &ret)) {
+        grib_context_log(h->context,GRIB_LOG_ERROR, "Orthographic view (Nr missing) not supported");
+        return GRIB_NOT_IMPLEMENTED;
+    }
+    if((ret = grib_get_double_internal(h, sNrInRadiusOfEarth,&nrInRadiusOfEarth)) != GRIB_SUCCESS)
+        return ret;
+
+    if((ret = grib_get_long_internal(h, sXo,&Xo)) != GRIB_SUCCESS)
+        return ret;
+    if((ret = grib_get_long_internal(h, sYo,&Yo)) != GRIB_SUCCESS)
+        return ret;
+    if((ret = grib_get_long_internal(h, sjPointsAreConsecutive,&jPointsAreConsecutive)) != GRIB_SUCCESS)
+        return ret;
+    if((ret = grib_get_long_internal(h, sjScansPositively,&jScansPositively)) != GRIB_SUCCESS)
+        return ret;
+    if((ret = grib_get_long_internal(h, siScansNegatively,&iScansNegatively)) != GRIB_SUCCESS)
+        return ret;
+    if((ret = grib_get_long_internal(h, sAlternativeRowScanning,&alternativeRowScanning)) != GRIB_SUCCESS)
+        return ret;
+
+    if (earthIsOblate) {
+        r_eq = major;  /* In km */
+        r_pol = minor;
+    } else {
+        r_eq = r_pol = radius * 0.001;/*conv to km*/
+    }
+    angular_size = 2.0 * asin(1.0 / nrInRadiusOfEarth);
+    height = nrInRadiusOfEarth * r_eq;
+
+    lap = latOfSubSatellitePointInDegrees;
+    lop = lonOfSubSatellitePointInDegrees;
+    lap *= 1e-6; /* default scaling factor */
+    lop *= 1e-6;
+    if (lap != 0.0) return GRIB_NOT_IMPLEMENTED;
+    lap *= DEG2RAD;
+    lop *= DEG2RAD;
+
+    orient_angle = orientationInDegrees;
+    if (orient_angle != 0.0) return GRIB_NOT_IMPLEMENTED;
+
+    xp = xpInGridLengths;
+    yp = ypInGridLengths;
+    x0 = Xo;
+    y0 = Yo;
+
+    rx = angular_size / dx;
+    ry = (r_pol/r_eq) * angular_size / dy;
+
+    self->lats = (double*)grib_context_malloc(h->context, array_size);
+    if (!self->lats) {
+        grib_context_log(h->context,GRIB_LOG_ERROR, "unable to allocate %ld bytes", array_size);
+        return GRIB_OUT_OF_MEMORY;
+    }
+    self->lons = (double*)grib_context_malloc(h->context, array_size);
+    if (!self->lats) {
+        grib_context_log(h->context,GRIB_LOG_ERROR, "unable to allocate %ld bytes", array_size);
+        return GRIB_OUT_OF_MEMORY;
+    }
+    lats=self->lats;
+    lons=self->lons;
+
+    if (!iScansNegatively) {
+        xp = xp - x0;
+    } else {
+        xp = (nx-1) - (xp - x0);
+    }
+    if (jScansPositively) {
+        yp = yp - y0;
+    }
+    else {
+        yp = (ny-1) - (yp - y0);
+    }
+    i = 0;
+    factor_2 = (r_eq/r_pol)*(r_eq/r_pol);
+    factor_1 = height * height - r_eq * r_eq;
+
+    /* Store array of sin and cosine values to avoid recalculation */
+    s_x = (double *) grib_context_malloc(h->context, nx*sizeof(double));
+    if (!s_x) {
+        grib_context_log(h->context,GRIB_LOG_ERROR, "unable to allocate %ld bytes",nx*sizeof(double));
+        return GRIB_OUT_OF_MEMORY;
+    }
+    c_x = (double *) grib_context_malloc(h->context, nx*sizeof(double));
+    if (!c_x) {
+        grib_context_log(h->context,GRIB_LOG_ERROR, "unable to allocate %ld bytes",nx*sizeof(double));
+        return GRIB_OUT_OF_MEMORY;
+    }
+
+    for (ix = 0; ix < nx; ix++) {
+        x = (ix - xp) * rx;
+        s_x[ix] = sin(x);
+        c_x[ix] = sqrt(1.0 - s_x[ix]*s_x[ix]);
+    }
+
+    /*for (iy = 0; iy < ny; iy++) {*/
+    for (iy = ny-1; iy >= 0; --iy) {
+        y = (iy - yp) * ry;
+        sin_y = sin(y);
+        cos_y = sqrt(1.0 - sin_y*sin_y);
+
+        tmp1 = (1 + (factor_2-1.0)*sin_y*sin_y);
+        
+        for (ix = 0; ix < nx; ix++, i++) {
+            /*x = (ix - xp) * rx;*/
+            /* Use sin/cos previously computed */
+            sin_x = s_x[ix];  cos_x = c_x[ix];
+            
+            Sd = height * cos_x * cos_y;
+            Sd = Sd * Sd - tmp1*factor_1;
+            if (Sd <= 0.0) {    // outside of view
+                lats[i] = lons[i] = 0; /* TODO: error? */
+            }
+            else {
+                Sd = sqrt(Sd);
+                Sn = (height*cos_x*cos_y - Sd) / tmp1;
+                S1 = height - Sn * cos_x * cos_y;
+                S2 = Sn * sin_x * cos_y;
+                S3 = Sn * sin_y;
+                Sxy = sqrt(S1*S1 + S2*S2);
+                lons[i] = atan(S2/S1)*(RAD2DEG) + lop;
+                lats[i] = atan(factor_2*S3/Sxy)*(RAD2DEG);
+                /*fprintf(stderr, "lat=%g   lon=%g\n", lats[i], lons[i]);*/
+            }
+            while (lons[i]<0)   lons[i] += 360;
+            while (lons[i]>360) lons[i] -= 360;
+        }
+    }
+    grib_context_free(h->context, s_x);
+    grib_context_free(h->context, c_x);
+    iter->e = -1;
+
+    return ret;
+}
+
+static int destroy(grib_iterator* i)
+{
+    grib_iterator_space_view* self = (grib_iterator_space_view*)i;
+    const grib_context *c = i->h->context;
+
+    grib_context_free(c,self->lats);
+    grib_context_free(c,self->lons);
+    return 1;
+}
diff --git a/src/grib_iterator_factory.h b/src/grib_iterator_factory.h
index 908dd48..4258715 100644
--- a/src/grib_iterator_factory.h
+++ b/src/grib_iterator_factory.h
@@ -8,3 +8,4 @@
 { "latlon_reduced", &grib_iterator_class_latlon_reduced, },
 { "polar_stereographic", &grib_iterator_class_polar_stereographic, },
 { "regular", &grib_iterator_class_regular, },
+{ "space_view", &grib_iterator_class_space_view, },
diff --git a/src/grib_itrie.c b/src/grib_itrie.c
index 01b0b14..b13c274 100644
--- a/src/grib_itrie.c
+++ b/src/grib_itrie.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -310,90 +310,91 @@ struct grib_itrie {
 
 grib_itrie *grib_itrie_new(grib_context* c,int* count)
 {
-  grib_itrie* t = (grib_itrie*)grib_context_malloc_clear(c,sizeof(grib_itrie));
-  t->context = c;
-  t->id=-1;
-  t->count=count;
-  return t;
+    grib_itrie* t = (grib_itrie*)grib_context_malloc_clear(c,sizeof(grib_itrie));
+    t->context = c;
+    t->id=-1;
+    t->count=count;
+    return t;
 }
 
-void grib_itrie_delete(grib_itrie *t) {
-  GRIB_MUTEX_INIT_ONCE(&once,&init)
-  GRIB_MUTEX_LOCK(&mutex)
+void grib_itrie_delete(grib_itrie *t)
+{
+    GRIB_MUTEX_INIT_ONCE(&once,&init)
+          GRIB_MUTEX_LOCK(&mutex)
 
-  if(t)  {
-    int i;
-    for(i = 0; i < SIZE; i++)
-      if (t->next[i])
-        grib_itrie_delete(t->next[i]);
+          if(t)  {
+              int i;
+              for(i = 0; i < SIZE; i++)
+                  if (t->next[i])
+                      grib_itrie_delete(t->next[i]);
 
-    grib_context_free(t->context,t);
+              grib_context_free(t->context,t);
 
-  }
+          }
 
-  GRIB_MUTEX_UNLOCK(&mutex)
+    GRIB_MUTEX_UNLOCK(&mutex)
 }
 
 int grib_itrie_get_id(grib_itrie* t,const char* key)
 {
-  const char *k=key;
-  grib_itrie* last=t;
+    const char *k=key;
+    grib_itrie* last=t;
 
-  GRIB_MUTEX_INIT_ONCE(&once,&init)
-  GRIB_MUTEX_LOCK(&mutex)
+    GRIB_MUTEX_INIT_ONCE(&once,&init)
+    GRIB_MUTEX_LOCK(&mutex)
 
-  while(*k && t)  t = t->next[mapping[(int)*k++]];
+    while(*k && t)  t = t->next[mapping[(int)*k++]];
 
-  if(t != NULL && t->id != -1) {
-	GRIB_MUTEX_UNLOCK(&mutex)
-	return t->id;
-  } else {
-	int ret=grib_itrie_insert(last,key);
-	GRIB_MUTEX_UNLOCK(&mutex)
-	return ret;
-  }
+    if(t != NULL && t->id != -1) {
+        GRIB_MUTEX_UNLOCK(&mutex)
+	        return t->id;
+    } else {
+        int ret=grib_itrie_insert(last,key);
+        GRIB_MUTEX_UNLOCK(&mutex)
+        return ret;
+    }
 }
 
 int grib_itrie_insert(grib_itrie* t,const char* key)
 {
-  const char *k = key;
-  grib_itrie *last = t;
-  int* count;
+    const char *k = key;
+    grib_itrie *last = t;
+    int* count;
 
-  GRIB_MUTEX_INIT_ONCE(&once,&init)
+    GRIB_MUTEX_INIT_ONCE(&once,&init)
 
-  GRIB_MUTEX_LOCK(&mutex)
+    GRIB_MUTEX_LOCK(&mutex)
 
-  count=t->count;
+    count=t->count;
 
-  while(*k && t) {
-    last = t;
-    t = t->next[mapping[(int)*k]];
-    if(t) k++;
-  }
+    while(*k && t) {
+        last = t;
+        t = t->next[mapping[(int)*k]];
+        if(t) k++;
+    }
 
-  if (*k!=0)  {
-    t=last;
-    while(*k) {
-      int j = mapping[(int)*k++];
-      t->next[j] = grib_itrie_new(t->context,count);
-      t = t->next[j];
+    if (*k!=0)  {
+        t=last;
+        while(*k) {
+            int j = mapping[(int)*k++];
+            t->next[j] = grib_itrie_new(t->context,count);
+            t = t->next[j];
+        }
+    }
+    if (*(t->count) < MAX_NUM_CONCEPTS) {
+        t->id=*(t->count);
+        (*(t->count))++;
+    } else {
+        grib_context_log(t->context,GRIB_LOG_ERROR,
+                "grib_itrie_insert: too many accessors, increase MAX_NUM_CONCEPTS\n");
+        Assert(*(t->count) < MAX_NUM_CONCEPTS);
     }
-  }
-  if (*(t->count) < MAX_NUM_CONCEPTS) {
-      t->id=*(t->count);
-      (*(t->count))++;
-  } else {
-      grib_context_log(t->context,GRIB_LOG_ERROR,
-        "grib_itrie_get_id: too many accessors, increase MAX_NUM_CONCEPTS\n");
-      Assert(*(t->count) < MAX_NUM_CONCEPTS);
-  }
 
-  GRIB_MUTEX_UNLOCK(&mutex)
+    GRIB_MUTEX_UNLOCK(&mutex)
 
-  /*printf("grib_itrie_get_id: %s -> %d\n",key,t->id);*/
+    /*printf("grib_itrie_get_id: %s -> %d\n",key,t->id);*/
 
-  return t->id;
+    return t->id;
 }
 
 int grib_itrie_get_size(grib_itrie* t) {return *(t->count);}
diff --git a/src/grib_itrie_keys.c b/src/grib_itrie_keys.c
index 71da6cc..433768f 100644
--- a/src/grib_itrie_keys.c
+++ b/src/grib_itrie_keys.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -291,7 +291,7 @@ static omp_nest_lock_t mutex;
 
 static void init()
 {
-    GRIB_OMP_CRITICAL(lock_grib_hash_keys_c)
+    GRIB_OMP_CRITICAL(lock_grib_itrie_keys_c)
     {
         if (once == 0)
         {
@@ -310,100 +310,102 @@ struct grib_itrie {
 };
 
 
-grib_itrie *grib_hash_keys_new(grib_context* c,int* count) {
-  grib_itrie* t = (grib_itrie*)grib_context_malloc_clear(c,sizeof(grib_itrie));
-  t->context = c;
-  t->id=-1;
-  t->count=count;
-  return t;
+grib_itrie *grib_hash_keys_new(grib_context* c,int* count)
+{
+    grib_itrie* t = (grib_itrie*)grib_context_malloc_clear(c,sizeof(grib_itrie));
+    t->context = c;
+    t->id=-1;
+    t->count=count;
+    return t;
 }
 
-void grib_hash_keys_delete(grib_itrie *t) {
-  GRIB_MUTEX_INIT_ONCE(&once,&init)
-  GRIB_MUTEX_LOCK(&mutex)
+void grib_hash_keys_delete(grib_itrie *t)
+{
+    GRIB_MUTEX_INIT_ONCE(&once,&init);
+    GRIB_MUTEX_LOCK(&mutex);
 
-  if(t)  {
-    int i;
-    for(i = 0; i < SIZE; i++)
-      if (t->next[i])
-        grib_hash_keys_delete(t->next[i]);
+    if(t)  {
+        int i;
+        for(i = 0; i < SIZE; i++)
+            if (t->next[i])
+                grib_hash_keys_delete(t->next[i]);
 
-    grib_context_free(t->context,t);
+        grib_context_free(t->context,t);
 
-  }
+    }
 
-  GRIB_MUTEX_UNLOCK(&mutex)
+    GRIB_MUTEX_UNLOCK(&mutex);
 }
 
 int grib_hash_keys_get_id(grib_itrie* t,const char* key)
 {
-  const char *k=key;
-  grib_itrie* last=t;
+    const char *k=key;
+    grib_itrie* last=t;
 
-  struct grib_keys_hash* hash=grib_keys_hash_get(key,strlen(key));
+    struct grib_keys_hash* hash=grib_keys_hash_get(key,strlen(key));
 
-  if (hash) { 
-	  /* printf("%s found %s (%d)\n",key,hash->name,hash->id); */
-	  return hash->id;
-  }
+    if (hash) {
+        /* printf("%s found %s (%d)\n",key,hash->name,hash->id); */
+        return hash->id;
+    }
 
-  /* printf("+++ \"%s\"\n",key); */
+    /* printf("+++ \"%s\"\n",key); */
 
-  GRIB_MUTEX_INIT_ONCE(&once,&init)
-  GRIB_MUTEX_LOCK(&mutex)
+    GRIB_MUTEX_INIT_ONCE(&once,&init);
+    GRIB_MUTEX_LOCK(&mutex);
 
-  while(*k && t)  t = t->next[mapping[(int)*k++]];
+    while(*k && t)  t = t->next[mapping[(int)*k++]];
 
-  if(t != NULL && t->id != -1) {
-	GRIB_MUTEX_UNLOCK(&mutex)
-	return t->id+TOTAL_KEYWORDS+1;
-  } else {
-	int ret=grib_hash_keys_insert(last,key);
-	GRIB_MUTEX_UNLOCK(&mutex)
-	return ret+TOTAL_KEYWORDS+1;
-  }
+    if(t != NULL && t->id != -1) {
+        GRIB_MUTEX_UNLOCK(&mutex);
+        return t->id+TOTAL_KEYWORDS+1;
+    } else {
+        int ret=grib_hash_keys_insert(last,key);
+        GRIB_MUTEX_UNLOCK(&mutex);
+        return ret+TOTAL_KEYWORDS+1;
+    }
 }
 
 int grib_hash_keys_insert(grib_itrie* t,const char* key)
 {
-  const char *k = key;
-  grib_itrie *last = t;
-  int* count;
+    const char *k = key;
+    grib_itrie *last = t;
+    int* count;
 
-  GRIB_MUTEX_INIT_ONCE(&once,&init)
+    GRIB_MUTEX_INIT_ONCE(&once,&init)
 
-  GRIB_MUTEX_LOCK(&mutex)
+    GRIB_MUTEX_LOCK(&mutex)
 
-  count=t->count;
+    count=t->count;
 
-  while(*k && t) {
-    last = t;
-    t = t->next[mapping[(int)*k]];
-    if(t) k++;
-  }
+    while(*k && t) {
+        last = t;
+        t = t->next[mapping[(int)*k]];
+        if(t) k++;
+    }
 
-  if (*k!=0)  {
-    t=last;
-    while(*k) {
-      int j = mapping[(int)*k++];
-      t->next[j] = grib_hash_keys_new(t->context,count);
-      t = t->next[j];
+    if (*k!=0)  {
+        t=last;
+        while(*k) {
+            int j = mapping[(int)*k++];
+            t->next[j] = grib_hash_keys_new(t->context,count);
+            t = t->next[j];
+        }
+    }
+    if (*(t->count)+TOTAL_KEYWORDS < ACCESSORS_ARRAY_SIZE) {
+        t->id=*(t->count);
+        (*(t->count))++;
+    } else {
+        grib_context_log(t->context,GRIB_LOG_ERROR,
+                "grib_hash_keys_insert: too many accessors, increase ACCESSORS_ARRAY_SIZE\n");
+        Assert(*(t->count)+TOTAL_KEYWORDS < ACCESSORS_ARRAY_SIZE);
     }
-  }
-  if (*(t->count)+TOTAL_KEYWORDS < ACCESSORS_ARRAY_SIZE) {
-      t->id=*(t->count);
-      (*(t->count))++;
-  } else {
-      grib_context_log(t->context,GRIB_LOG_ERROR,
-        "grib_hash_keys_get_id: too many accessors, increase ACCESSORS_ARRAY_SIZE\n");
-      Assert(*(t->count)+TOTAL_KEYWORDS < ACCESSORS_ARRAY_SIZE);
-  }
 
-  GRIB_MUTEX_UNLOCK(&mutex)
+    GRIB_MUTEX_UNLOCK(&mutex)
 
-  /*printf("grib_hash_keys_get_id: %s -> %d\n",key,t->id);*/
+    /*printf("grib_hash_keys_get_id: %s -> %d\n",key,t->id);*/
 
-  return t->id;
+    return t->id;
 }
 
 int grib_hash_keys_get_size(grib_itrie* t) {return *(t->count);}
diff --git a/src/grib_jasper_encoding.c b/src/grib_jasper_encoding.c
index d278471..2635e2a 100644
--- a/src/grib_jasper_encoding.c
+++ b/src/grib_jasper_encoding.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -110,7 +110,13 @@ int grib_jasper_encode(grib_context *c, j2k_encode_helper *helper)
     image.maxcmpts_ = 1;
     image.clrspc_   = JAS_CLRSPC_SGRAY;
     image.cmprof_   = 0;
+
+#if JASPER_VERSION_MAJOR == 1
+    /* ECC-396: Support for Jasper 2.0
+     * Jasper version 1 had the 'inmem_' data member but
+     * version 2 removed it from the interface */
     image.inmem_    = 1;
+#endif
 
     cmpt.tlx_       = 0;
     cmpt.tly_       = 0;
diff --git a/src/grib_keys_iterator.c b/src/grib_keys_iterator.c
index aeaa118..b8818f9 100644
--- a/src/grib_keys_iterator.c
+++ b/src/grib_keys_iterator.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -17,17 +17,6 @@ GRIB_INLINE static int grib_inline_strcmp(const char* a,const char* b)
     return (*a==0 && *b==0) ? 0 : 1;
 }
 
-struct grib_keys_iterator{
-    grib_handle   *handle;
-    unsigned long filter_flags;     /** flags to filter out accessors */
-    unsigned long accessor_flags;     /** flags to filter out accessors */
-    grib_accessor *current;
-    char    *name_space;
-    int            at_start;
-    int            match;
-    grib_trie     *seen;
-};
-
 grib_keys_iterator* grib_keys_iterator_new(grib_handle* h,unsigned long filter_flags, const char* name_space)
 {
     grib_keys_iterator* ki=NULL;
@@ -36,7 +25,6 @@ grib_keys_iterator* grib_keys_iterator_new(grib_handle* h,unsigned long filter_f
 
     ki= (grib_keys_iterator*)grib_context_malloc_clear(h->context,sizeof(grib_keys_iterator));
     if (!ki) return NULL;
-    Assert(ki->accessor_flags == 0);
 
     ki->filter_flags = filter_flags;
     ki->handle       = h;
@@ -70,13 +58,13 @@ int grib_keys_iterator_set_flags(grib_keys_iterator* ki,unsigned long flags)
     if(flags & GRIB_KEYS_ITERATOR_SKIP_CODED)    ki->filter_flags |= GRIB_KEYS_ITERATOR_SKIP_CODED;
 
     if(flags & GRIB_KEYS_ITERATOR_SKIP_FUNCTION)
-        ki->accessor_flags |= GRIB_ACCESSOR_FLAG_FUNCTION;
+        ki->accessor_flags_skip |= GRIB_ACCESSOR_FLAG_FUNCTION;
 
     if(flags & GRIB_KEYS_ITERATOR_SKIP_READ_ONLY)
-        ki->accessor_flags |= GRIB_ACCESSOR_FLAG_READ_ONLY;
+        ki->accessor_flags_skip |= GRIB_ACCESSOR_FLAG_READ_ONLY;
 
     if(flags & GRIB_KEYS_ITERATOR_SKIP_EDITION_SPECIFIC)
-        ki->accessor_flags |= GRIB_ACCESSOR_FLAG_EDITION_SPECIFIC;
+        ki->accessor_flags_skip |= GRIB_ACCESSOR_FLAG_EDITION_SPECIFIC;
 
     return ret;
 }
@@ -111,7 +99,7 @@ static int skip(grib_keys_iterator* kiter)
     if(kiter->current->flags & GRIB_ACCESSOR_FLAG_HIDDEN)
         return 1;
 
-    if(kiter->current->flags &  kiter->accessor_flags)
+    if(kiter->current->flags &  kiter->accessor_flags_skip)
         return 1;
 
     if((kiter->filter_flags & GRIB_KEYS_ITERATOR_SKIP_COMPUTED) && kiter->current->length == 0)
diff --git a/src/grib_lex.c b/src/grib_lex.c
index 68fe7c2..2f6b9a1 100644
--- a/src/grib_lex.c
+++ b/src/grib_lex.c
@@ -1160,7 +1160,7 @@ int grib_yy_flex_debug = 0;
 char *grib_yytext;
 #line 1 "gribl.l"
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_loader_from_array.c b/src/grib_loader_from_array.c
index 4deee09..f174123 100644
--- a/src/grib_loader_from_array.c
+++ b/src/grib_loader_from_array.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_loader_from_file.c b/src/grib_loader_from_file.c
index ae66cd9..0090d7b 100644
--- a/src/grib_loader_from_file.c
+++ b/src/grib_loader_from_file.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_loader_from_handle.c b/src/grib_loader_from_handle.c
index 811e250..e6c7dd5 100644
--- a/src/grib_loader_from_handle.c
+++ b/src/grib_loader_from_handle.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_memory.c b/src/grib_memory.c
index 6b051eb..1a01cbc 100644
--- a/src/grib_memory.c
+++ b/src/grib_memory.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_nearest.c b/src/grib_nearest.c
index ebb39f6..f20b13c 100644
--- a/src/grib_nearest.c
+++ b/src/grib_nearest.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_nearest_class.c b/src/grib_nearest_class.c
index 282306c..9ef7dca 100644
--- a/src/grib_nearest_class.c
+++ b/src/grib_nearest_class.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_nearest_class_gen.c b/src/grib_nearest_class_gen.c
index 538bf17..d488fcf 100644
--- a/src/grib_nearest_class_gen.c
+++ b/src/grib_nearest_class_gen.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_nearest_class_lambert_conformal.c b/src/grib_nearest_class_lambert_conformal.c
index 8dc2d4b..537dfee 100644
--- a/src/grib_nearest_class_lambert_conformal.c
+++ b/src/grib_nearest_class_lambert_conformal.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_nearest_class_latlon_reduced.c b/src/grib_nearest_class_latlon_reduced.c
index f19fe32..558cd3b 100644
--- a/src/grib_nearest_class_latlon_reduced.c
+++ b/src/grib_nearest_class_latlon_reduced.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_nearest_class_reduced.c b/src/grib_nearest_class_reduced.c
index 610e35a..ac1c2ca 100644
--- a/src/grib_nearest_class_reduced.c
+++ b/src/grib_nearest_class_reduced.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_nearest_class_regular.c b/src/grib_nearest_class_regular.c
index 25df0c8..da146ae 100644
--- a/src/grib_nearest_class_regular.c
+++ b/src/grib_nearest_class_regular.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_nearest_class_sh.c b/src/grib_nearest_class_sh.c
index 731fd30..eeb7c1b 100644
--- a/src/grib_nearest_class_sh.c
+++ b/src/grib_nearest_class_sh.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_openjpeg_encoding.c b/src/grib_openjpeg_encoding.c
index ba134b7..cc3baed 100644
--- a/src/grib_openjpeg_encoding.c
+++ b/src/grib_openjpeg_encoding.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -296,7 +296,7 @@ static void opj_memory_stream_do_nothing(void * p_user_data)
 }
 
 /* Create a stream to use memory as the input or output */
-opj_stream_t* opj_stream_create_default_memory_stream(opj_memory_stream* memoryStream, OPJ_BOOL is_read_stream)
+static opj_stream_t* opj_stream_create_default_memory_stream(opj_memory_stream* memoryStream, OPJ_BOOL is_read_stream)
 {
 	opj_stream_t* stream;
 
diff --git a/src/grib_optimize_decimal_factor.c b/src/grib_optimize_decimal_factor.c
new file mode 100644
index 0000000..68600ca
--- /dev/null
+++ b/src/grib_optimize_decimal_factor.c
@@ -0,0 +1,218 @@
+/*
+ * Copyright 2005-2017 ECMWF.
+ *
+ * This software is licensed under the terms of the Apache Licence Version 2.0
+ * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+ *
+ * In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
+ * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
+ */
+
+#include "grib_api_internal.h"
+#include "grib_optimize_decimal_factor.h"
+#include <math.h>
+#include <float.h>
+#include <string.h>
+#include <stdlib.h>
+
+static double epsilon()
+{
+    volatile double e = 1.;
+    while (1. != (1. + e))
+    {
+        e /= 2;
+    }
+    return e;
+}
+
+static int range ()
+{
+    return (int)(log (DBL_MAX) / log (10))-1;
+}
+
+static void factec (int * krep, const double pa, const int knbit, const long kdec, const int range, long * ke, int * knutil)
+{
+    *krep = 0;
+
+    *ke = 0;
+    *knutil = 0;
+
+    if (pa < DBL_MIN)
+    {
+        *knutil = 1;
+        goto end;
+    }
+
+    if ((fabs (log10 (fabs (pa)) + (double)kdec) >= range))
+    {
+        *krep = 1;
+        goto end;
+    }
+
+    /* Binary scale factor associated to kdec */
+    *ke     = floor (log2 ((pa * grib_power (kdec, 10)) / (grib_power (knbit, 2) - 0.5))) + 1;
+    /* Encoded value for pa = max - min       */
+    *knutil = floor (0.5 + pa * grib_power ( kdec, 10) * grib_power (-*ke, 2));
+
+end:
+    return;
+}
+
+int grib_optimize_decimal_factor (grib_accessor * a, const char * reference_value,
+        const double pmax, const double pmin, const int knbit,
+        const int compat_gribex, const int compat_32bit,
+        long * kdec, long * kbin, double * ref)
+{
+    grib_handle* gh = grib_handle_of_accessor(a);
+    int idecmin = -15;
+    int idecmax =   5;
+    long inbint;
+    double xtinyr4, xhuger4, xnbint;
+    int inumax, inutil;
+    long jdec, ie;
+    int irep;
+    int RANGE = range ();
+    double EPSILON = epsilon ();
+    double pa = pmax-pmin;
+
+    if (pa == 0)
+    {
+        *kdec = 0;
+        *kbin = 0;
+        *ref  = 0.;
+        return GRIB_SUCCESS;
+    }
+
+    inumax  = 0;
+
+    if (fabs (pa) <= EPSILON)
+    {
+        *kdec = 0;
+        idecmin = 1;
+        idecmax = 0;
+    }
+    else if (pmin != 0. && fabs (pmin) < EPSILON)
+    {
+        *kdec = 0;
+        idecmin = 1;
+        idecmax = 0;
+    }
+
+    xtinyr4 = FLT_MIN;
+    xhuger4 = FLT_MAX;
+
+    inbint  = grib_power (knbit, 2) - 1;
+    xnbint  = (double)inbint;
+
+    /* Test decimal scale factors; keep the most suitable */
+    for (jdec = idecmin; jdec <= idecmax; jdec++)
+    {
+        /* Fix a problem in GRIBEX */
+        if (compat_gribex)
+            if (pa * grib_power (jdec, 10) <= 1.E-12)
+                continue;
+
+        /* Check it will be possible to decode reference value with 32bit floats */
+        if (compat_32bit)
+            if (fabs (pmin) > DBL_MIN)
+                if (log10 (fabs (pmin)) + (double)jdec <= log10 (xtinyr4))
+                    continue;
+
+        /* Check if encoding will not cause an overflow */
+        if (fabs (log10 (fabs (pa)) + (double)jdec) >= (double)RANGE)
+            continue;
+
+        factec (&irep, pa, knbit, jdec, RANGE, &ie, &inutil);
+
+        if (irep != 0)
+            continue;
+
+        /* Check it will be possible to decode the maximum value of the fields using 32bit floats */
+        if (compat_32bit)
+            if (pmin * grib_power (jdec, 10) + xnbint * grib_power (ie, 2) >= xhuger4)
+                continue;
+
+        /* GRIB1 demands that the binary scale factor be encoded in a single byte */
+        if (compat_gribex)
+            if ((ie < -126) || (ie > 127))
+                continue;
+
+        if (inutil > inumax)
+        {
+            inumax = inutil;
+            *kdec  = jdec;
+            *kbin  = ie;
+        }
+    }
+
+    if (inumax > 0) {
+        double decimal = grib_power (+*kdec, 10);
+        double divisor = grib_power (-*kbin,  2);
+        double min = pmin * decimal;
+        long vmin, vmax;
+        if (grib_get_nearest_smaller_value (gh, reference_value, min, ref) != GRIB_SUCCESS) {
+            grib_context_log (gh->context, GRIB_LOG_ERROR,
+                    "unable to find nearest_smaller_value of %g for %s", min, reference_value);
+            return GRIB_INTERNAL_ERROR;
+        }
+
+        vmax = (((pmax*decimal)-*ref)*divisor) + 0.5;
+        vmin = (((pmin*decimal)-*ref)*divisor) + 0.5;
+
+        /* This may happen if pmin*decimal-*ref is too large */
+        if ((vmin != 0) || (vmax > inbint))
+            inumax = 0;
+
+    }
+
+    /* If seeking for an optimal decimal scale factor fails, fall back to a basic method */
+    if (inumax == 0)
+    {
+        int last = compat_gribex ? 99 : 127;
+        double min = pmin, max = pmax;
+        double range = max - min;
+        double f = grib_power (knbit, 2) - 1;
+        double minrange = grib_power (-last, 2) * f;
+        double maxrange = grib_power (+last, 2) * f;
+        double decimal = 1;
+        int err;
+
+        *kdec = 0;
+
+        while (range < minrange)
+        {
+            *kdec += 1;
+            decimal *= 10;
+            min = pmin * decimal;
+            max = pmax * decimal;
+            range = max - min;
+        }
+
+        while (range > maxrange)
+        {
+            *kdec -= 1;
+            decimal /= 10;
+            min = pmin * decimal;
+            max = pmax * decimal;
+            range = max - min;
+        }
+
+        if (grib_get_nearest_smaller_value (gh, reference_value, min, ref) != GRIB_SUCCESS)
+        {
+            grib_context_log (gh->context, GRIB_LOG_ERROR,
+                    "unable to find nearest_smaller_value of %g for %s", min, reference_value);
+            return GRIB_INTERNAL_ERROR;
+        }
+
+        *kbin = grib_get_binary_scale_fact (max, *ref, knbit, &err);
+
+        if (err == GRIB_UNDERFLOW)
+        {
+            *kbin = 0;
+            *kdec = 0;
+            *ref  = 0;
+        }
+    }
+
+    return GRIB_SUCCESS;
+}
diff --git a/src/grib_optimize_decimal_factor.h b/src/grib_optimize_decimal_factor.h
new file mode 100644
index 0000000..dda744f
--- /dev/null
+++ b/src/grib_optimize_decimal_factor.h
@@ -0,0 +1,14 @@
+#ifndef _GRIB_OPTIMIZE_DECIMAL_FACTOR_H
+#define _GRIB_OPTIMIZE_DECIMAL_FACTOR_H
+
+#include "grib_api_internal.h"
+
+int grib_optimize_decimal_factor (grib_accessor * a, const char * reference_value,
+                                  const double pmax, const double pmin, const int knbit, 
+                                  const int compat_gribex, const int compat_32bit, 
+                                  long * kdec, long * kbin, double * ref);
+
+int grib_use_optimized_decimal_factor ();
+
+#endif
+
diff --git a/src/grib_parse_utils.c b/src/grib_parse_utils.c
index 97283b4..be881a8 100644
--- a/src/grib_parse_utils.c
+++ b/src/grib_parse_utils.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -285,7 +285,6 @@ int grib_accessors_list_print(grib_handle* h,grib_accessors_list* al,const char*
     char* p=NULL;
     double* dval=0;
     long* lval=0;
-    char sbuf[1024]={0,};
     char** cvals=NULL;
     int ret=0;
     char* myformat=NULL;
@@ -301,8 +300,9 @@ int grib_accessors_list_print(grib_handle* h,grib_accessors_list* al,const char*
     case GRIB_TYPE_STRING:
         myseparator= separator ? (char*)separator : default_separator;
         if (size==1) {
-            len=1024;
-            grib_unpack_string(al->accessor,sbuf,&len);
+            char sbuf[1024]={0,};
+            len = sizeof(sbuf);
+            ret = grib_unpack_string(al->accessor,sbuf,&len);
             fprintf(out,"%s",sbuf);
         } else {
             int i=0;
@@ -327,7 +327,7 @@ int grib_accessors_list_print(grib_handle* h,grib_accessors_list* al,const char*
         myformat= format ? (char*)format : double_format;
         myseparator= separator ? (char*)separator : default_separator;
         dval=(double*)grib_context_malloc_clear(h->context,sizeof(double)*size);
-        grib_accessors_list_unpack_double(al,dval,&size);
+        ret = grib_accessors_list_unpack_double(al,dval,&size);
         if (size==1) fprintf(out,myformat,dval[0]);
         else {
             int i=0;
@@ -350,7 +350,7 @@ int grib_accessors_list_print(grib_handle* h,grib_accessors_list* al,const char*
         myformat= format ? (char*)format : long_format;
         myseparator= separator ? (char*)separator : default_separator;
         lval=(long*)grib_context_malloc_clear(h->context,sizeof(long)*size);
-        grib_accessors_list_unpack_long(al,lval,&size);
+        ret = grib_accessors_list_unpack_long(al,lval,&size);
         if (size==1) fprintf(out, myformat, lval[0]);
         else {
             int i=0;
diff --git a/src/grib_query.c b/src/grib_query.c
index 34b8a58..dc5c316 100644
--- a/src/grib_query.c
+++ b/src/grib_query.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -133,7 +133,7 @@ static grib_accessor* _search_and_cache(grib_handle* h, const char* name,const c
     }
 }
 
-char* get_rank(const char* name,long *rank) {
+static char* get_rank(const char* name,int *rank) {
     char* p=(char*)name;
     char* end=p;
     char* ret=NULL;
@@ -153,7 +153,7 @@ char* get_rank(const char* name,long *rank) {
     return ret;
 }
 
-char* get_condition(const char* name,codes_condition* condition)
+static char* get_condition(const char* name,codes_condition* condition)
 {
     char* equal=(char*)name;
     char* endCondition=NULL;
@@ -201,6 +201,15 @@ char* get_condition(const char* name,codes_condition* condition)
     return str;
 }
 
+static grib_accessor* _search_by_rank(grib_accessor* a,const char* name) {
+    grib_accessor* ret=NULL;
+    grib_trie* t=accessor_bufr_data_array_get_dataAccessorsTrie(a);
+
+    ret=(grib_accessor*)grib_trie_get(t,name);
+    return ret;
+}
+
+/*
 static grib_accessor* _search_by_rank(grib_accessor* a,const char* name,long rank) {
     long r=1;
     grib_accessors_list* al=accessor_bufr_data_array_get_dataAccessors(a);
@@ -215,14 +224,20 @@ static grib_accessor* _search_by_rank(grib_accessor* a,const char* name,long ran
 
     return NULL;
 }
+*/
 
-static grib_accessor* search_by_rank(grib_handle* h, const char* name,const char *the_namespace,long rank)
+static grib_accessor* search_by_rank(grib_handle* h, const char* name,const char *the_namespace)
 {
     grib_accessor* data=search_and_cache(h,"dataAccessors",the_namespace);
     if (data) {
-        return _search_by_rank(data,name,rank);
+        return _search_by_rank(data,name);
     } else {
-        return _search_and_cache(h,name,the_namespace);
+        grib_accessor* ret=NULL;
+        int rank;
+        char* str=get_rank(name,&rank);
+        ret=_search_and_cache(h,str,the_namespace);
+        grib_context_free(h->context,str);
+        return ret;
     }
 }
 
@@ -265,7 +280,7 @@ static void search_from_accessors_list(grib_accessors_list* al,grib_accessors_li
                 accessor_result=al->accessor;
             }
             if (accessor_result) {
-                grib_accessors_list_push(result,accessor_result);
+                grib_accessors_list_push(result,accessor_result,al->rank);
             }
         }
         al=al->next;
@@ -278,7 +293,7 @@ static void search_from_accessors_list(grib_accessors_list* al,grib_accessors_li
                 accessor_result=al->accessor;
             }
             if (accessor_result) {
-                grib_accessors_list_push(result,accessor_result);
+                grib_accessors_list_push(result,accessor_result,al->rank);
             }
         }
     }
@@ -329,7 +344,7 @@ static void grib_find_same_and_push(grib_accessors_list* al,grib_accessor* a)
 {
     if (a) {
         grib_find_same_and_push(al,a->same);
-        grib_accessors_list_push(al,a);
+        grib_accessors_list_push(al,a,al->rank);
     }
 }
 
@@ -353,8 +368,12 @@ grib_accessors_list* grib_find_accessors_list(grib_handle* h,const char* name)
     } else if (name[0]=='#') {
         a=grib_find_accessor(h, name);
         if (a) {
+            char* str;
+            int r;
             al=(grib_accessors_list*)grib_context_malloc_clear(h->context,sizeof(grib_accessors_list));
-            grib_accessors_list_push(al,a);
+            str=get_rank(name,&r);
+            grib_accessors_list_push(al,a,r);
+            grib_context_free(h->context,str);
         }
     } else {
         a=grib_find_accessor(h, name);
@@ -369,14 +388,10 @@ grib_accessors_list* grib_find_accessors_list(grib_handle* h,const char* name)
 
 static grib_accessor* search_and_cache(grib_handle* h, const char* name,const char *the_namespace)
 {
-    char* str=0;
     grib_accessor* a=NULL;
-    long rank;
 
     if (name[0]=='#') {
-        str=get_rank(name,&rank);
-        a=search_by_rank(h,str,the_namespace,rank);
-        grib_context_free(h->context,str);
+        a=search_by_rank(h,name,the_namespace);
     } else {
         a=_search_and_cache(h,name,the_namespace);
     }
diff --git a/src/grib_rules.c b/src/grib_rules.c
index 1f7e85b..4729094 100644
--- a/src/grib_rules.c
+++ b/src/grib_rules.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_sarray.c b/src/grib_sarray.c
index 12c51c3..93f550c 100644
--- a/src/grib_sarray.c
+++ b/src/grib_sarray.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_scaling.c b/src/grib_scaling.c
index e35d44e..1eb5f2f 100644
--- a/src/grib_scaling.c
+++ b/src/grib_scaling.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_templates.c b/src/grib_templates.c
index cbc421c..afb3715 100644
--- a/src/grib_templates.c
+++ b/src/grib_templates.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_templates.h b/src/grib_templates.h
index 7b4d972..8a6edd8 100644
--- a/src/grib_templates.h
+++ b/src/grib_templates.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_timer.c b/src/grib_timer.c
index ea9f6a7..524b66d 100644
--- a/src/grib_timer.c
+++ b/src/grib_timer.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_trie.c b/src/grib_trie.c
index 6adc532..fa0f35b 100644
--- a/src/grib_trie.c
+++ b/src/grib_trie.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -47,7 +47,7 @@ static int mapping[] = {
 0, /* 20 */
 0, /* 21 */
 0, /* 22 */
-0, /* 23 */
+38, /* # */
 0, /* 24 */
 0, /* 25 */
 0, /* 26 */
@@ -270,7 +270,20 @@ static int mapping[] = {
 0, /* ff */
 };
 
-#define SIZE 38
+/* ECC-388 */
+#ifdef DEBUG
+ static const size_t NUM_MAPPINGS = sizeof(mapping)/sizeof(mapping[0]);
+
+ #define DebugCheckBounds(index, value) \
+   do { \
+    if (!((index) >= 0 && (index) < NUM_MAPPINGS) ) {printf("ERROR: string='%s' index=%ld @ %s +%d \n", value, (long)index, __FILE__, __LINE__); abort();} \
+   } while(0)
+#else
+ #define DebugCheckBounds(index, value)
+#endif
+
+
+#define SIZE 39
 
 #if GRIB_PTHREADS
 static pthread_once_t once  = PTHREAD_ONCE_INIT;
@@ -301,128 +314,158 @@ static void init()
 #endif
 
 struct grib_trie {
-  grib_trie* next[SIZE];
-  grib_context *context;
-  int first;
-  int last;
-  void* data;
+    grib_trie* next[SIZE];
+    grib_context *context;
+    int first;
+    int last;
+    void* data;
 };
 
-grib_trie *grib_trie_new(grib_context* c) {
+grib_trie *grib_trie_new(grib_context* c)
+{
 #ifdef RECYCLE_TRIE
-  grib_trie* t = grib_context_malloc_clear_persistent(c,sizeof(grib_trie));
+    grib_trie* t = grib_context_malloc_clear_persistent(c,sizeof(grib_trie));
 #else
-  grib_trie* t = (grib_trie*)grib_context_malloc_clear(c,sizeof(grib_trie));
+    grib_trie* t = (grib_trie*)grib_context_malloc_clear(c,sizeof(grib_trie));
 #endif
-  t->context = c;
-  t->first=SIZE;
-  t->last=-1;
-  return t;
+    t->context = c;
+    t->first=SIZE;
+    t->last=-1;
+    return t;
 }
 
-void grib_trie_delete(grib_trie *t) {
-  GRIB_MUTEX_INIT_ONCE(&once,&init)
-  GRIB_MUTEX_LOCK(&mutex)
-  if(t)  {
-    int i;
-    for(i = t->first; i <= t->last; i++)
-      if (t->next[i]) {
-        grib_context_free( t->context, t->next[i]->data );
-        grib_trie_delete(t->next[i]);
-      }
+void grib_trie_delete_container(grib_trie *t)
+{
+    GRIB_MUTEX_INIT_ONCE(&once,&init);
+    GRIB_MUTEX_LOCK(&mutex);
+    if(t)  {
+        int i;
+        for(i = t->first; i <= t->last; i++)
+            if (t->next[i]) {
+                grib_trie_delete_container(t->next[i]);
+            }
 #ifdef RECYCLE_TRIE
-    grib_context_free_persistent(t->context,t);
+        grib_context_free_persistent(t->context,t);
 #else
-    grib_context_free(t->context,t);
+        grib_context_free(t->context,t);
 #endif
-  }
-  GRIB_MUTEX_UNLOCK(&mutex)
+    }
+    GRIB_MUTEX_UNLOCK(&mutex);
 }
 
-void grib_trie_clear(grib_trie *t) {
-  if(t)  {
-    int i;
-    t->data=NULL;
-    for(i = t->first; i <= t->last; i++)
-      if (t->next[i])
-        grib_trie_clear(t->next[i]);
-  }
+void grib_trie_delete(grib_trie *t)
+{
+    GRIB_MUTEX_INIT_ONCE(&once,&init);
+    GRIB_MUTEX_LOCK(&mutex);
+    if(t)  {
+        int i;
+        for(i = t->first; i <= t->last; i++)
+            if (t->next[i]) {
+                grib_context_free( t->context, t->next[i]->data );
+                grib_trie_delete(t->next[i]);
+            }
+#ifdef RECYCLE_TRIE
+        grib_context_free_persistent(t->context,t);
+#else
+        grib_context_free(t->context,t);
+#endif
+    }
+    GRIB_MUTEX_UNLOCK(&mutex);
+}
+
+void grib_trie_clear(grib_trie *t)
+{
+    if(t)  {
+        int i;
+        t->data=NULL;
+        for(i = t->first; i <= t->last; i++)
+            if (t->next[i])
+                grib_trie_clear(t->next[i]);
+    }
 }
 
 void* grib_trie_insert(grib_trie* t,const char* key,void* data)
 {
-  grib_trie *last = t;
-  const char *k = key;
-  void* old = NULL;
+    grib_trie *last = t;
+    const char *k = key;
+    void* old = NULL;
 
-  GRIB_MUTEX_INIT_ONCE(&once,&init)
-  GRIB_MUTEX_LOCK(&mutex)
+    GRIB_MUTEX_INIT_ONCE(&once,&init);
+    GRIB_MUTEX_LOCK(&mutex);
 
-  while(*k && t) {
-    last = t;
-    t = t->next[mapping[(int)*k]];
-    if(t) k++;
-  }
+    while(*k && t) {
+        last = t;
+        DebugCheckBounds((int)*k, key);
+        t = t->next[mapping[(int)*k]];
+        if(t) k++;
+    }
 
-  if(*k == 0) {
-	old = t->data;
-    t->data=data;
-  } else {
-    t = last;
-    while(*k) {
-      int j = mapping[(int)*k++];
-      if(j < t->first) t->first = j;
-      if(j > t->last)  t->last = j;
-      t = t->next[j] =grib_trie_new(t->context);
+    if(*k == 0) {
+        old = t->data;
+        t->data=data;
+    } else {
+        t = last;
+        while(*k) {
+            int j = 0;
+            DebugCheckBounds((int)*k, key);
+            j = mapping[(int)*k++];
+            if(j < t->first) t->first = j;
+            if(j > t->last)  t->last = j;
+            t = t->next[j] =grib_trie_new(t->context);
+        }
+        old = t->data;
+        t->data=data;
     }
-	old = t->data;
-    t->data=data;
-  }
-  GRIB_MUTEX_UNLOCK(&mutex)
-  return data == old ? NULL : old;
+    GRIB_MUTEX_UNLOCK(&mutex);
+    return data == old ? NULL : old;
 }
 
 void* grib_trie_insert_no_replace(grib_trie* t,const char* key,void* data)
 {
-	grib_trie *last = t;
-	const char *k = key;
+    grib_trie *last = t;
+    const char *k = key;
+
+    while(*k && t) {
+        last = t;
+        DebugCheckBounds((int)*k, key);
+        t = t->next[mapping[(int)*k]];
+        if(t) k++;
+    }
+
+    if(*k != 0) {
+        t = last;
+        while(*k) {
+            int j = 0;
+            DebugCheckBounds((int)*k, key);
+            j = mapping[(int)*k++];
+            if(j < t->first) t->first = j;
+            if(j > t->last)  t->last = j;
+            t = t->next[j] =grib_trie_new(t->context);
+        }
+    }
 
-	while(*k && t) {
-		last = t;
-		t = t->next[mapping[(int)*k]];
-		if(t) k++;
-	}
+    if (!t->data) t->data=data;
 
-	if(*k != 0) { 
-		t = last;
-		while(*k) {
-			int j = mapping[(int)*k++];
-			if(j < t->first) t->first = j;
-			if(j > t->last)  t->last = j;
-			t = t->next[j] =grib_trie_new(t->context);
-		}
-	}
-	
-	if (!t->data) t->data=data;
-	
-	return t->data;
+    return t->data;
 }
 
 void *grib_trie_get(grib_trie* t,const char* key)
 {
-  const char *k = key;
-  GRIB_MUTEX_INIT_ONCE(&once,&init)
-  GRIB_MUTEX_LOCK(&mutex)
+    const char *k = key;
+    GRIB_MUTEX_INIT_ONCE(&once,&init);
+    GRIB_MUTEX_LOCK(&mutex);
 
-  while(*k && t)
-    t = t->next[mapping[(int)*k++]];
+    while(*k && t) {
+        DebugCheckBounds((int)*k, key);
+        t = t->next[mapping[(int)*k++]];
+    }
 
-  if(*k == 0 && t != NULL && t->data!=NULL) {
-    GRIB_MUTEX_UNLOCK(&mutex)
-    return t->data;
-  }
-  GRIB_MUTEX_UNLOCK(&mutex)
-  return NULL;
+    if(*k == 0 && t != NULL && t->data!=NULL) {
+        GRIB_MUTEX_UNLOCK(&mutex);
+        return t->data;
+    }
+    GRIB_MUTEX_UNLOCK(&mutex);
+    return NULL;
 }
 
 /*
@@ -444,4 +487,3 @@ void grib_trie_remove(grib_trie* trie,const char* key)
 
 }
 */
-
diff --git a/src/grib_util.c b/src/grib_util.c
index 593fa77..1de4220 100644
--- a/src/grib_util.c
+++ b/src/grib_util.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -666,6 +666,7 @@ grib_handle* grib_util_set_spec2(grib_handle* h,
     double laplacianOperator;
     int packingTypeIsSet=0;
     int setSecondOrder=0;
+    int setJpegPacking=0;
     size_t slen=17;
     int grib1_high_resolution_fix = 0; /* boolean: See GRIB-863 */
     int global_grid = 0; /* boolean */
@@ -1071,8 +1072,12 @@ grib_handle* grib_util_set_spec2(grib_handle* h,
                 SET_STRING_VALUE("packingType","grid_complex");
             break;
         case GRIB_UTIL_PACKING_TYPE_JPEG:
+            /* Have to delay JPEG packing:
+             * Reason 1: It is not available in GRIB1 and so we have to wait until we change edition
+             * Reason 2: It has to be done AFTER we set the data values
+             */
             if (strcmp(input_packing_type,"grid_jpeg") && !strcmp(input_packing_type,"grid_simple"))
-                SET_STRING_VALUE("packingType","grid_jpeg");
+                setJpegPacking = 1;
             break;
         case GRIB_UTIL_PACKING_TYPE_GRID_SECOND_ORDER:
             /* we delay the set of grid_second_order because we don't want
@@ -1294,6 +1299,19 @@ grib_handle* grib_util_set_spec2(grib_handle* h,
         }
     }
 
+    if (editionNumber > 1 || packing_spec->editionNumber > 1) {
+        /* ECC-353 */
+        /* JPEG packing is not available in GRIB edition 1 and has to be done AFTER we set data values */
+        if (setJpegPacking == 1) {
+            *err = grib_set_string(outh, "packingType", "grid_jpeg", &slen);
+            if (*err != GRIB_SUCCESS) {
+                fprintf(stderr,"GRIB_UTIL_SET_SPEC: Failed to change packingType to JPEG: %s\n",
+                        grib_get_error_message(*err));
+                goto cleanup;
+            }
+        }
+    }
+
     if (packing_spec->deleteLocalDefinition) {
         /* TODO: We need two calls because of grib1/grib2 issues re removing local defs! */
         grib_set_long(outh,"setLocalDefinition", 0);
@@ -1618,43 +1636,6 @@ char get_dir_separator_char(void)
     return DIR_SEPARATOR_CHAR;
 }
 
-/* Return the component after final slash */
-/*  "/tmp/x"  -> "x"  */
-/*  "/tmp/"   -> ""   */
-const char* extract_filename(const char* filepath)
-{
-    const char* s = strrchr(filepath, get_dir_separator_char());
-    if (!s) return filepath;
-    else    return s + 1;
-}
-
-/* Boolean return type: 1 if the reduced gaussian field is global, 0 for sub area */
-int is_gaussian_global(
-        double lat1, double lat2, double lon1, double lon2,/* bounding box*/
-        long num_points_equator, /* num points on latitude at equator */
-        const double* latitudes, /* array of Gaussian latitudes (size 2*N) */
-        double angular_precision /* tolerance for angle comparison */
-)
-{
-    int global = 1;
-    const double d = fabs(latitudes[0] - latitudes[1]);
-    /* Compute the expected last longitude for a global field */
-    const double lon2_global = 360.0 - 360.0/num_points_equator;
-    /* Compute difference between expected longitude and actual one */
-    const double lon2_diff = fabs( lon2  - lon2_global ) - 360.0/num_points_equator;
-
-    /* Note: final gaussian latitude = -first latitude */
-    if ( (fabs(lat1 - latitudes[0]) >= d ) ||
-         (fabs(lat2 + latitudes[0]) >= d ) ||
-         lon1 != 0                         ||
-         lon2_diff > angular_precision
-    )
-    {
-        global = 0; /* sub area */
-    }
-    return global;
-}
-
 char* codes_getenv(const char* name)
 {
     /* Look for the new ecCodes environment variable names */
@@ -1690,44 +1671,3 @@ char* codes_getenv(const char* name)
     }
     return result;
 }
-
-/* Return the rank of the key using list of keys (For BUFR keys) */
-/* The argument 'keys' is an input as well as output from each call */
-int compute_key_rank(grib_handle* h, grib_string_list* keys, const char* key)
-{
-    grib_string_list* next=keys;
-    grib_string_list* prev=keys;
-    int theRank=0;
-    size_t size=0;
-    grib_context* c=h->context;
-    Assert(h->product_kind == PRODUCT_BUFR);
-
-    while (next && next->value && strcmp(next->value,key)) {
-        prev=next;
-        next=next->next;
-    }
-    if (!next) {
-        prev->next=(grib_string_list*)grib_context_malloc_clear(c,sizeof(grib_string_list));
-        next=prev->next;
-    }
-    if (!next->value) {
-        next->value=strdup(key);
-        next->count=0;
-    }
-
-    next->count++;
-    theRank=next->count;
-    if (theRank==1) {
-        /* If the count is 1 it could mean two things: */
-        /*   This is the first instance of the key and there is another one */
-        /*   This is the first and only instance of the key */
-        /* So we check if there is a second one of this key, */
-        /* If not, then rank is zero i.e. this is the only instance */
-        char* s=grib_context_malloc_clear(c,strlen(key)+5);
-        sprintf(s,"#2#%s",key);
-        if (grib_get_size(h,s,&size)==GRIB_NOT_FOUND) theRank=0;
-        grib_context_free(c, s);
-    }
-
-    return theRank;
-}
diff --git a/src/grib_value.c b/src/grib_value.c
index 5fc53ad..07d3837 100644
--- a/src/grib_value.c
+++ b/src/grib_value.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -140,8 +140,8 @@ struct grib_key_err {
 
 int grib_copy_namespace(grib_handle* dest, const char* name, grib_handle* src)
 {
-    int *err=0;
-    int type;
+    int *err=NULL;
+    int type, error_code=0;
     size_t len;
     char *sval = NULL;
     unsigned char *uval = NULL;
@@ -155,7 +155,7 @@ int grib_copy_namespace(grib_handle* dest, const char* name, grib_handle* src)
 
     if (!dest || !src) return GRIB_NULL_HANDLE;
 
-    iter=grib_keys_iterator_new(src,0,(char*)name);
+    iter=grib_keys_iterator_new(src,0,name);
 
     if (!iter) {
         grib_context_log(src->context,GRIB_LOG_ERROR,"grib_copy_namespace: unable to get iterator for %s",name );
@@ -250,6 +250,7 @@ int grib_copy_namespace(grib_handle* dest, const char* name, grib_handle* src)
                 if((*err = grib_set_double_array(dest,key,dval,len)) != GRIB_SUCCESS)
                     return *err;
 
+                grib_context_free(src->context,dval);
                 break;
 
             case GRIB_TYPE_BYTES:
@@ -283,6 +284,7 @@ int grib_copy_namespace(grib_handle* dest, const char* name, grib_handle* src)
             key_err=key_err->next;
         }
     }
+    error_code = *err; /* copy the error code before cleanup */
     grib_keys_iterator_delete(iter);
     key_err=first;
     while (key_err) {
@@ -292,7 +294,7 @@ int grib_copy_namespace(grib_handle* dest, const char* name, grib_handle* src)
         key_err=next;
     }
 
-    return *err;
+    return error_code;
 }
 
 int grib_set_double(grib_handle* h, const char* name, double val)
@@ -402,7 +404,9 @@ int grib_set_string_array(grib_handle* h, const char* name, const char** val, si
 
     a = grib_find_accessor(h, name);
 
-    grib_context_log(h->context,GRIB_LOG_DEBUG,"grib_set_string %s=%s\n",name,val);
+    if (h->context->debug) {
+        printf("ECCODES DEBUG grib_set_string_array key=%s %ld values\n",name,(long)length);
+    }
 
     if(a)
     {
@@ -664,7 +668,7 @@ int grib_set_double_array_internal(grib_handle* h, const char* name, const doubl
     int ret=0;
 
     if (h->context->debug)
-        printf("ECCODES DEBUG grib_set_double_array_internal key=%s %ld values\n",name, (long)length);
+        printf("ECCODES DEBUG grib_set_double_array_internal key=%s %ld values\n",name,(long)length);
 
     if (length==0) {
         grib_accessor* a = grib_find_accessor(h, name);
@@ -923,9 +927,9 @@ int grib_get_double_element(grib_handle* h, const char* name, int i, double* val
 {
     grib_accessor* act = grib_find_accessor(h, name);
 
-    if(act)
+    if (act) {
         return grib_unpack_double_element(act, i,val);
-
+    }
     return GRIB_NOT_FOUND;
 }
 
@@ -941,41 +945,54 @@ int grib_points_get_values(grib_handle* h, grib_points* points, double* val)
         if (ret) return ret;
         val+=points->group_len[i];
     }
-    return 0;
+    return GRIB_SUCCESS;
 }
 
-int grib_get_double_elements(grib_handle* h, const char* name, int* i, long len,double* val)
+int grib_get_double_elements(grib_handle* h, const char* name, int* index_array, long len, double* val_array)
 {
     double* values=0;
-    int ret=0;
-    size_t size=0;
-    int j=0;
+    int err=0;
+    size_t size=0, num_bytes = 0;
+    long j = 0;
     grib_accessor* act =NULL;
 
     act= grib_find_accessor(h, name);
+    if (!act) return GRIB_NOT_FOUND;
 
-    ret=_grib_get_size(h,act,&size);
+    err=_grib_get_size(h,act,&size);
 
-    if (ret!=GRIB_SUCCESS) {
+    if (err!=GRIB_SUCCESS) {
         grib_context_log(h->context,GRIB_LOG_ERROR,"grib_get_double_elements: cannot get size of %s\n",name);
-        return ret;
+        return err;
     }
 
-    values=(double*)grib_context_malloc( h->context,size * sizeof(double));
+    /* Check index array has valid values */
+    for (j=0;j<len;j++) {
+        const int anIndex = index_array[j];
+        if (anIndex < 0 || anIndex >= size) {
+            grib_context_log(h->context,GRIB_LOG_ERROR,
+                    "grib_get_double_elements: index out of range: %d (should be between 0 and %ld)", anIndex, size-1);
+            return GRIB_INVALID_ARGUMENT;
+        }
+    }
 
+    num_bytes = size * sizeof(double);
+    values=(double*)grib_context_malloc(h->context, num_bytes);
     if (!values) {
-        grib_context_log(h->context,GRIB_LOG_ERROR,"grib_get_double_elements: unable to allocate %ld bytes\n",
-                size*sizeof(double));
+        grib_context_log(h->context,GRIB_LOG_ERROR,"grib_get_double_elements: unable to allocate %ld bytes\n", num_bytes);
         return GRIB_OUT_OF_MEMORY;
     }
 
-    ret = grib_unpack_double(act, values, &size);
-
-    for (j=0;j<len;j++) val[j]=values[i[j]];
+    err = grib_unpack_double(act, values, &size);
+    if (!err) {
+        for (j=0;j<len;j++) {
+            val_array[j] = values[index_array[j]];
+        }
+    }
 
     grib_context_free(h->context,values);
 
-    return GRIB_SUCCESS;
+    return err;
 }
 
 int grib_get_string_internal(grib_handle* h, const char* name, char* val, size_t *length)
@@ -1027,7 +1044,7 @@ int grib_get_bytes(grib_handle* h, const char* name, unsigned char* val, size_t
     grib_accessor* act = grib_find_accessor(h, name);
     err = act? grib_unpack_bytes(act, val, length) : GRIB_NOT_FOUND;
     if(err) grib_context_log(h->context,GRIB_LOG_ERROR,
-            "grib_get_bytes_internal %s failed %s",  name, grib_get_error_message(err));
+            "grib_get_bytes %s failed %s",  name, grib_get_error_message(err));
     return err;
 }
 
@@ -1037,6 +1054,8 @@ int grib_get_native_type(grib_handle* h, const char* name,int* type)
     grib_accessor* a =NULL;
     *type = GRIB_TYPE_UNDEFINED;
 
+    DebugAssert( name != NULL && strlen(name) > 0 );
+
     if (name[0] == '/' ) {
         al=grib_find_accessors_list(h,name);
         if (!al) return GRIB_NOT_FOUND;
@@ -1327,51 +1346,51 @@ static void grib_clean_key_value(grib_context* c,grib_key_value_list* kv)
 
 static int grib_get_key_value(grib_handle* h,grib_key_value_list* kv)
 {
-    int ret=0;
+    int err=0;
     size_t size=0;
     grib_keys_iterator* iter=NULL;
     grib_key_value_list* list=NULL;
 
     if (kv->has_value) grib_clean_key_value(h->context,kv);
 
-    ret=grib_get_size(h,kv->name,&size);
-    if (ret) {
-        kv->error=ret;
-        return ret;
+    err=grib_get_size(h,kv->name,&size);
+    if (err) {
+        kv->error=err;
+        return err;
     }
     if (size==0) size=512;
 
     switch (kv->type) {
     case GRIB_TYPE_LONG:
         kv->long_value=(long*)grib_context_malloc_clear(h->context,size*sizeof(long));
-        ret=grib_get_long_array(h,kv->name,kv->long_value,&size);
-        kv->error=ret;
+        err=grib_get_long_array(h,kv->name,kv->long_value,&size);
+        kv->error=err;
         break;
     case GRIB_TYPE_DOUBLE:
         kv->double_value=(double*)grib_context_malloc_clear(h->context,size*sizeof(double));
-        ret=grib_get_double_array(h,kv->name,kv->double_value,&size);
-        kv->error=ret;
+        err=grib_get_double_array(h,kv->name,kv->double_value,&size);
+        kv->error=err;
         break;
     case GRIB_TYPE_STRING:
         grib_get_string_length(h,kv->name,&size);
         kv->string_value=(char*)grib_context_malloc_clear(h->context,size*sizeof(char));
-        ret=grib_get_string(h,kv->name,kv->string_value,&size);
-        kv->error=ret;
+        err=grib_get_string(h,kv->name,kv->string_value,&size);
+        kv->error=err;
         break;
     case GRIB_TYPE_BYTES:
         kv->string_value=(char*)grib_context_malloc_clear(h->context,size*sizeof(char));
-        ret=grib_get_bytes(h,kv->name,(unsigned char*)kv->string_value,&size);
-        kv->error=ret;
+        err=grib_get_bytes(h,kv->name,(unsigned char*)kv->string_value,&size);
+        kv->error=err;
         break;
     case GRIB_NAMESPACE:
-        iter=grib_keys_iterator_new(h,0,(char*)kv->name);
+        iter=grib_keys_iterator_new(h,0,kv->name);
         list=(grib_key_value_list*)grib_context_malloc_clear(h->context,sizeof(grib_key_value_list));
         kv->namespace_value=list;
         while(grib_keys_iterator_next(iter))
         {
             list->name=grib_keys_iterator_get_name(iter);
-            ret=grib_get_native_type(h,list->name,&(list->type));
-            ret=grib_get_key_value(h,list);
+            err=grib_get_native_type(h,list->name,&(list->type));
+            err=grib_get_key_value(h,list);
             list->next=(grib_key_value_list*)grib_context_malloc_clear(h->context,sizeof(grib_key_value_list));
             list=list->next;
         }
@@ -1379,12 +1398,12 @@ static int grib_get_key_value(grib_handle* h,grib_key_value_list* kv)
         break;
 
     default:
-        ret=grib_get_native_type(h,kv->name,&(kv->type));
-        ret=grib_get_key_value(h,kv);
+        err=grib_get_native_type(h,kv->name,&(kv->type));
+        err=grib_get_key_value(h,kv);
         break;
     }
     kv->has_value=1;
-    return ret;
+    return err;
 }
 
 grib_key_value_list* grib_key_value_list_clone(grib_context* c,grib_key_value_list* list)
@@ -1668,3 +1687,80 @@ int grib_key_equal(grib_handle* h1,grib_handle* h2,const char* key,int type,int
     }
     return 1;
 }
+
+int codes_copy_key(grib_handle* h1,grib_handle* h2,const char* key,int type)
+{
+    double d;
+    double* ad;
+    long l;
+    long* al;
+    char* s=0;
+    char** as=0;
+    size_t len1,len;
+    int err=0;
+
+    if (  type != GRIB_TYPE_DOUBLE &&
+            type != GRIB_TYPE_LONG   &&
+            type != GRIB_TYPE_STRING    ) {
+        err=grib_get_native_type(h1,key,&type);
+        if (err) return err;
+    }
+
+    err=grib_get_size(h1,key,&len1);
+    if (err) return err;
+
+    switch (type) {
+    case GRIB_TYPE_DOUBLE:
+        if (len1==1) {
+            err=grib_get_double(h1,key,&d);
+            if (err) return err;
+            grib_context_log(h1->context,GRIB_LOG_DEBUG,"codes_copy_key: %s=%g\n",key,d);
+            err=grib_set_double(h2,key,d);
+            return err;
+        } else {
+            ad=(double*)grib_context_malloc_clear(h1->context,len1*sizeof(double));
+            err=grib_get_double_array(h1,key,ad,&len1);
+            if (err) return err;
+            err=grib_set_double_array(h2,key,ad,len1);
+            grib_context_free(h1->context,ad);
+            return err;
+        }
+        break;
+    case GRIB_TYPE_LONG:
+        if (len1==1) {
+            err=grib_get_long(h1,key,&l);
+            if (err) return err;
+            grib_context_log(h1->context,GRIB_LOG_DEBUG,"codes_copy_key: %s=%ld\n",key,l);
+            err=grib_set_long(h2,key,l);
+            return err;
+        } else {
+            al=(long*)grib_context_malloc_clear(h1->context,len1*sizeof(long));
+            err=grib_get_long_array(h1,key,al,&len1);
+            if (err) return err;
+            err=grib_set_long_array(h2,key,al,len1);
+            grib_context_free(h1->context,al);
+            return err;
+        }
+        break;
+    case GRIB_TYPE_STRING:
+        err=grib_get_string_length(h1,key,&len);
+        if (len1==1) {
+            s=(char*)grib_context_malloc_clear(h1->context,len);
+            err=grib_get_string(h1,key,s,&len);
+            if (err) return err;
+            grib_context_log(h1->context,GRIB_LOG_DEBUG,"codes_copy_key: %s=%s\n",key,s);
+            err=grib_set_string(h2,key,s,&len);
+            grib_context_free(h1->context,s);
+            return err;
+        } else {
+            as=(char**)grib_context_malloc_clear(h1->context,len1*sizeof(char*));
+            err=grib_get_string_array(h1,key,as,&len1);
+            if (err) return err;
+            err=grib_set_string_array(h2,key,(const char **)as,len1);
+            return err;
+        }
+        break;
+    default:
+        return GRIB_INVALID_TYPE;
+    }
+}
diff --git a/src/grib_vdarray.c b/src/grib_vdarray.c
index cf1e4cb..dd80884 100644
--- a/src/grib_vdarray.c
+++ b/src/grib_vdarray.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_viarray.c b/src/grib_viarray.c
index df14b2e..be69d2a 100644
--- a/src/grib_viarray.c
+++ b/src/grib_viarray.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/grib_vsarray.c b/src/grib_vsarray.c
index ce301d3..409666c 100644
--- a/src/grib_vsarray.c
+++ b/src/grib_vsarray.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/gribl.l b/src/gribl.l
index 3f373a1..977cc03 100644
--- a/src/gribl.l
+++ b/src/gribl.l
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/griby.y b/src/griby.y
index d81f06e..61262e3 100644
--- a/src/griby.y
+++ b/src/griby.y
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/jgribapi_GribFile.h b/src/jgribapi_GribFile.h
index 1479a0d..e7e7f21 100644
--- a/src/jgribapi_GribFile.h
+++ b/src/jgribapi_GribFile.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/jgribapi_GribHandle.h b/src/jgribapi_GribHandle.h
index 81044e3..85c76df 100644
--- a/src/jgribapi_GribHandle.h
+++ b/src/jgribapi_GribHandle.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/jgribapi_GribIterator.h b/src/jgribapi_GribIterator.h
index 76df976..71c9cc7 100644
--- a/src/jgribapi_GribIterator.h
+++ b/src/jgribapi_GribIterator.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/md5.c b/src/md5.c
index b3c6b6b..e28ca1d 100644
--- a/src/md5.c
+++ b/src/md5.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/md5.h b/src/md5.h
index 5aeff05..e5fb82b 100644
--- a/src/md5.h
+++ b/src/md5.h
@@ -2,7 +2,7 @@
 #define md5_H
 
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/minmax_val.c b/src/minmax_val.c
index cf15d21..6b0a67b 100644
--- a/src/minmax_val.c
+++ b/src/minmax_val.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/src/string_util.c b/src/string_util.c
new file mode 100644
index 0000000..29c7744
--- /dev/null
+++ b/src/string_util.c
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2005-2017 ECMWF.
+ *
+ * This software is licensed under the terms of the Apache Licence Version 2.0
+ * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+ *
+ * In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
+ * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
+ */
+
+#include "grib_api_internal.h"
+
+/* Compare two strings ignoring case.
+ * strcasecmp is not in the C standard. However, it's defined by
+ * 4.4BSD, POSIX.1-2001. So we use our own
+ */
+int strcmp_nocase(const char *s1, const char *s2)
+{
+    const unsigned char *us1 = (const unsigned char *)s1,
+            *us2 = (const unsigned char *)s2;
+
+    while (tolower(*us1) == tolower(*us2++)) {
+        if (*us1++ == '\0')
+            return (0);
+    }
+    return (tolower(*us1) - tolower(*--us2));
+}
+
+/* Strip whitespace from the end of a string */
+void rtrim(char* s)
+{
+    size_t len = 0;
+    if (!s) return;
+    len = strlen(s);
+    while (len > 0 && isspace((unsigned char)s[len - 1]))
+        len--;
+    s[len] = '\0';
+}
+
+/* Return the component after final slash */
+/*  "/tmp/x"  -> "x"  */
+/*  "/tmp/"   -> ""   */
+const char* extract_filename(const char* filepath)
+{
+    const char* s = strrchr(filepath, get_dir_separator_char());
+    if (!s) return filepath;
+    else    return s + 1;
+}
+
+/* Returns an array of strings the last of which is NULL */
+char** string_split(char* inputString, const char* delimiter)
+{
+    char** result = NULL;
+    char* p = inputString;
+    char* lastDelimiter = NULL;
+    char* aToken = NULL;
+    size_t numTokens = 0;
+    size_t strLength = 0;
+    size_t index = 0;
+    char delimiterChar = 0;
+
+    DebugAssert(inputString);
+    DebugAssert( delimiter && (strlen(delimiter)==1) );
+    delimiterChar = delimiter[0];
+    while (*p) {
+        const char ctmp = *p;
+        if (ctmp == delimiterChar) {
+            ++numTokens;
+            lastDelimiter = p;
+        }
+        p++;
+    }
+    strLength = strlen(inputString);
+    if (lastDelimiter < (inputString + strLength - 1)) {
+        ++numTokens; /* there is a trailing token */
+    }
+    ++numTokens; /* terminating NULL string to mark the end */
+
+    result = (char**)malloc(numTokens * sizeof(char*));
+    Assert(result);
+
+    /* Start tokenizing */
+    aToken = strtok(inputString, delimiter);
+    while (aToken) {
+        Assert(index < numTokens);
+        *(result + index++) = strdup(aToken);
+        aToken = strtok(NULL, delimiter);
+    }
+    Assert(index == numTokens - 1);
+    *(result + index) = NULL;
+
+    return result;
+}
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 11817fc..69a3e73 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -17,10 +17,14 @@ list( APPEND test_bins
       multi_from_message
       read_index
       unit_tests
+      bufr_keys_iter
       gauss_sub
       grib_util_set_spec
       local_MeteoFrance
       grib_2nd_order_numValues
+      optimize_scaling
+      optimize_scaling_sh
+      ecc-386
 )
 
 foreach( tool ${test_bins} )
@@ -34,15 +38,18 @@ endforeach()
 
 # Now add each test (shell scripts)
 #################################################
-list( APPEND tests1
+# These tests do not require any data downloads
+list( APPEND tests_no_data_reqd
     definitions
     calendar
     unit_tests
     md5
     uerra
     grib_2nd_order_numValues
+    julian
 )
-list( APPEND tests2
+# These tests do require data downloads
+list( APPEND tests_data_reqd
     grib_double_cmp
     bufr_dump
     bufr_dump_decode_filter
@@ -59,9 +66,12 @@ list( APPEND tests2
     bufr_json
     bufr_ls
     bufr_change_edition
+    bufr_keys_iter
     ecc-197
     ecc-286
     ecc-288
+    ecc-379
+    ecc-393
     gts_get
     gts_ls
     gts_compare
@@ -71,11 +81,13 @@ list( APPEND tests2
     metar_compare
     bufr_set
     ieee
+    optimize_scaling
+    optimize_scaling_sh
     grib1to2
     grib2to1
     badgrib
     ls
-    filter
+    grib_filter
     multi
     budg
     gridType
@@ -98,7 +110,6 @@ list( APPEND tests2
     second_order
     multi_from_message
     change_scanning
-    julian
     statistics
     tigge
     tigge_conversions
@@ -111,16 +122,16 @@ list( APPEND tests2
     neg_fctime
 )
 if( HAVE_FORTRAN AND ENABLE_EXTRA_TESTS )
-    list(APPEND tests2 bufr_dump_encode_fortran)
-    list(APPEND tests2 bufr_dump_decode_fortran)
+    list(APPEND tests_data_reqd bufr_dump_encode_fortran)
+    list(APPEND tests_data_reqd bufr_dump_decode_fortran)
 endif()
 if( ENABLE_EXTRA_TESTS )
-    list(APPEND tests2 bufr_dump_encode_C)
-    list(APPEND tests2 bufr_dump_decode_C)
+    list(APPEND tests_data_reqd bufr_dump_encode_C)
+    list(APPEND tests_data_reqd bufr_dump_decode_C)
 endif()
 
 # These tests do not require any data downloads
-foreach( test ${tests1} )
+foreach( test ${tests_no_data_reqd} )
     ecbuild_add_test( TARGET eccodes_t_${test}
                       TYPE SCRIPT
                       COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/${test}.sh
@@ -136,7 +147,7 @@ ecbuild_add_test( TARGET eccodes_t_check_gaussian_grids
 # Note: making the test dependent on the grib files (with DEPENDS)
 #       means they will be downloaded at "make" time
 #       rather than when you do "ctest". Use TEST_DEPENDS instead
-foreach( test ${tests2} )
+foreach( test ${tests_data_reqd} )
     ecbuild_add_test( TARGET eccodes_t_${test}
                   TYPE SCRIPT
                   COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/${test}.sh
@@ -210,4 +221,10 @@ ecbuild_add_test( TARGET eccodes_t_grib_check_param_concepts
                   CONDITION ENABLE_EXTRA_TESTS
                   COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/grib_check_param_concepts.sh
 )
-
+# Performance test. Must have -DENABLE_GRIB_TIMER=ON
+ecbuild_add_test( TARGET eccodes_t_ecc-386
+                  TYPE SCRIPT
+                  CONDITION ENABLE_EXTRA_TESTS AND ENABLE_GRIB_TIMER
+                  COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/ecc-386.sh
+                  TEST_DEPENDS eccodes_download_gribs
+)
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 96642e4..fa35167 100755
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -13,6 +13,8 @@ TESTS = definitions.sh \
         bufr_set.sh \
         bufr_change_edition.sh \
         gts_ls.sh \
+        gts_compare.sh \
+        gts_get.sh \
         metar_ls.sh \
         metar_dump.sh \
         ieee.sh \
@@ -21,7 +23,7 @@ TESTS = definitions.sh \
         grib2to1.sh \
         badgrib.sh \
         ls.sh \
-        filter.sh  \
+        grib_filter.sh  \
         multi.sh \
         budg.sh \
         gridType.sh \
diff --git a/tests/badgrib.sh b/tests/badgrib.sh
index da677f3..2403dd2 100755
--- a/tests/badgrib.sh
+++ b/tests/badgrib.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/bitmap.sh b/tests/bitmap.sh
index 215eaea..4ac9004 100755
--- a/tests/bitmap.sh
+++ b/tests/bitmap.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -8,7 +8,6 @@
 # virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
 #
 
-
 . ./include.sh
 
 REDIRECT=/dev/null
@@ -19,7 +18,7 @@ infile=${data_dir}/reduced_gaussian_model_level.grib1
 outfile=${data_dir}/with_bitmap.grib1
 outfile1=${data_dir}/without_bitmap.grib1
 
-rm -f $outfile || true
+rm -f $outfile
 
 ${tools_dir}grib_set -s bitmapPresent=1 $infile $outfile >$REDIRECT
 
@@ -49,15 +48,14 @@ set values={1,2,3,4,5,6,7,1111,1111,8,9,10};
 write ;
 EOF
 
-${tools_dir}grib_filter -o out.grib1 bitmap.rules $grib1 
-${tools_dir}grib_filter -o out.grib2 bitmap.rules $grib2
+${tools_dir}grib_filter -o out.bmp.grib1 bitmap.rules $grib1 
+${tools_dir}grib_filter -o out.bmp.grib2 bitmap.rules $grib2
 #exit 0
 
-${tools_dir}grib_get_data -m missing out.grib1 > out.grib1.data
-${tools_dir}grib_get_data -m missing out.grib2 > out.grib2.data
-
-diff out.grib1.data out.grib2.data
+${tools_dir}grib_get_data -m missing out.bmp.grib1 > out.bmp.grib1.data
+${tools_dir}grib_get_data -m missing out.bmp.grib2 > out.bmp.grib2.data
 
-rm -f  out.grib1.data out.grib2.data out.grib1 out.grib2 bitmap.rules
+diff out.bmp.grib1.data out.bmp.grib2.data
 
+rm -f  out.bmp.grib1.data out.bmp.grib2.data out.bmp.grib1 out.bmp.grib2 bitmap.rules
 
diff --git a/tests/bits.c b/tests/bits.c
index ddf1d28..d6db8e0 100755
--- a/tests/bits.c
+++ b/tests/bits.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/bitsPerValue.sh b/tests/bitsPerValue.sh
index 6c0d98d..5d10b3d 100755
--- a/tests/bitsPerValue.sh
+++ b/tests/bitsPerValue.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/bpv_limit.c b/tests/bpv_limit.c
index 0530a66..78b7bec 100644
--- a/tests/bpv_limit.c
+++ b/tests/bpv_limit.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/bpv_limit.sh b/tests/bpv_limit.sh
index d540247..41edf5d 100755
--- a/tests/bpv_limit.sh
+++ b/tests/bpv_limit.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/budg.sh b/tests/budg.sh
index 5d920fa..e6333e0 100755
--- a/tests/budg.sh
+++ b/tests/budg.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/bufr_change_edition.sh b/tests/bufr_change_edition.sh
index 076836d..b4d1d12 100755
--- a/tests/bufr_change_edition.sh
+++ b/tests/bufr_change_edition.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/bufr_compare.sh b/tests/bufr_compare.sh
index 4e6e643..4728e57 100755
--- a/tests/bufr_compare.sh
+++ b/tests/bufr_compare.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -53,7 +53,7 @@ fi
 set -e
 
 #----------------------------------------------------
-# Test: comparing with and witout the -b switch
+# Test: comparing with and without the -b switch
 #----------------------------------------------------
 f="syno_1.bufr"
 echo "Test: comparing with and witout the -b switch" >> $fLog
diff --git a/tests/bufr_copy.sh b/tests/bufr_copy.sh
index 7efad26..81c3c7a 100755
--- a/tests/bufr_copy.sh
+++ b/tests/bufr_copy.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/bufr_count.sh b/tests/bufr_count.sh
index 380a5b3..e132845 100755
--- a/tests/bufr_count.sh
+++ b/tests/bufr_count.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/bufr_dump.sh b/tests/bufr_dump.sh
index 18d9e3a..c82f991 100755
--- a/tests/bufr_dump.sh
+++ b/tests/bufr_dump.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/bufr_dump_decode_C.sh b/tests/bufr_dump_decode_C.sh
index 3556289..9257a95 100755
--- a/tests/bufr_dump_decode_C.sh
+++ b/tests/bufr_dump_decode_C.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -34,6 +34,8 @@ if command -v pkg-config >/dev/null 2>&1; then
     COMPILER=`pkg-config --variable=CC $PKGCONFIG_FILE`
     FLAGS_COMPILER=`pkg-config --cflags $PKGCONFIG_FILE`
     FLAGS_LINKER=`pkg-config --libs $PKGCONFIG_FILE`
+    #CMAKE_C_FLAGS=`grep CMAKE_C_FLAGS:STRING $CACHE_FILE | cut -d'=' -f2-`
+    #FLAGS_COMPILER="$FLAGS_COMPILER $CMAKE_C_FLAGS"
 
     # The pkgconfig variables refer to the install directory. Change to build dir
     BUILD_DIR=`grep -w eccodes_BINARY_DIR $CACHE_FILE | cut -d'=' -f2`
diff --git a/tests/bufr_dump_decode_filter.sh b/tests/bufr_dump_decode_filter.sh
index 94bf9e6..b4fbbcf 100755
--- a/tests/bufr_dump_decode_filter.sh
+++ b/tests/bufr_dump_decode_filter.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/bufr_dump_decode_fortran.sh b/tests/bufr_dump_decode_fortran.sh
index a57bec5..fe85372 100755
--- a/tests/bufr_dump_decode_fortran.sh
+++ b/tests/bufr_dump_decode_fortran.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/bufr_dump_decode_python.sh b/tests/bufr_dump_decode_python.sh
index 9276cea..24430b2 100755
--- a/tests/bufr_dump_decode_python.sh
+++ b/tests/bufr_dump_decode_python.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/bufr_dump_encode_C.sh b/tests/bufr_dump_encode_C.sh
index 8a30cdc..66e9504 100755
--- a/tests/bufr_dump_encode_C.sh
+++ b/tests/bufr_dump_encode_C.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -35,6 +35,8 @@ if command -v pkg-config >/dev/null 2>&1; then
     COMPILER=`pkg-config --variable=CC $PKGCONFIG_FILE`
     FLAGS_COMPILER=`pkg-config --cflags $PKGCONFIG_FILE`
     FLAGS_LINKER=`pkg-config --libs $PKGCONFIG_FILE`
+    #CMAKE_C_FLAGS=`grep CMAKE_C_FLAGS:STRING $CACHE_FILE | cut -d'=' -f2-`
+    #FLAGS_COMPILER="$FLAGS_COMPILER $CMAKE_C_FLAGS"
 
     # The pkgconfig variables refer to the install directory. Change to build dir
     BUILD_DIR=`grep -w eccodes_BINARY_DIR $CACHE_FILE | cut -d'=' -f2`
diff --git a/tests/bufr_dump_encode_filter.sh b/tests/bufr_dump_encode_filter.sh
index 90add79..f4e7294 100755
--- a/tests/bufr_dump_encode_filter.sh
+++ b/tests/bufr_dump_encode_filter.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/bufr_dump_encode_fortran.sh b/tests/bufr_dump_encode_fortran.sh
index 0d8e64c..8fab667 100755
--- a/tests/bufr_dump_encode_fortran.sh
+++ b/tests/bufr_dump_encode_fortran.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/bufr_dump_encode_python.sh b/tests/bufr_dump_encode_python.sh
index a6eddab..ab139f5 100755
--- a/tests/bufr_dump_encode_python.sh
+++ b/tests/bufr_dump_encode_python.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/bufr_filter.sh b/tests/bufr_filter.sh
index 8d59984..322f705 100755
--- a/tests/bufr_filter.sh
+++ b/tests/bufr_filter.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -139,7 +139,7 @@ echo "Test: attributes" >> $fLog
 echo "file: $f" >> $fLog
 ${tools_dir}codes_bufr_filter $fRules $f 2>> $fLog 1>> $fLog
 
-${tools_dir}codes_bufr_filter $fRules $f 2>> ${f}.log 1>> ${f}.log
+${tools_dir}codes_bufr_filter $fRules $f 2> ${f}.log 1> ${f}.log
 cat > ${f}.ref <<EOF
 pressure=100910 Pa
 pressure->code=010004
@@ -171,7 +171,7 @@ echo "Test: access element by rank" >> $fLog
 echo "file: $f" >> $fLog
 ${tools_dir}codes_bufr_filter $fRules $f 2>> $fLog 1>> $fLog
 
-${tools_dir}codes_bufr_filter $fRules $f 2>> ${f}.log 1>> ${f}.log
+${tools_dir}codes_bufr_filter $fRules $f 2> ${f}.log 1> ${f}.log
 cat > ${f}.ref <<EOF
 pressure=98500 Pa
 pressure=102000 101800 100000 98500 96400 92500 92100 89700 
@@ -205,7 +205,7 @@ echo "Test: access marker operators" >> $fLog
 echo "file: $f" >> $fLog
 ${tools_dir}codes_bufr_filter $fRules $f 2>> $fLog 1>> $fLog
 
-${tools_dir}codes_bufr_filter $fRules $f 2>> ${f}.log 1>> ${f}.log
+${tools_dir}codes_bufr_filter $fRules $f 2> ${f}.log 1> ${f}.log
 cat > ${f}.ref <<EOF
 brightnessTemperature={-1e+100,290.8,-1e+100,289.7,289.5,289.5,289.4,287.5,
 287.4,288.3,288.2,-1e+100,-1e+100,-1e+100,-1e+100,-1e+100,
@@ -279,7 +279,7 @@ echo "Test: access marker operators 2" >> $fLog
 echo "file: $f" >> $fLog
 ${tools_dir}codes_bufr_filter $fRules $f 2>> $fLog 1>> $fLog
 
-${tools_dir}codes_bufr_filter $fRules $f 2>> ${f}.log 1>> ${f}.log
+${tools_dir}codes_bufr_filter $fRules $f 2> ${f}.log 1> ${f}.log
 cat > ${f}.ref <<EOF
 pressure=102000 101800 100000 98500 96400 92500 92100 89700 
 88100 86100 85000 84400 79400 79000 78300 77300 
@@ -331,7 +331,7 @@ echo "file: $f" >> $fLog
 ${tools_dir}codes_bufr_filter $fRules $f 2>> $fLog 1>> $fLog
 
 rm -f ${f}.log
-${tools_dir}codes_bufr_filter $fRules $f 2>> ${f}.log 1>> ${f}.log
+${tools_dir}codes_bufr_filter $fRules $f 2> ${f}.log 1> ${f}.log
 
 REFERENCE_FILE="../../tests/asca_139.t1.ref"
 diff $REFERENCE_FILE ${f}.log
@@ -356,7 +356,7 @@ echo "Test: access by condition 2" >> $fLog
 echo "file: $f" >> $fLog
 ${tools_dir}codes_bufr_filter $fRules $f 2>> $fLog 1>> $fLog
 
-${tools_dir}codes_bufr_filter $fRules $f 2>> ${f}.log 1>> ${f}.log
+${tools_dir}codes_bufr_filter $fRules $f 2> ${f}.log 1> ${f}.log
 cat > ${f}.ref <<EOF
 ----- /verticalSoundingSignificance=4/airTemperature -----
 272.1 269.5 268.1 267.9 266.7 266.1 264.9 264.9 
@@ -472,7 +472,7 @@ echo "Test: get string" >> $fLog
 echo "file: $f" >> $fLog
 ${tools_dir}codes_bufr_filter $fRules $f 2>> $fLog 1>> $fLog
 
-${tools_dir}codes_bufr_filter $fRules $f 2>> ${f}.log 1>> ${f}.log
+${tools_dir}codes_bufr_filter $fRules $f 2> ${f}.log 1> ${f}.log
 cat > ${f}.ref <<EOF
 WYM9567
 EOF
@@ -496,7 +496,7 @@ echo "Test: get string array and stringValues" >> $fLog
 echo "file: $f" >> $fLog
 ${tools_dir}codes_bufr_filter $fRules $f 2>> $fLog 1>> $fLog
 
-${tools_dir}codes_bufr_filter $fRules $f 2>> ${f}.log 1>> ${f}.log
+${tools_dir}codes_bufr_filter $fRules $f 2> ${f}.log 1> ${f}.log
 cat > ${f}.ref <<EOF
 TROMSO-HOLT          
 PASVIK               
@@ -765,7 +765,7 @@ echo "Test: access subsets by condition" >> $fLog
 echo "file: $f" >> $fLog
 ${tools_dir}codes_bufr_filter $fRules $f 2>> $fLog 1>> $fLog
 
-${tools_dir}codes_bufr_filter $fRules $f 2>> ${f}.log 1>> ${f}.log
+${tools_dir}codes_bufr_filter $fRules $f 2> ${f}.log 1> ${f}.log
 cat > ${f}.ref <<EOF
 stationId=01371
 latitude=61.122
@@ -795,7 +795,7 @@ echo "Test: access subsets and attribute by condition" >> $fLog
 echo "file: $f" >> $fLog
 ${tools_dir}codes_bufr_filter $fRules $f 2>> $fLog 1>> $fLog
 
-${tools_dir}codes_bufr_filter $fRules $f 2>> ${f}.log 1>> ${f}.log
+${tools_dir}codes_bufr_filter $fRules $f 2> ${f}.log 1> ${f}.log
 cat > ${f}.ref <<EOF
 /subsetNumber=1/airTemperature->percentConfidence=70 %
 EOF
@@ -818,7 +818,7 @@ echo "Test: set key by rank" >> $fLog
 echo "file: $f" >> $fLog
 ${tools_dir}codes_bufr_filter $fRules $f 2>> $fLog 1>> $fLog
 
-${tools_dir}codes_bufr_filter $fRules $f 2>> ${f}.log 1>> ${f}.log
+${tools_dir}codes_bufr_filter $fRules $f 2> ${f}.log 1> ${f}.log
 cat > ${f}.ref <<EOF
 #4#airTemperature=300.1
 EOF
@@ -1402,6 +1402,7 @@ set simpleThinningSkip=36;
 set doSimpleThinning=1;
 set pack=1;
 write;
+assert(numberOfSubsets == 5);
 EOF
 
 f="imssnow.bufr"
@@ -1472,3 +1473,37 @@ EOF
 diff ${f}.log.ref ${f}.log 
 
 rm -f ${f}.log ${f}.log.ref ${f}.out ${f}.out.out $fLog $fRules
+#-----------------------------------------------------------
+# Test: fix for ECC-389 
+#-----------------------------------------------------------
+cat > $fRules <<EOF
+set numberOfSubsets=2;
+set unexpandedDescriptors={310008};
+
+set #14#brightnessTemperature={266.53,266.53000000001};
+set pack=1;
+
+write;
+EOF
+
+f="amsu_55.bufr"
+
+echo "Test: fix for ECC-389" >> $fLog
+echo "file: $f" >> $fLog
+
+${tools_dir}bufr_filter -o ${f}.out $fRules $f
+
+cat > $fRules <<EOF
+set unpack=1;
+print "[#14#brightnessTemperature]";
+EOF
+
+${tools_dir}bufr_filter $fRules ${f}.out > ${f}.log
+
+cat > ${f}.log.ref <<EOF
+266.53
+EOF
+
+diff ${f}.log.ref ${f}.log 
+
+rm -f ${f}.log ${f}.log.ref ${f}.out $fLog $fRules
diff --git a/tests/bufr_filter_extract_area.sh b/tests/bufr_filter_extract_area.sh
index 9610d7a..21082fb 100755
--- a/tests/bufr_filter_extract_area.sh
+++ b/tests/bufr_filter_extract_area.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -31,7 +31,7 @@ fRules=${label}.filter
 # Test: Area extraction
 #-----------------------------------------------------------
 cat > $fRules <<EOF
- transient originalNumberOfSubsets=numberOfSubsets;
+ transient originalNumberOfSubsets = numberOfSubsets;
  set extractAreaNorthLatitude=52.5;
  set extractAreaSouthLatitude=51.1;
  set extractAreaWestLongitude=155.2;
@@ -40,6 +40,7 @@ cat > $fRules <<EOF
  set doExtractArea=1;
  write;
  print "extracted [numberOfSubsets] of [originalNumberOfSubsets] subsets";
+ assert(numberOfSubsets == extractedAreaNumberOfSubsets);
 EOF
 
 inputBufr="amsa_55.bufr"
diff --git a/tests/bufr_filter_extract_datetime.sh b/tests/bufr_filter_extract_datetime.sh
index 7f5cc9e..0c2681f 100755
--- a/tests/bufr_filter_extract_datetime.sh
+++ b/tests/bufr_filter_extract_datetime.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -31,7 +31,7 @@ fRules=${label}.filter
 # Test: Datetime extraction
 #-----------------------------------------------------------
 cat > $fRules <<EOF
- transient originalNumberOfSubsets=numberOfSubsets;
+ transient originalNumberOfSubsets = numberOfSubsets;
 
  transient extractDateTimeYearStart=2012;
  transient extractDateTimeMonthStart=10;
@@ -52,6 +52,7 @@ cat > $fRules <<EOF
    write;
  }
  print "extracted [extractedDateTimeNumberOfSubsets] of [originalNumberOfSubsets] subsets";
+ assert(numberOfSubsets == extractedDateTimeNumberOfSubsets);
 EOF
 
 inputBufr="amsa_55.bufr"
diff --git a/tests/bufr_get.sh b/tests/bufr_get.sh
index 51e349b..7ff57cc 100755
--- a/tests/bufr_get.sh
+++ b/tests/bufr_get.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/bufr_json.sh b/tests/bufr_json.sh
index 824d4a9..d0d7726 100755
--- a/tests/bufr_json.sh
+++ b/tests/bufr_json.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -45,3 +45,5 @@ for c in 1 3 1/3; do
   fi
 done
 
+# ECC-272
+${tools_dir}bufr_dump -jf aaen_55.bufr | grep -q -w channelRadiance
diff --git a/tests/bufr_keys_iter.c b/tests/bufr_keys_iter.c
new file mode 100644
index 0000000..eba4c70
--- /dev/null
+++ b/tests/bufr_keys_iter.c
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2005-2017 ECMWF.
+ *
+ * This software is licensed under the terms of the Apache Licence Version 2.0
+ * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+ *
+ * In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
+ * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
+ */
+#include "grib_api_internal.h"
+#include "eccodes.h"
+#include <assert.h>
+
+void usage(const char* prog)
+{
+    printf("usage: %s infile\n",prog);
+    exit(1);
+}
+
+int main(int argc,char* argv[])
+{
+    int err = 0;
+    codes_handle* h = NULL;
+    grib_keys_iterator* kiter = NULL;
+    char* input_filename = NULL;
+    FILE* f = NULL;
+    grib_context* c = grib_context_get_default();
+    
+    if (argc!=2) usage(argv[0]);
+    input_filename = argv[1];
+    f = fopen(input_filename, "r");
+    assert(f);
+    h = codes_handle_new_from_file(NULL, f, PRODUCT_BUFR, &err);
+    assert(h);
+
+    CODES_CHECK(codes_set_long(h,"unpack",1), 0);
+
+    /*kiter=codes_bufr_data_section_keys_iterator_new(h);*/
+    kiter = codes_bufr_keys_iterator_new(h);
+    while(codes_bufr_keys_iterator_next(kiter))
+    {
+        char* kname = codes_bufr_keys_iterator_get_name(kiter);
+        printf("%s\n", kname);
+        grib_context_free(c, kname);
+    }
+    grib_keys_iterator_delete(kiter);
+    codes_handle_delete(h);
+    return 0;
+}
diff --git a/tests/bufr_keys_iter.sh b/tests/bufr_keys_iter.sh
new file mode 100755
index 0000000..e5ab6a8
--- /dev/null
+++ b/tests/bufr_keys_iter.sh
@@ -0,0 +1,227 @@
+#!/bin/sh
+# Copyright 2005-2017 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# 
+# In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
+# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
+#
+
+. ./include.sh
+
+tempOut=temp.bufr_keys_iter.$$.out
+tempRef=temp.bufr_keys_iter.$$.ref
+
+input=${data_dir}/bufr/aaen_55.bufr
+${test_dir}/bufr_keys_iter $input > $tempOut
+
+# Check the output of BUFR keys iterator
+# Note: the two hidden keys 'typicalDate' and 'typicalTime' are NOT in the iterator output
+cat > $tempRef<<EOF
+edition
+masterTableNumber
+bufrHeaderCentre
+bufrHeaderSubCentre
+updateSequenceNumber
+dataCategory
+internationalDataSubCategory
+dataSubCategory
+masterTablesVersionNumber
+localTablesVersionNumber
+typicalYear
+typicalMonth
+typicalDay
+typicalHour
+typicalMinute
+typicalSecond
+rdbType
+rdbSubtype
+rdbtimeDay
+rdbtimeHour
+rdbtimeMinute
+rdbtimeSecond
+rectimeDay
+rectimeHour
+rectimeMinute
+rectimeSecond
+correction1
+correction1Part
+correction2
+correction2Part
+correction3
+correction3Part
+correction4
+correction4Part
+qualityControl
+numberOfSubsets
+localLongitude1
+localLatitude1
+localLongitude2
+localLatitude2
+localNumberOfObservations
+satelliteID
+observedData
+compressedData
+unexpandedDescriptors
+#1#tovsOrAtovsProductQualifier
+#1#centre
+#1#subCentre
+#2#tovsOrAtovsProductQualifier
+#2#centre
+#2#subCentre
+#1#satelliteIdentifier
+#1#satelliteSensorIndicator
+#1#orbitNumber
+#1#satelliteAntennaCorrectionsVersionNumber
+#1#scanLineNumber
+#1#fieldOfViewNumber
+#1#majorFrameCount
+#1#scanLineStatusFlagsForAtovs
+#1#scanLineQualityFlagsForAtovs
+#1#year
+#1#month
+#1#day
+#1#hour
+#1#minute
+#1#second
+#1#latitude
+#1#longitude
+#1#heightOfStation
+#1#satelliteZenithAngle
+#1#bearingOrAzimuth
+#1#solarZenithAngle
+#1#solarAzimuth
+#1#fieldOfViewQualityFlagsForAtovs
+#1#radiometerIdentifier
+#1#instrumentTemperature
+#2#radiometerIdentifier
+#2#instrumentTemperature
+#3#radiometerIdentifier
+#3#instrumentTemperature
+#4#radiometerIdentifier
+#4#instrumentTemperature
+#1#tovsOrAtovsOrAvhrrInstrumentationChannelNumber
+#1#log10OfTemperatureRadianceCentralWaveNumberForAtovs
+#1#bandwidthCorrectionCoefficient1ForAtovs
+#1#bandwidthCorrectionCoefficient2ForAtovs
+#1#channelQualityFlagsForAtovs
+#1#brightnessTemperature
+#2#tovsOrAtovsOrAvhrrInstrumentationChannelNumber
+#2#log10OfTemperatureRadianceCentralWaveNumberForAtovs
+#2#bandwidthCorrectionCoefficient1ForAtovs
+#2#bandwidthCorrectionCoefficient2ForAtovs
+#2#channelQualityFlagsForAtovs
+#2#brightnessTemperature
+#3#tovsOrAtovsOrAvhrrInstrumentationChannelNumber
+#3#log10OfTemperatureRadianceCentralWaveNumberForAtovs
+#3#bandwidthCorrectionCoefficient1ForAtovs
+#3#bandwidthCorrectionCoefficient2ForAtovs
+#3#channelQualityFlagsForAtovs
+#3#brightnessTemperature
+#4#tovsOrAtovsOrAvhrrInstrumentationChannelNumber
+#4#log10OfTemperatureRadianceCentralWaveNumberForAtovs
+#4#bandwidthCorrectionCoefficient1ForAtovs
+#4#bandwidthCorrectionCoefficient2ForAtovs
+#4#channelQualityFlagsForAtovs
+#4#brightnessTemperature
+#5#tovsOrAtovsOrAvhrrInstrumentationChannelNumber
+#5#log10OfTemperatureRadianceCentralWaveNumberForAtovs
+#5#bandwidthCorrectionCoefficient1ForAtovs
+#5#bandwidthCorrectionCoefficient2ForAtovs
+#5#channelQualityFlagsForAtovs
+#5#brightnessTemperature
+#6#tovsOrAtovsOrAvhrrInstrumentationChannelNumber
+#6#log10OfTemperatureRadianceCentralWaveNumberForAtovs
+#6#bandwidthCorrectionCoefficient1ForAtovs
+#6#bandwidthCorrectionCoefficient2ForAtovs
+#6#channelQualityFlagsForAtovs
+#6#brightnessTemperature
+#7#tovsOrAtovsOrAvhrrInstrumentationChannelNumber
+#7#log10OfTemperatureRadianceCentralWaveNumberForAtovs
+#7#bandwidthCorrectionCoefficient1ForAtovs
+#7#bandwidthCorrectionCoefficient2ForAtovs
+#7#channelQualityFlagsForAtovs
+#7#brightnessTemperature
+#8#tovsOrAtovsOrAvhrrInstrumentationChannelNumber
+#8#log10OfTemperatureRadianceCentralWaveNumberForAtovs
+#8#bandwidthCorrectionCoefficient1ForAtovs
+#8#bandwidthCorrectionCoefficient2ForAtovs
+#8#channelQualityFlagsForAtovs
+#8#brightnessTemperature
+#9#tovsOrAtovsOrAvhrrInstrumentationChannelNumber
+#9#log10OfTemperatureRadianceCentralWaveNumberForAtovs
+#9#bandwidthCorrectionCoefficient1ForAtovs
+#9#bandwidthCorrectionCoefficient2ForAtovs
+#9#channelQualityFlagsForAtovs
+#9#brightnessTemperature
+#10#tovsOrAtovsOrAvhrrInstrumentationChannelNumber
+#10#log10OfTemperatureRadianceCentralWaveNumberForAtovs
+#10#bandwidthCorrectionCoefficient1ForAtovs
+#10#bandwidthCorrectionCoefficient2ForAtovs
+#10#channelQualityFlagsForAtovs
+#10#brightnessTemperature
+#11#tovsOrAtovsOrAvhrrInstrumentationChannelNumber
+#11#log10OfTemperatureRadianceCentralWaveNumberForAtovs
+#11#bandwidthCorrectionCoefficient1ForAtovs
+#11#bandwidthCorrectionCoefficient2ForAtovs
+#11#channelQualityFlagsForAtovs
+#11#brightnessTemperature
+#12#tovsOrAtovsOrAvhrrInstrumentationChannelNumber
+#12#log10OfTemperatureRadianceCentralWaveNumberForAtovs
+#12#bandwidthCorrectionCoefficient1ForAtovs
+#12#bandwidthCorrectionCoefficient2ForAtovs
+#12#channelQualityFlagsForAtovs
+#12#brightnessTemperature
+#13#tovsOrAtovsOrAvhrrInstrumentationChannelNumber
+#13#log10OfTemperatureRadianceCentralWaveNumberForAtovs
+#13#bandwidthCorrectionCoefficient1ForAtovs
+#13#bandwidthCorrectionCoefficient2ForAtovs
+#13#channelQualityFlagsForAtovs
+#13#brightnessTemperature
+#14#tovsOrAtovsOrAvhrrInstrumentationChannelNumber
+#14#log10OfTemperatureRadianceCentralWaveNumberForAtovs
+#14#bandwidthCorrectionCoefficient1ForAtovs
+#14#bandwidthCorrectionCoefficient2ForAtovs
+#14#channelQualityFlagsForAtovs
+#14#brightnessTemperature
+#15#tovsOrAtovsOrAvhrrInstrumentationChannelNumber
+#15#log10OfTemperatureRadianceCentralWaveNumberForAtovs
+#15#bandwidthCorrectionCoefficient1ForAtovs
+#15#bandwidthCorrectionCoefficient2ForAtovs
+#15#channelQualityFlagsForAtovs
+#15#brightnessTemperature
+#16#tovsOrAtovsOrAvhrrInstrumentationChannelNumber
+#16#log10OfTemperatureRadianceCentralWaveNumberForAtovs
+#16#bandwidthCorrectionCoefficient1ForAtovs
+#16#bandwidthCorrectionCoefficient2ForAtovs
+#16#channelQualityFlagsForAtovs
+#16#brightnessTemperature
+#17#tovsOrAtovsOrAvhrrInstrumentationChannelNumber
+#17#log10OfTemperatureRadianceCentralWaveNumberForAtovs
+#17#bandwidthCorrectionCoefficient1ForAtovs
+#17#bandwidthCorrectionCoefficient2ForAtovs
+#17#channelQualityFlagsForAtovs
+#17#brightnessTemperature
+#18#tovsOrAtovsOrAvhrrInstrumentationChannelNumber
+#18#log10OfTemperatureRadianceCentralWaveNumberForAtovs
+#18#bandwidthCorrectionCoefficient1ForAtovs
+#18#bandwidthCorrectionCoefficient2ForAtovs
+#18#channelQualityFlagsForAtovs
+#18#brightnessTemperature
+#19#tovsOrAtovsOrAvhrrInstrumentationChannelNumber
+#19#log10OfTemperatureRadianceCentralWaveNumberForAtovs
+#19#bandwidthCorrectionCoefficient1ForAtovs
+#19#bandwidthCorrectionCoefficient2ForAtovs
+#19#channelQualityFlagsForAtovs
+#19#brightnessTemperature
+#20#tovsOrAtovsOrAvhrrInstrumentationChannelNumber
+#1#albedoRadianceSolarFilteredIrradianceForAtovs
+#1#albedoRadianceEquivalentFilterWidthForAtovs
+#20#channelQualityFlagsForAtovs
+#1#channelRadiance
+EOF
+
+diff $tempRef $tempOut
+
+rm -f $tempRef $tempOut
diff --git a/tests/bufr_ls.sh b/tests/bufr_ls.sh
index 60d4fa4..4fd4793 100755
--- a/tests/bufr_ls.sh
+++ b/tests/bufr_ls.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/bufr_set.sh b/tests/bufr_set.sh
index d776819..6623015 100755
--- a/tests/bufr_set.sh
+++ b/tests/bufr_set.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/bufrdc_desc_ref.sh b/tests/bufrdc_desc_ref.sh
index 8b909a4..76195b7 100755
--- a/tests/bufrdc_desc_ref.sh
+++ b/tests/bufrdc_desc_ref.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/bufrdc_ref.sh b/tests/bufrdc_ref.sh
index c635bde..384ead6 100755
--- a/tests/bufrdc_ref.sh
+++ b/tests/bufrdc_ref.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/calendar.sh b/tests/calendar.sh
index 29af98c..646192a 100755
--- a/tests/calendar.sh
+++ b/tests/calendar.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/ccsds.sh b/tests/ccsds.sh
index 25987e0..7b3794f 100755
--- a/tests/ccsds.sh
+++ b/tests/ccsds.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -31,7 +31,6 @@ if [ $skip_test -eq 1 ]; then
 fi
 echo "AEC feature was enabled."
 
-BLACKLIST="totalLength,section5Length,section7Length,dataRepresentationTemplateNumber,typeOfPacking"
 BLACKLIST="totalLength,section5Length,section7Length,dataRepresentationTemplateNumber"
 
 infile=${data_dir}/ccsds.grib2
@@ -72,6 +71,7 @@ res3=`${tools_dir}grib_get '-F%1.2f' -p min,max,avg $outfile2`
 
 rm -f $outfile1 $outfile2 || true
 
+# ECC-297
 infile=${data_dir}/tigge_ecmwf.grib2
 outfile1=$infile.tmp_ccsds.1
 outfile2=$infile.tmp_ccsds.2
diff --git a/tests/ccsds_perf.c b/tests/ccsds_perf.c
index 8c9f847..34cdbfd 100644
--- a/tests/ccsds_perf.c
+++ b/tests/ccsds_perf.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/change_scanning.sh b/tests/change_scanning.sh
index b3bdeaf..b9271fc 100755
--- a/tests/change_scanning.sh
+++ b/tests/change_scanning.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/check_gaussian_grids.sh b/tests/check_gaussian_grids.sh
index cdde04a..f278687 100755
--- a/tests/check_gaussian_grids.sh
+++ b/tests/check_gaussian_grids.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/concept.sh b/tests/concept.sh
index 470a893..b38c42a 100755
--- a/tests/concept.sh
+++ b/tests/concept.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/decimalPrecision.sh b/tests/decimalPrecision.sh
index a46dc89..a0f217d 100755
--- a/tests/decimalPrecision.sh
+++ b/tests/decimalPrecision.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/decode.c b/tests/decode.c
index 584c8d4..58d9a86 100755
--- a/tests/decode.c
+++ b/tests/decode.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/definitions.sh b/tests/definitions.sh
index ee0c802..4778563 100755
--- a/tests/definitions.sh
+++ b/tests/definitions.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/ecc-197.sh b/tests/ecc-197.sh
index 1e5086b..6197bc6 100755
--- a/tests/ecc-197.sh
+++ b/tests/ecc-197.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/ecc-286.sh b/tests/ecc-286.sh
index 391d899..4a811ab 100755
--- a/tests/ecc-286.sh
+++ b/tests/ecc-286.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/ecc-288.sh b/tests/ecc-288.sh
index 226273d..701206c 100755
--- a/tests/ecc-288.sh
+++ b/tests/ecc-288.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/ecc-379.sh b/tests/ecc-379.sh
new file mode 100755
index 0000000..72bac35
--- /dev/null
+++ b/tests/ecc-379.sh
@@ -0,0 +1,75 @@
+#!/bin/sh
+# Copyright 2005-2017 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# 
+# In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
+# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
+#
+
+. ./include.sh
+
+# ---------------------------------------------------------
+# This is the test for the JIRA issue ECC-379
+# BUFR encoding failing when value out of range
+# ---------------------------------------------------------
+cd ${data_dir}/bufr
+label="ecc_379_test"
+
+tempRules=temp.${label}.filter
+tempOut=temp.${label}.bufr
+tempText=temp.${label}.text
+tempRef=temp.${label}.ref
+
+# Test 1 --------------------------------------------------------
+BufrFile=airs_57.bufr
+cat > $tempRules <<EOF
+ set unpack=1;
+ # Two of the longitude values are out-of-range (1st and 3rd)
+ set longitude={500, -172, -400, -170, -169, -168, -168, -167, -167, -166, -166, -165, -164, -164, -164};
+ set pack=1;
+ write;
+EOF
+
+# Expect this to fail as two values are out-of-range
+set +e
+${tools_dir}bufr_filter -o $tempOut $tempRules $BufrFile 2>/dev/null
+status=$?
+set -e
+[ $status -ne 0 ]
+# Now set environment variable to turn out-of-range values into 'missing'
+export ECCODES_BUFR_SET_TO_MISSING_IF_OUT_OF_RANGE=1
+${tools_dir}bufr_filter -o $tempOut $tempRules $BufrFile
+unset ECCODES_BUFR_SET_TO_MISSING_IF_OUT_OF_RANGE
+
+#echo 'set unpack=1;print "[longitude]";' | ${tools_dir}bufr_filter - $BufrFile
+#echo 'set unpack=1;print "[longitude]";' | ${tools_dir}bufr_filter - $tempOut > $tempText
+#cat > $tempRef << EOF
+#-1e+100 -172.14317 -1e+100 -170.17433 -169.407 -168.9308 -168.49104 -167.98389 
+#-166.95331 -166.52921 -166.06108 -165.66135 -164.99666 -164.67058 -164.23764
+#EOF
+#diff $tempText $tempRef
+
+# Test 2 --------------------------------------------------------
+BufrFile=airc_144.bufr
+cat > $tempRules <<EOF
+ set unpack=1;
+ set latitude=9999;
+ set pack=1;
+ write;
+EOF
+
+# The latitude is out of range. So we expect this to fail
+set +e
+${tools_dir}bufr_filter -o $tempOut $tempRules $BufrFile 2>/dev/null
+status=$?
+set -e
+[ $status -ne 0 ]
+
+export ECCODES_BUFR_SET_TO_MISSING_IF_OUT_OF_RANGE=1
+${tools_dir}bufr_filter -o $tempOut $tempRules $BufrFile
+unset ECCODES_BUFR_SET_TO_MISSING_IF_OUT_OF_RANGE
+
+# ------------------------
+rm -rf $tempOut $tempRules $tempText
diff --git a/tests/ecc-386.c b/tests/ecc-386.c
new file mode 100644
index 0000000..efd6ce7
--- /dev/null
+++ b/tests/ecc-386.c
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2005-2017 ECMWF.
+ *
+ * This software is licensed under the terms of the Apache Licence Version 2.0
+ * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+ *
+ * In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
+ * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
+ */
+
+/*
+ * Description: Reads a GRIB message from file, measures read time.
+ *
+ */
+#include <stdio.h>
+#include <assert.h>
+#include "grib_api_internal.h"
+
+void usage(char* prog) {
+    printf("usage: %s filename\n",prog);
+    exit(1);
+}
+
+#ifdef GRIB_TIMER
+int main(int argc, char** argv)
+{
+    grib_timer *tes = grib_get_timer(0,"decoding", 0, 0);
+    FILE *in = NULL;
+    int err = 0, i = 0;
+    grib_handle *h = NULL;
+    size_t values_len = 0;
+    double *values = NULL;
+    double duration_actual = 0;
+    const double duration_max = 3; /* seconds */
+    const int num_repetitions = 1000;
+
+    if (argc<2) usage(argv[0]);
+
+    in = fopen(argv[1],"r");
+    if(!in) {
+        printf("ERROR: unable to open file %s\n",argv[1]);
+        return 1;
+    }
+
+    /* create new handle from a message in a file*/
+    err = 0;
+    h = grib_handle_new_from_file(0,in,&err);
+    if (h == NULL) {
+        printf("Error: unable to create handle from file.\n");
+        return 1;
+    }
+
+    /* get the size of the values array*/
+    GRIB_CHECK(grib_get_size(h,"values",&values_len),0);
+
+    values = malloc(values_len*sizeof(double));
+
+    /* get data values*/
+    grib_timer_start(tes);
+    for (i=0; i<num_repetitions; i++) {
+        GRIB_CHECK(grib_get_double_array(h,"values",values,&values_len),0);
+    }
+    grib_timer_stop(tes,0);
+    duration_actual = grib_timer_value(tes);
+    if (duration_actual > duration_max) {
+        fprintf(stderr, "Decoding took longer than expected! actual time=%g, expected to take less than %g seconds",
+                duration_actual, duration_max);
+        return 1;
+    }
+    printf("Test passed. Actual decode time=%g\n", duration_actual);
+    free(values);
+    grib_handle_delete(h);
+    fclose(in);
+    return 0;
+}
+#else
+int main(int argc, char** argv) { return 0; }
+#endif
diff --git a/tests/ecc-386.sh b/tests/ecc-386.sh
new file mode 100755
index 0000000..49ff24e
--- /dev/null
+++ b/tests/ecc-386.sh
@@ -0,0 +1,14 @@
+#!/bin/sh
+# Copyright 2005-2017 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# 
+# In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
+# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
+#
+
+. ./include.sh
+
+input=${data_dir}/test_file.grib2
+exec ${test_dir}/ecc-386 $input
diff --git a/tests/ecc-393.sh b/tests/ecc-393.sh
new file mode 100755
index 0000000..9e423b5
--- /dev/null
+++ b/tests/ecc-393.sh
@@ -0,0 +1,62 @@
+#!/bin/sh
+# Copyright 2005-2017 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# 
+# In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
+# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
+#
+
+. ./include.sh
+
+# ---------------------------------------------------------
+# This is the test for the JIRA issue ECC-393
+# It tests bufr_compare with a blacklist with rank
+# ---------------------------------------------------------
+cd ${data_dir}/bufr
+label="ecc_393_test"
+
+tempRules=temp.${label}.filter
+tempOut=temp.${label}.bufr
+tempText=temp.${label}.txt
+tempRef=temp.${label}.ref
+BufrFile=aaen_55.bufr
+
+cat > $tempRules <<EOF
+ set unpack=1;
+ set #3#channelQualityFlagsForAtovs=1;
+ set #5#channelQualityFlagsForAtovs=2;
+ set pack=1;
+ write;
+EOF
+
+${tools_dir}bufr_filter -o $tempOut $tempRules $BufrFile
+
+# There are two differences. So this should fail
+set +e
+${tools_dir}bufr_compare $tempOut $BufrFile
+status=$?
+set -e
+[ $status -eq 1 ]
+
+# Blacklist all the channelQualityFlagsForAtovs keys
+${tools_dir}bufr_compare -b channelQualityFlagsForAtovs $tempOut $BufrFile
+
+# Blacklist both the channelQualityFlagsForAtovs keys individually
+${tools_dir}bufr_compare -b '#3#channelQualityFlagsForAtovs,#5#channelQualityFlagsForAtovs' $tempOut $BufrFile
+
+# Blacklist only one of the channelQualityFlagsForAtovs keys. Will fail
+set +e
+${tools_dir}bufr_compare -b '#5#channelQualityFlagsForAtovs' $tempOut $BufrFile >$tempText
+status=$?
+set -e
+[ $status -eq 1 ]
+
+cat > $tempRef <<EOF
+== 1 == DIFFERENCE == long [#3#channelQualityFlagsForAtovs]: [1] != [0]
+EOF
+diff $tempRef $tempText
+
+# Clean
+rm -rf $tempOut $tempRules $tempRef $tempText
diff --git a/tests/filter.sh b/tests/filter.sh
deleted file mode 100755
index 7d7deb3..0000000
--- a/tests/filter.sh
+++ /dev/null
@@ -1,125 +0,0 @@
-#!/bin/sh
-# Copyright 2005-2016 ECMWF.
-#
-# This software is licensed under the terms of the Apache Licence Version 2.0
-# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
-# 
-# In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
-# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
-#
-
-. ./include.sh
-
-REDIRECT=/dev/null
-
-if [ -f ${data_dir}/geavg.t12z.pgrbaf108 ]
-then
-	tmpdata=grib_api.$$.grib
-	rm -f $tmpdata || true
-	${tools_dir}grib_filter ${data_dir}/filter_rules ${data_dir}/geavg.t12z.pgrbaf108 > $REDIRECT
-	rm -f $tmpdata
-fi
-
-cat >${data_dir}/f.rules <<EOF
-write "${data_dir}/split/[centre]_[date]_[dataType]_[gridType]_[levelType]_[level]_[short_name]_[packingType].grib[editionNumber]";
-EOF
-
-[ -d ${data_dir}/split ] || mkdir -p ${data_dir}/split 
-
-${tools_dir}grib_filter ${data_dir}/f.rules ${data_dir}/tigge_pf_ecmwf.grib2 2> $REDIRECT > $REDIRECT
-
-rm -f ${data_dir}/split/*
-rmdir ${data_dir}/split
-rm -f ${data_dir}/f.rules
-
-# Test with nonexistent keys. Note spelling of centre!
-#######################################################
-cat >${data_dir}/nonexkey.rules <<EOF
-set center="john";
-EOF
-# Invoke without -f i.e. should fail if error encountered
-set +e
-${tools_dir}grib_filter ${data_dir}/nonexkey.rules ${data_dir}/tigge_pf_ecmwf.grib2 2> $REDIRECT > $REDIRECT
-if [ $? -eq 0 ]; then
-   echo "grib_filter should have failed if key not found" >&2
-   exit 1
-fi
-set -e
-# Now repeat with -f option (do not exit on error)
-${tools_dir}grib_filter -f ${data_dir}/nonexkey.rules ${data_dir}/tigge_pf_ecmwf.grib2 2> $REDIRECT > $REDIRECT
-
-rm -f ${data_dir}/nonexkey.rules
-
-# GRIB-308 format specifier for integer keys
-##############################################
-cat > ${data_dir}/formatint.rules <<EOF
-# Pad edition with leading zeroes and level with blanks
-print "edition=[edition%.3d], level=[level%5ld]";
-EOF
-
-result=`${tools_dir}/grib_filter  ${data_dir}/formatint.rules  $ECCODES_SAMPLES_PATH/GRIB1.tmpl`
-[ "$result" = "edition=001, level=  500" ]
-
-# Convert from grib1 to grib2 "Generalized vertical height coordinates"
-cat >temp.filt <<EOF
-set edition=2;
-set typeOfLevel="generalVertical";
-set nlev=41.0;
-write;
-EOF
-
-${tools_dir}/grib_filter -o temp_filt.grib2 temp.filt $ECCODES_SAMPLES_PATH/sh_ml_grib1.tmpl
-result=`${tools_dir}/grib_get -p typeOfFirstFixedSurface,NV,nlev temp_filt.grib2`
-[ "$result" = "150 6 41" ]
-
-# GRIB-394: grib_filter arithmetic operators not correct for floating point values
-###################################################################################
-cat > ${data_dir}/binop.rules <<EOF
-transient val_exact=209.53530883789062500000;
-if (referenceValue == val_exact) {
-   print "OK Equality test passed";
-}
-else {
-   print "***ERROR: float equality test";
-   assert(0);
-}
-transient val_lower=209;
-if (referenceValue > val_lower) {
-  print "OK [referenceValue] > [val_lower]";
-}
-else {
-  print "***ERROR: [referenceValue] <= [val_lower]";
-  assert(0);
-}
-transient val_higher=209.99;
-if (referenceValue < val_higher) {
-  print "OK [referenceValue] < [val_higher]";
-}
-else {
-  print "***ERROR: [referenceValue] >= [val_higher]";
-  assert(0);
-}
-EOF
-${tools_dir}/grib_filter  ${data_dir}/binop.rules $ECCODES_SAMPLES_PATH/gg_sfc_grib1.tmpl >/dev/null
-
-
-# GRIB-526 grib_filter very picky about format of floats
-########################################################
-cat >temp.filt <<EOF
-set values = {
-  -1000.0,
-  3.1e5,
-  66,
-  -77,
-  .4,
-  45. };
-EOF
-${tools_dir}/grib_filter temp.filt $ECCODES_SAMPLES_PATH/GRIB1.tmpl
-
-# Test reading from stdin
-echo 'set centre="kwbc";write;' | ${tools_dir}/grib_filter -o temp_filt.grib2 - $ECCODES_SAMPLES_PATH/GRIB2.tmpl
-result=`${tools_dir}/grib_get -p centre temp_filt.grib2`
-[ "$result" = "kwbc" ]
-
-rm -f temp_filt.grib2 temp.filt
-rm -f ${data_dir}/formatint.rules ${data_dir}/binop.rules
diff --git a/tests/fortran_interface.sh b/tests/fortran_interface.sh
index 22f5ded..bd20701 100755
--- a/tests/fortran_interface.sh
+++ b/tests/fortran_interface.sh
@@ -1,5 +1,5 @@
 #! /bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/gauss_sub.c b/tests/gauss_sub.c
index a5a3e79..55f0fbf 100644
--- a/tests/gauss_sub.c
+++ b/tests/gauss_sub.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/get_fail.sh b/tests/get_fail.sh
index e318541..629a670 100755
--- a/tests/get_fail.sh
+++ b/tests/get_fail.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/global.sh b/tests/global.sh
index bcc3066..88e283d 100755
--- a/tests/global.sh
+++ b/tests/global.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/grib1to2.sh b/tests/grib1to2.sh
index 10fbe62..23c0c49 100755
--- a/tests/grib1to2.sh
+++ b/tests/grib1to2.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/grib2to1.sh b/tests/grib2to1.sh
index 8b84f56..945d568 100755
--- a/tests/grib2to1.sh
+++ b/tests/grib2to1.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/grib_2nd_order_numValues.c b/tests/grib_2nd_order_numValues.c
index 8ed319b..22c5d17 100644
--- a/tests/grib_2nd_order_numValues.c
+++ b/tests/grib_2nd_order_numValues.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/grib_2nd_order_numValues.sh b/tests/grib_2nd_order_numValues.sh
index 52adad3..63f597e 100755
--- a/tests/grib_2nd_order_numValues.sh
+++ b/tests/grib_2nd_order_numValues.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2015 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/grib_check_param_concepts.sh b/tests/grib_check_param_concepts.sh
index 07491aa..1fbdf0b 100755
--- a/tests/grib_check_param_concepts.sh
+++ b/tests/grib_check_param_concepts.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -22,6 +22,20 @@ defs_dirs="
  $ECCODES_DEFINITION_PATH/grib2
  $ECCODES_DEFINITION_PATH/grib1/localConcepts/ecmf
  $ECCODES_DEFINITION_PATH/grib2/localConcepts/ecmf
+
+ $ECCODES_DEFINITION_PATH/grib1/localConcepts/ammc
+ $ECCODES_DEFINITION_PATH/grib1/localConcepts/eidb
+ $ECCODES_DEFINITION_PATH/grib1/localConcepts/ekmi
+ $ECCODES_DEFINITION_PATH/grib1/localConcepts/enmi
+ $ECCODES_DEFINITION_PATH/grib1/localConcepts/eswi
+ $ECCODES_DEFINITION_PATH/grib1/localConcepts/lfpw
+ $ECCODES_DEFINITION_PATH/grib1/localConcepts/lowm
+ $ECCODES_DEFINITION_PATH/grib1/localConcepts/rjtd
+
+ $ECCODES_DEFINITION_PATH/grib2/localConcepts/egrr
+ $ECCODES_DEFINITION_PATH/grib2/localConcepts/ekmi
+ $ECCODES_DEFINITION_PATH/grib2/localConcepts/eswi
+ $ECCODES_DEFINITION_PATH/grib2/localConcepts/lfpw
 "
 
 for dir in $defs_dirs; do
diff --git a/tests/grib_compare.sh b/tests/grib_compare.sh
index 7524569..c1ac5ff 100755
--- a/tests/grib_compare.sh
+++ b/tests/grib_compare.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -67,5 +67,16 @@ set -e
 [ $status -eq 1 ]
 
 
+# ECC-355: -R with "all" option
+# ----------------------------------------
+${tools_dir}grib_copy -w count=1 ${data_dir}/tigge_cf_ecmwf.grib2 $temp1
+${tools_dir}grib_copy -w count=1 ${data_dir}/tigge_pf_ecmwf.grib2 $temp2
+BLACKLIST="typeOfProcessedData,typeOfEnsembleForecast,perturbationNumber"
+# Specify relative tolerances for each floating point key
+${tools_dir}grib_compare -b $BLACKLIST -R referenceValue=0.03,codedValues=2 $temp1 $temp2
+# Now try the "all" option with the highest relative diff value
+${tools_dir}grib_compare -b $BLACKLIST -R all=2 $temp1 $temp2
+
+
 rm -f $temp1 $temp2
 rm -f $outfile
diff --git a/tests/grib_double_cmp.c b/tests/grib_double_cmp.c
index 51e1819..3568096 100644
--- a/tests/grib_double_cmp.c
+++ b/tests/grib_double_cmp.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/grib_double_cmp.sh b/tests/grib_double_cmp.sh
index b84a424..9cd1d62 100755
--- a/tests/grib_double_cmp.sh
+++ b/tests/grib_double_cmp.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/grib_dump.sh b/tests/grib_dump.sh
index 7fc8ab8..d64ee83 100755
--- a/tests/grib_dump.sh
+++ b/tests/grib_dump.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/grib_dump_debug.sh b/tests/grib_dump_debug.sh
index 05a0316..f81c7dc 100755
--- a/tests/grib_dump_debug.sh
+++ b/tests/grib_dump_debug.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/grib_filter.sh b/tests/grib_filter.sh
new file mode 100755
index 0000000..ed5b3ae
--- /dev/null
+++ b/tests/grib_filter.sh
@@ -0,0 +1,144 @@
+#!/bin/sh
+# Copyright 2005-2017 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# 
+# In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
+# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
+#
+
+. ./include.sh
+
+REDIRECT=/dev/null
+
+if [ -f ${data_dir}/geavg.t12z.pgrbaf108 ]
+then
+	tmpdata=grib_api.$$.grib
+	rm -f $tmpdata || true
+	${tools_dir}grib_filter ${data_dir}/filter_rules ${data_dir}/geavg.t12z.pgrbaf108 > $REDIRECT
+	rm -f $tmpdata
+fi
+
+cat >${data_dir}/f.rules <<EOF
+write "${data_dir}/split/[centre]_[date]_[dataType]_[gridType]_[levelType]_[level]_[short_name]_[packingType].grib[editionNumber]";
+EOF
+
+[ -d ${data_dir}/split ] || mkdir -p ${data_dir}/split 
+
+${tools_dir}grib_filter ${data_dir}/f.rules ${data_dir}/tigge_pf_ecmwf.grib2 2> $REDIRECT > $REDIRECT
+
+rm -f ${data_dir}/split/*
+rmdir ${data_dir}/split
+rm -f ${data_dir}/f.rules
+
+# Test with nonexistent keys. Note spelling of centre!
+#######################################################
+cat >${data_dir}/nonexkey.rules <<EOF
+set center="john";
+EOF
+# Invoke without -f i.e. should fail if error encountered
+set +e
+${tools_dir}grib_filter ${data_dir}/nonexkey.rules ${data_dir}/tigge_pf_ecmwf.grib2 2> $REDIRECT > $REDIRECT
+if [ $? -eq 0 ]; then
+   echo "grib_filter should have failed if key not found" >&2
+   exit 1
+fi
+set -e
+# Now repeat with -f option (do not exit on error)
+${tools_dir}grib_filter -f ${data_dir}/nonexkey.rules ${data_dir}/tigge_pf_ecmwf.grib2 2> $REDIRECT > $REDIRECT
+
+rm -f ${data_dir}/nonexkey.rules
+
+# GRIB-308 format specifier for integer keys
+##############################################
+cat > ${data_dir}/formatint.rules <<EOF
+# Pad edition with leading zeroes and level with blanks
+print "edition=[edition%.3d], level=[level%5ld]";
+EOF
+
+result=`${tools_dir}/grib_filter  ${data_dir}/formatint.rules  $ECCODES_SAMPLES_PATH/GRIB1.tmpl`
+[ "$result" = "edition=001, level=  500" ]
+
+# Convert from grib1 to grib2 "Generalized vertical height coordinates"
+cat >temp.filt <<EOF
+set edition=2;
+set typeOfLevel="generalVertical";
+set nlev=41.0;
+write;
+EOF
+
+${tools_dir}/grib_filter -o temp_filt.grib2 temp.filt $ECCODES_SAMPLES_PATH/sh_ml_grib1.tmpl
+result=`${tools_dir}/grib_get -p typeOfFirstFixedSurface,NV,nlev temp_filt.grib2`
+[ "$result" = "150 6 41" ]
+
+# GRIB-394: grib_filter arithmetic operators not correct for floating point values
+###################################################################################
+cat > ${data_dir}/binop.rules <<EOF
+transient val_exact=209.53530883789062500000;
+if (referenceValue == val_exact) {
+   print "OK Equality test passed";
+}
+else {
+   print "***ERROR: float equality test";
+   assert(0);
+}
+transient val_lower=209;
+if (referenceValue > val_lower) {
+  print "OK [referenceValue] > [val_lower]";
+}
+else {
+  print "***ERROR: [referenceValue] <= [val_lower]";
+  assert(0);
+}
+transient val_higher=209.99;
+if (referenceValue < val_higher) {
+  print "OK [referenceValue] < [val_higher]";
+}
+else {
+  print "***ERROR: [referenceValue] >= [val_higher]";
+  assert(0);
+}
+EOF
+${tools_dir}/grib_filter  ${data_dir}/binop.rules $ECCODES_SAMPLES_PATH/gg_sfc_grib1.tmpl >/dev/null
+
+
+# GRIB-526 grib_filter very picky about format of floats
+########################################################
+cat >temp.filt <<EOF
+set values = {
+  -1000.0,
+  3.1e5,
+  66,
+  -77,
+  .4,
+  45. };
+EOF
+${tools_dir}/grib_filter temp.filt $ECCODES_SAMPLES_PATH/GRIB1.tmpl
+
+# Test reading from stdin
+echo 'set centre="kwbc";write;' | ${tools_dir}/grib_filter -o temp_filt.grib2 - $ECCODES_SAMPLES_PATH/GRIB2.tmpl
+result=`${tools_dir}/grib_get -p centre temp_filt.grib2`
+[ "$result" = "kwbc" ]
+
+
+# ECC-365: placeholder in the output filename
+########################################################
+input=${data_dir}/tigge_cf_ecmwf.grib2
+echo 'write;' | ${tools_dir}/grib_filter -o 'temp.out.gfilter.[date].[level].grib' - $input
+[ -f temp.out.gfilter.20070122.925.grib ]
+[ -f temp.out.gfilter.20070122.320.grib ]
+[ -f temp.out.gfilter.20070122.2.grib ]
+[ -f temp.out.gfilter.20070122.10.grib ]
+[ -f temp.out.gfilter.20070122.0.grib ]
+[ -f temp.out.gfilter.20060630.0.grib ]
+[ -f temp.out.gfilter.20060623.0.grib ]
+# Check the contents of one of the output files
+c=`${tools_dir}/grib_count temp.out.gfilter.20070122.320.grib`
+[ "$c" = 1 ]
+grib_check_key_equals temp.out.gfilter.20070122.320.grib "date,level" "20070122 320"
+rm -f temp.out.gfilter.*.grib
+
+
+rm -f temp_filt.grib2 temp.filt
+rm -f ${data_dir}/formatint.rules ${data_dir}/binop.rules
diff --git a/tests/grib_png.sh b/tests/grib_png.sh
index 600def5..fe36c03 100755
--- a/tests/grib_png.sh
+++ b/tests/grib_png.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -22,7 +22,7 @@ files="
  regular_latlon_surface_constant.grib2
 "
 
-if [ $HAVE_JPG -eq 1 ]; then
+if [ $HAVE_JPEG -eq 1 ]; then
  files="multi.grib2 v.grib2"$files
 fi
 
diff --git a/tests/grib_to_netcdf.sh b/tests/grib_to_netcdf.sh
index b2ee4fd..107687f 100755
--- a/tests/grib_to_netcdf.sh
+++ b/tests/grib_to_netcdf.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/grib_util_set_spec.c b/tests/grib_util_set_spec.c
index 9064191..2d525b1 100644
--- a/tests/grib_util_set_spec.c
+++ b/tests/grib_util_set_spec.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -7,12 +7,31 @@
  * In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
  * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
  */
+
+#include "grib_api_internal.h"
 #include "eccodes.h"
 #include <assert.h>
 
 #define STR_EQUAL(s1, s2) (strcmp((s1), (s2)) == 0)
 
-void test_reduced_gg(const char* input_filename, const char* output_filename)
+int get_packing_type_code(const char* packingType)
+{
+    int result = GRIB_UTIL_PACKING_TYPE_GRID_SIMPLE;
+    if (packingType==NULL)
+        return result;
+
+    if (STR_EQUAL(packingType, "grid_jpeg"))
+        result = GRIB_UTIL_PACKING_TYPE_JPEG;
+    else if (STR_EQUAL(packingType, "grid_simple"))
+        result = GRIB_UTIL_PACKING_TYPE_GRID_SIMPLE;
+    else if (STR_EQUAL(packingType, "grid_second_order"))
+        result = GRIB_UTIL_PACKING_TYPE_GRID_SECOND_ORDER;
+
+    return result;
+}
+
+void test_reduced_gg(int remove_local_def, int edition, const char* packingType,
+                     const char* input_filename, const char* output_filename)
 {
     /* based on copy_spec_from_ksec */
     int err = 0;
@@ -59,7 +78,8 @@ void test_reduced_gg(const char* input_filename, const char* output_filename)
     spec.longitudeOfLastGridPointInDegrees  = 357.187500;
     spec.bitmapPresent = 0;
 
-    packing_spec.packing_type = GRIB_UTIL_PACKING_TYPE_GRID_SECOND_ORDER;
+    /*packing_spec.packing_type = GRIB_UTIL_PACKING_TYPE_GRID_SECOND_ORDER;*/
+    packing_spec.packing_type = get_packing_type_code(packingType);
     packing_spec.bitsPerValue = 24;
     packing_spec.accuracy=GRIB_UTIL_ACCURACY_USE_PROVIDED_BITS_PER_VALUES;
     packing_spec.packing=GRIB_UTIL_PACKING_USE_PROVIDED;
@@ -86,7 +106,8 @@ void test_reduced_gg(const char* input_filename, const char* output_filename)
     fclose(out);
 }
 
-void test_regular_ll(const char* input_filename, const char* output_filename)
+void test_regular_ll(int remove_local_def, int edition, const char* packingType,
+                     const char* input_filename, const char* output_filename)
 {
     /* based on copy_spec_from_ksec */
     int err = 0;
@@ -130,13 +151,18 @@ void test_regular_ll(const char* input_filename, const char* output_filename)
     spec.longitudeOfLastGridPointInDegrees  = 15.0;
     spec.bitmapPresent = 0;
 
-    packing_spec.packing_type = GRIB_UTIL_PACKING_TYPE_GRID_SIMPLE;
+    /*packing_spec.packing_type = GRIB_UTIL_PACKING_TYPE_GRID_SIMPLE;*/
+    packing_spec.packing_type = get_packing_type_code(packingType);
     packing_spec.bitsPerValue = 24;
     packing_spec.accuracy=GRIB_UTIL_ACCURACY_USE_PROVIDED_BITS_PER_VALUES;
     packing_spec.packing=GRIB_UTIL_PACKING_USE_PROVIDED;
-    /* Convert to edition 2 and remove local use section */
-    packing_spec.editionNumber = 2;
-    packing_spec.deleteLocalDefinition = 1;
+
+    if (edition != 0) {
+        packing_spec.editionNumber = edition;
+    }
+    if (remove_local_def) {
+        packing_spec.deleteLocalDefinition = 1;
+    }
 
     finalh = codes_grib_util_set_spec(
             handle,
@@ -160,13 +186,53 @@ void test_regular_ll(const char* input_filename, const char* output_filename)
     fclose(out);
 }
 
+void usage(const char *prog)
+{
+    fprintf(stderr, "%s: [-p packingType] [-r] [-e edition] in.grib out.grib\n", prog);
+    fprintf(stderr, "-p  packingType: one of grid_jpeg, grid_second_order or grid_simple\n");
+    fprintf(stderr, "-r  remove local definition\n");
+    fprintf(stderr, "-e  edition: 1 or 2\n");
+    exit(1);
+}
+
 int main(int argc, char *argv[])
 {
-    const char *infile = argv[1];
-    const char *outfile = argv[2];
+    int opt = 0, remove_local_def = 0;
+    int edition = 0;
+    char* packingType = NULL;
+    const char* prog = argv[0];
+    char* infile_name = NULL;
+    char* outfile_name = NULL;
+    
+    while ((opt = getopt(argc, argv, "re:p:")) != -1) {
+        switch (opt) {
+            case 'r':
+                remove_local_def=1;
+                break;
+            case 'p':
+                packingType = optarg;
+                break;
+            case 'e':
+                edition = atoi(optarg);
+                break;
+            default:
+                usage(prog);
+                break;
+        }
+    }
+
+    /* After option processing expect just two files */
+    if (argc-optind != 2) usage(prog);
+
+    /*for (i = optind; i < argc; i++) {
+        printf ("File argument %s\n", argv[i]);
+    }*/
+
+    infile_name = argv[argc-2];
+    outfile_name = argv[argc-1];
+
+    test_regular_ll(remove_local_def, edition, packingType, infile_name, outfile_name);
+    test_reduced_gg(remove_local_def, edition, packingType, infile_name, outfile_name);
 
-    test_regular_ll(infile, outfile);
-    test_reduced_gg(infile, outfile);
-    printf("ALL OK\n");
     return 0;
 }
diff --git a/tests/grib_util_set_spec.sh b/tests/grib_util_set_spec.sh
index a50545c..26aacc9 100755
--- a/tests/grib_util_set_spec.sh
+++ b/tests/grib_util_set_spec.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -19,8 +19,8 @@ outfile=out.grib_util_set_spec.grib
 tempOut=temp.grib_util_set_spec.grib
 rm -f $outfile
 
-# GRIB1 with local definition for MARS
-${test_dir}grib_util_set_spec $infile $outfile > /dev/null
+# GRIB1 with local definition for MARS. Convert to edition2 and remove local def
+${test_dir}grib_util_set_spec -e 2 -r $infile $outfile > /dev/null
 
 res=`${tools_dir}grib_get -p edition,section2Used,Ni,Nj,numberOfValues,bitsPerValue $outfile`
 [ "$res" = "2 0 17 14 238 24" ]
@@ -35,19 +35,32 @@ ${test_dir}grib_util_set_spec $tempOut $outfile > /dev/null
 # Add another grib1 local definition (which is not in grib2)
 ${tools_dir}grib_set -s setLocalDefinition=1,localDefinitionNumber=5 $infile $tempOut
 infile=$tempOut
-${test_dir}grib_util_set_spec $tempOut $outfile > /dev/null
+${test_dir}grib_util_set_spec -r -e 2 $tempOut $outfile > /dev/null
 res=`${tools_dir}grib_get -p edition,section2Used $outfile`
 [ "$res" = "2 0" ]
 
 # GRIB2 input with local definition
 infile=../data/regular_latlon_surface.grib2
-${test_dir}grib_util_set_spec $infile $outfile > /dev/null
+${test_dir}grib_util_set_spec -r $infile $outfile > /dev/null
 grib_check_key_equals $outfile section2Used 0
 # GRIB2 input without local definition
 infile=$ECCODES_SAMPLES_PATH/GRIB2.tmpl
 ${test_dir}grib_util_set_spec $infile $outfile > /dev/null
 grib_check_key_equals $outfile section2Used 0
 
+# Convert to edition2 and use JPEG for packing
+# Don't complain due to unbound variable
+set +u
+if [ x"$HAVE_JPEG" != "x" ]; then
+  if [ $HAVE_JPEG -eq 1 ]; then
+    infile=../data/latlon.grib
+    ${test_dir}grib_util_set_spec -e 2 -p grid_jpeg $infile $outfile > /dev/null
+    res=`${tools_dir}grib_get -p edition,section2Used,packingType $outfile`
+    [ "$res" = "2 1 grid_jpeg" ]
+  fi
+fi
+set -u
+
 # --------------------------------------------------
 # Reduced Gaussian Grid N=32 second order packing
 # --------------------------------------------------
@@ -58,7 +71,7 @@ rm -f $outfile
 stats_old=`${tools_dir}grib_get -F%.2f -p min,max $infile`
 [ "$stats_old" = "160.25 224.45" ]
 
-${test_dir}grib_util_set_spec $infile $outfile
+${test_dir}grib_util_set_spec -p grid_second_order $infile $outfile
 
 # Check output file. Values are scaled up by 1.1
 grib_check_key_equals $outfile packingType grid_second_order
diff --git a/tests/gribex_perf.c b/tests/gribex_perf.c
index efff5e0..39f8acd 100644
--- a/tests/gribex_perf.c
+++ b/tests/gribex_perf.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/gridType.sh b/tests/gridType.sh
index 95360f5..116056a 100755
--- a/tests/gridType.sh
+++ b/tests/gridType.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/gts_compare.sh b/tests/gts_compare.sh
index 5e7ca7e..cfa2561 100755
--- a/tests/gts_compare.sh
+++ b/tests/gts_compare.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/gts_get.sh b/tests/gts_get.sh
index 810fc57..3825069 100755
--- a/tests/gts_get.sh
+++ b/tests/gts_get.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -19,11 +19,9 @@ label="gts_get_test"
 #Create log file
 fLog=${label}".log"
 rm -f $fLog
-touch $fLog
 
 #Define tmp file
 fTmp=${label}".tmp.txt"
-rm -f $fTmp
 
 #----------------------------------------------
 # Test "-p" switch
@@ -31,5 +29,4 @@ rm -f $fTmp
 gts_file=EGRR20150317121020_00493212.DAT
 ${tools_dir}/gts_get -p TT,AA,II,CCCC,YY,GG,gg,BBB $gts_file >/dev/null
 
-rm -f $fLog $res_ls 
-
+rm -f $fLog
diff --git a/tests/gts_ls.sh b/tests/gts_ls.sh
index a0b6c48..1fda640 100755
--- a/tests/gts_ls.sh
+++ b/tests/gts_ls.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/ibm.c b/tests/ibm.c
index df3fcf8..edaf6a9 100755
--- a/tests/ibm.c
+++ b/tests/ibm.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/ieee.c b/tests/ieee.c
index 8ef7658..9b52978 100755
--- a/tests/ieee.c
+++ b/tests/ieee.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/ieee.sh b/tests/ieee.sh
index faf64cc..09727ec 100755
--- a/tests/ieee.sh
+++ b/tests/ieee.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/include.ctest.sh.in b/tests/include.ctest.sh.in
index bed99ca..e476dd0 100644
--- a/tests/include.ctest.sh.in
+++ b/tests/include.ctest.sh.in
@@ -20,6 +20,12 @@ export ECCODES_DEFINITION_PATH
 tools_dir=@CMAKE_BINARY_DIR@/bin/
 tigge_dir=@CMAKE_BINARY_DIR@/bin/
 
+# If this environment variable is set, then run the
+# executables with valgrind
+if test "x$ECCODES_TEST_WITH_VALGRIND" != "x"; then
+   tools_dir="valgrind --error-exitcode=1 -q @CMAKE_BINARY_DIR@/bin/"
+fi
+
 # ecCodes tests are in the PROJECT_BINARY_DIR
 test_dir=@PROJECT_BINARY_DIR@/tests/
 
@@ -29,6 +35,6 @@ ECCODES_SAMPLES_PATH=${samp_dir}
 export ECCODES_SAMPLES_PATH
 
 # Options
-HAVE_JPG=@HAVE_JPG@
+HAVE_JPEG=@HAVE_JPEG@
 HAVE_PNG=@HAVE_PNG@
 HAVE_AEC=@HAVE_AEC@
diff --git a/tests/include.sh b/tests/include.sh
index 441ca80..a5a12a8 100644
--- a/tests/include.sh
+++ b/tests/include.sh
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -41,7 +41,9 @@ else
     export ECCODES_SAMPLES_PATH
     tools_dir=$cpath/tools/
 
-#tools_dir="valgrind --error-exitcode=1 -q $cpath/tools/"
+    if test "x$ECCODES_TEST_WITH_VALGRIND" != "x"; then
+      tools_dir="valgrind --error-exitcode=1 -q $cpath/tools/"
+    fi
 
     tigge_dir=$cpath/tigge/
     data_dir=$cpath/data
diff --git a/tests/index.c b/tests/index.c
index 3218104..fb41ca2 100644
--- a/tests/index.c
+++ b/tests/index.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/index.sh b/tests/index.sh
index 70885e8..76f148d 100755
--- a/tests/index.sh
+++ b/tests/index.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/index_orderby.c b/tests/index_orderby.c
index 8d95606..0e43d9a 100644
--- a/tests/index_orderby.c
+++ b/tests/index_orderby.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/iterator.sh b/tests/iterator.sh
index 7c607d2..24451e2 100755
--- a/tests/iterator.sh
+++ b/tests/iterator.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/jpeg.sh b/tests/jpeg.sh
index 5ccb477..aac4abe 100755
--- a/tests/jpeg.sh
+++ b/tests/jpeg.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -74,10 +74,13 @@ rm -f $outfile2
 res=`${tools_dir}grib_get -l 0,50 $outfile1`
 [ "$res" = "2.47244 2.47244 2.5115 2.51931 " ]
 
+rm -f $outfile1
+
 # ECC-317: Constant JPEG field numberOfValues
 # Create a JPEG encoded GRIB message to have all constant values and one more value
 # than input GRIB message
 infile=${data_dir}/jpeg.grib2
+outfile=$infile.temp.const
 tempFilter1=temp.grib_jpeg_test1.filt
 tempFilter2=temp.grib_jpeg_test2.filt
 numberOfValuesOrig=`${tools_dir}grib_get -p numberOfValues $infile`
@@ -92,11 +95,9 @@ ${tools_dir}grib_filter $tempFilter1 $infile |\
    sed -e 's/[0-9][0-9]*/1/' |\
    sed -e 's/set values={1,/set values={1,1,/' > $tempFilter2
 # Apply the new filter to create the constant field JPEG file
-${tools_dir}grib_filter -o $outfile1 $tempFilter2 $infile
+${tools_dir}grib_filter -o $outfile $tempFilter2 $infile
 numberOfValuesNew=`expr $numberOfValuesOrig + 1`
-grib_check_key_equals $outfile1 "numberOfValues" $numberOfValuesNew
-# If all the values counts match up, the the lat/lon iterator will not fail
-${tools_dir}grib_get_data $outfile1 >/dev/null
+grib_check_key_equals $outfile "numberOfValues" $numberOfValuesNew
 rm -f $tempFilter1 $tempFilter2
 
-rm -f $outfile1 $outfile2
+rm -f $outfile $outfile2
diff --git a/tests/jpeg_perf.c b/tests/jpeg_perf.c
index b7e68a2..2f49bf8 100644
--- a/tests/jpeg_perf.c
+++ b/tests/jpeg_perf.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/julian.c b/tests/julian.c
index c54036d..5493345 100644
--- a/tests/julian.c
+++ b/tests/julian.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/julian.sh b/tests/julian.sh
index 538feb4..2b13398 100755
--- a/tests/julian.sh
+++ b/tests/julian.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/lamb_az_eq_area.sh b/tests/lamb_az_eq_area.sh
index 6f122cf..425bac5 100755
--- a/tests/lamb_az_eq_area.sh
+++ b/tests/lamb_az_eq_area.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/laplacian.c b/tests/laplacian.c
index cb2ae56..3693079 100644
--- a/tests/laplacian.c
+++ b/tests/laplacian.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/largefile.c b/tests/largefile.c
index 188c91d..48c787a 100644
--- a/tests/largefile.c
+++ b/tests/largefile.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/level.sh b/tests/level.sh
index c50101e..78c45a5 100755
--- a/tests/level.sh
+++ b/tests/level.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/list.sh b/tests/list.sh
index e5c136d..24f5133 100755
--- a/tests/list.sh
+++ b/tests/list.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/list_all_keys.ksh b/tests/list_all_keys.ksh
index 2d3d8f9..1849dbd 100755
--- a/tests/list_all_keys.ksh
+++ b/tests/list_all_keys.ksh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/local.sh b/tests/local.sh
index 621954a..b694fa5 100755
--- a/tests/local.sh
+++ b/tests/local.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/local_MeteoFrance.c b/tests/local_MeteoFrance.c
index 0d713bf..97baa26 100644
--- a/tests/local_MeteoFrance.c
+++ b/tests/local_MeteoFrance.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/local_MeteoFrance.sh b/tests/local_MeteoFrance.sh
index 1f7fc20..7fdd445 100755
--- a/tests/local_MeteoFrance.sh
+++ b/tests/local_MeteoFrance.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/ls.sh b/tests/ls.sh
index 50a77e6..d685300 100755
--- a/tests/ls.sh
+++ b/tests/ls.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/metar_compare.sh b/tests/metar_compare.sh
index f214c41..1a59a6d 100755
--- a/tests/metar_compare.sh
+++ b/tests/metar_compare.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/metar_dump.sh b/tests/metar_dump.sh
index fd1fd56..072dddd 100755
--- a/tests/metar_dump.sh
+++ b/tests/metar_dump.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/metar_get.sh b/tests/metar_get.sh
index 88d43bd..7440bde 100755
--- a/tests/metar_get.sh
+++ b/tests/metar_get.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/metar_ls.sh b/tests/metar_ls.sh
index 030cc5a..8fd4fe6 100755
--- a/tests/metar_ls.sh
+++ b/tests/metar_ls.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/missing.sh b/tests/missing.sh
index a19e1c1..758f7bc 100755
--- a/tests/missing.sh
+++ b/tests/missing.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/multi.sh b/tests/multi.sh
index 247c657..6902363 100755
--- a/tests/multi.sh
+++ b/tests/multi.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/multi_from_message.c b/tests/multi_from_message.c
index 2d660c4..f40d497 100644
--- a/tests/multi_from_message.c
+++ b/tests/multi_from_message.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/multi_from_message.sh b/tests/multi_from_message.sh
index 33bf27e..1cb1c71 100755
--- a/tests/multi_from_message.sh
+++ b/tests/multi_from_message.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/mybufrdc_ref.sh b/tests/mybufrdc_ref.sh
index cc4bdbb..b61399e 100755
--- a/tests/mybufrdc_ref.sh
+++ b/tests/mybufrdc_ref.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/neg_fctime.sh b/tests/neg_fctime.sh
index a505429..932835f 100755
--- a/tests/neg_fctime.sh
+++ b/tests/neg_fctime.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/octahedral.sh b/tests/octahedral.sh
index ec09b51..0efb910 100755
--- a/tests/octahedral.sh
+++ b/tests/octahedral.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/optimize_scaling.c b/tests/optimize_scaling.c
new file mode 100644
index 0000000..e24b76b
--- /dev/null
+++ b/tests/optimize_scaling.c
@@ -0,0 +1,2795 @@
+/*
+ * Copyright 2005-2017 ECMWF.
+ *
+ * This software is licensed under the terms of the Apache Licence Version 2.0
+ * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+ *
+ * In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
+ * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
+ */
+
+#include "grib_api.h"
+
+/*
+ * Test the use of optimizeScaleFactor; on the following field, the packing error
+ * is reduced by almost a factor of 2; 
+ * Test that second order packing gives the same result as simple packing with optimizeScaleFactor=1
+ * philippe.marguinaud at meteo.fr, 2016/02
+ */
+
+static double values[] = {
+        0.101300032966540894E+06,       0.101300537463512766E+06,       0.101300575340236785E+06,       0.101300006392703450E+06,       0.101298681683129777E+06,
+        0.101296357626198034E+06,       0.101291429037962458E+06,       0.101285211396584113E+06,       0.101277811769244916E+06,       0.101269604202318660E+06,
+        0.101261086325391967E+06,       0.101252536774223816E+06,       0.101244258202072262E+06,       0.101236292863086681E+06,       0.101228818038673067E+06,
+        0.101222576320632390E+06,       0.101217951101617422E+06,       0.101215281498123208E+06,       0.101214831830208335E+06,       0.101216756641191008E+06,
+        0.101220329473252321E+06,       0.101229814720005656E+06,       0.101242852565120862E+06,       0.101257243179816374E+06,       0.101272242223526715E+06,
+        0.101287023899284890E+06,       0.101300727324330161E+06,       0.101312508880994021E+06,       0.101321304787958841E+06,       0.101323045492054458E+06,
+        0.101323689235454440E+06,       0.101322654817980932E+06,       0.101318546143449697E+06,       0.101311446435368038E+06,       0.101301582670344171E+06,
+        0.101289313645048256E+06,       0.101272976739770951E+06,       0.101254670123119533E+06,       0.101236204711241953E+06,       0.101218525147353255E+06,
+        0.101203644914472199E+06,       0.101191859002529978E+06,       0.101183427645969176E+06,       0.101178788732659857E+06,       0.101176248776911350E+06,
+        0.101174781987763519E+06,       0.101173755414963452E+06,       0.101172549028196707E+06,       0.101170596810517556E+06,       0.101164899003713479E+06,
+        0.101158419589045283E+06,       0.101152491572940358E+06,       0.101147843517789603E+06,       0.101145017464391334E+06,       0.101144350744426047E+06,
+        0.101145965622140546E+06,       0.101150160852645960E+06,       0.101156489280060341E+06,       0.101164999288937499E+06,       0.101174680757722846E+06,
+        0.101184614700939375E+06,       0.101194476866903220E+06,       0.101203847071805940E+06,       0.101212793693367261E+06,       0.101221210811864396E+06,
+        0.101228967667653473E+06,       0.101235941297612240E+06,       0.101241825830798407E+06,       0.101246384813952725E+06,       0.101250233289149895E+06,
+        0.101253625288606709E+06,       0.101256829767974210E+06,       0.101260135466684485E+06,       0.101263922730170481E+06,       0.101268258457290780E+06,
+        0.101273173871677092E+06,       0.101278603318462468E+06,       0.101284438572224244E+06,       0.101291451901038017E+06,       0.101298825789695678E+06,
+        0.101305583597361008E+06,       0.101311198590170257E+06,       0.101313106869633571E+06,       0.101311964918650119E+06,       0.101309609217350633E+06,
+        0.101306588009722152E+06,       0.101303789827421686E+06,       0.101303204229508177E+06,       0.101302539808644782E+06,       0.101301748136565366E+06,
+        0.101300889588588965E+06,       0.101301524026314495E+06,       0.101302253276609670E+06,       0.101302463210049027E+06,       0.101302292202795681E+06,
+        0.101298302559037387E+06,       0.101291449427361382E+06,       0.101283550209983820E+06,       0.101275343284659903E+06,       0.101268451030137920E+06,
+        0.101263440167506284E+06,       0.101259681043976845E+06,       0.101257275584439689E+06,       0.101255817294926324E+06,       0.101255329151085723E+06,
+        0.101256832423130865E+06,       0.101260699063277454E+06,       0.101270225601657599E+06,       0.101287312191364559E+06,       0.101303455630186116E+06,
+        0.101316029699689170E+06,       0.101320758891846766E+06,       0.101311100182774215E+06,       0.101294901290088586E+06,       0.101273081896347416E+06,
+        0.101246397937256072E+06,       0.101214175532589943E+06,       0.101180475299171711E+06,       0.101147446887522659E+06,       0.101117364487217361E+06,
+        0.101093085915674965E+06,       0.101075700452174933E+06,       0.101066299886712630E+06,       0.101066158368806296E+06,       0.101078251612071312E+06,
+        0.101107333429588485E+06,       0.101145577197960345E+06,       0.101190184433163799E+06,       0.101238249723994639E+06,       0.101280682092796589E+06,
+        0.101316576899162261E+06,       0.101349617253023622E+06,       0.101379226791601075E+06,       0.101404833281466810E+06,       0.101426608723689307E+06,
+        0.101443265324151027E+06,       0.101453984963411596E+06,       0.101458728599400347E+06,       0.101457810163301183E+06,       0.101452773264225369E+06,
+        0.101443352159658025E+06,       0.101428700824100233E+06,       0.101409534671443689E+06,       0.101387066094169772E+06,       0.101362901532581192E+06,
+        0.101342428907368536E+06,       0.101323657976273273E+06,       0.101307125752964450E+06,       0.101293183514770688E+06,       0.101280868902945120E+06,
+        0.101268909632403243E+06,       0.101254864133468844E+06,       0.101241751785266810E+06,       0.101229873732095890E+06,       0.101219507414652238E+06,
+        0.101210854622372586E+06,       0.101203998200015136E+06,       0.101202118817604176E+06,       0.101204115282818020E+06,       0.101207394659720041E+06,
+        0.101211469101194845E+06,       0.101215801913933246E+06,       0.101219837912576768E+06,       0.101222821880958276E+06,       0.101223619521153145E+06,
+        0.101223119359168049E+06,       0.101279933976388784E+06,       0.101280230886902951E+06,       0.101280173829517254E+06,       0.101279628905657766E+06,
+        0.101278452724477320E+06,       0.101276500130166445E+06,       0.101273279706602567E+06,       0.101267225127293903E+06,       0.101259879400551043E+06,
+        0.101251952874409501E+06,       0.101243674039727790E+06,       0.101235303075196876E+06,       0.101227122345847776E+06,       0.101219423613287974E+06,
+        0.101212178882549546E+06,       0.101205696806113177E+06,       0.101200710454399567E+06,       0.101197550054666615E+06,       0.101196424920055710E+06,
+        0.101196682426928426E+06,       0.101199196544638864E+06,       0.101204111882830854E+06,       0.101214864879095490E+06,       0.101228568680570461E+06,
+        0.101243289081509487E+06,       0.101258220436669624E+06,       0.101272521063369320E+06,       0.101285366950491778E+06,       0.101296012419061328E+06,
+        0.101305658540617282E+06,       0.101309682063797125E+06,       0.101310624244857565E+06,       0.101308433795484656E+06,       0.101303210985482059E+06,
+        0.101295198335334237E+06,       0.101284767756201632E+06,       0.101272403737592205E+06,       0.101256113788140079E+06,       0.101238847669926457E+06,
+        0.101222589159180454E+06,       0.101208629956686913E+06,       0.101197517909479167E+06,       0.101189497449897433E+06,       0.101184456694785782E+06,
+        0.101181649500138068E+06,       0.101179750491125887E+06,       0.101178046404878522E+06,       0.101175885037415414E+06,       0.101168022154143066E+06,
+        0.101159966065713801E+06,       0.101152331174549618E+06,       0.101145627588820978E+06,       0.101140536375719617E+06,       0.101137554875074289E+06,
+        0.101136964384819003E+06,       0.101138821605761070E+06,       0.101143054186604160E+06,       0.101151654753774303E+06,       0.101161075130481171E+06,
+        0.101170963288776737E+06,       0.101180942106852366E+06,       0.101190660642090996E+06,       0.101199851697929174E+06,       0.101208579711314771E+06,
+        0.101216763897321827E+06,       0.101224252677880388E+06,       0.101230718188980885E+06,       0.101236243573164116E+06,       0.101240451206177866E+06,
+        0.101243892699987075E+06,       0.101246988344102370E+06,       0.101250044906442185E+06,       0.101253348298035868E+06,       0.101257374370298217E+06,
+        0.101262251561231329E+06,       0.101267895803787687E+06,       0.101275473367753089E+06,       0.101283709026768585E+06,       0.101292283625024313E+06,
+        0.101300598737905675E+06,       0.101308093199018083E+06,       0.101314220495369867E+06,       0.101317565250665139E+06,       0.101316383038650820E+06,
+        0.101313738332474823E+06,       0.101310203262582130E+06,       0.101306334680532935E+06,       0.101304140173899126E+06,       0.101302185066315011E+06,
+        0.101301166929963205E+06,       0.101300627409982437E+06,       0.101301442301666364E+06,       0.101302674870566902E+06,       0.101303021785214194E+06,
+        0.101301874610097177E+06,       0.101297234163742920E+06,       0.101289212662159043E+06,       0.101280201810217695E+06,       0.101271153345172788E+06,
+        0.101264093160240271E+06,       0.101259964551924568E+06,       0.101257527008254954E+06,       0.101256779297676592E+06,       0.101257083402693010E+06,
+        0.101258345876766994E+06,       0.101261741195912517E+06,       0.101267637196925745E+06,       0.101280255542587736E+06,       0.101300219472217796E+06,
+        0.101318811431023903E+06,       0.101333064281329105E+06,       0.101337822826176372E+06,       0.101329633927901843E+06,       0.101313842956693508E+06,
+        0.101291773913463257E+06,       0.101264248822328038E+06,       0.101231681402834831E+06,       0.101198711256044262E+06,       0.101165944729817566E+06,
+        0.101135663129340406E+06,       0.101112149821393570E+06,       0.101094336258872077E+06,       0.101083754934829689E+06,       0.101081962838100400E+06,
+        0.101094161177945804E+06,       0.101119463798994111E+06,       0.101153379508463855E+06,       0.101193466772876971E+06,       0.101236864297787688E+06,
+        0.101271319749684611E+06,       0.101304810719710440E+06,       0.101336529049048593E+06,       0.101365547226062699E+06,       0.101391403447243065E+06,
+        0.101414233987549960E+06,       0.101431699751902197E+06,       0.101443249701215464E+06,       0.101448694379159249E+06,       0.101448342945639379E+06,
+        0.101444949497289897E+06,       0.101434983683722516E+06,       0.101420339588228075E+06,       0.101400782009497547E+06,       0.101377357223598548E+06,
+        0.101353445824612878E+06,       0.101331105881366500E+06,       0.101310391048972291E+06,       0.101292023316921361E+06,       0.101276408630823629E+06,
+        0.101263594338449708E+06,       0.101249134886344415E+06,       0.101234892154251414E+06,       0.101221982151018121E+06,       0.101210641209280395E+06,
+        0.101201103409364907E+06,       0.101193542381486463E+06,       0.101189530184913005E+06,       0.101188943141927884E+06,       0.101190369535781749E+06,
+        0.101194174658495293E+06,       0.101198877046582638E+06,       0.101203781726436631E+06,       0.101208345081553751E+06,       0.101210641923420510E+06,
+        0.101211907924376195E+06,       0.101211894158448660E+06,       0.101261542396602526E+06,       0.101261524602459496E+06,       0.101261271962264684E+06,
+        0.101260655467705859E+06,       0.101259535677996173E+06,       0.101257770460092695E+06,       0.101254858567248273E+06,       0.101250130827152869E+06,
+        0.101243199529206220E+06,       0.101235660710148513E+06,       0.101227727082598372E+06,       0.101219642017676335E+06,       0.101211669747645647E+06,
+        0.101204082204654842E+06,       0.101197142166519814E+06,       0.101190828836761386E+06,       0.101185622952613427E+06,       0.101182084994122983E+06,
+        0.101179819644487143E+06,       0.101179386785722192E+06,       0.101181037231546885E+06,       0.101184921544816825E+06,       0.101191071708805684E+06,
+        0.101202963344456002E+06,       0.101217214661309525E+06,       0.101232127096539611E+06,       0.101246868435665092E+06,       0.101260623299959872E+06,
+        0.101275012912500446E+06,       0.101287927630361359E+06,       0.101297156607966986E+06,       0.101300022279744313E+06,       0.101299658882873831E+06,
+        0.101296185125092088E+06,       0.101289860769760111E+06,       0.101281072853932870E+06,       0.101270317685887567E+06,       0.101257849866728764E+06,
+        0.101241620969336713E+06,       0.101226620289076629E+06,       0.101213719159152053E+06,       0.101203448100139896E+06,       0.101196030165699893E+06,
+        0.101191332050565718E+06,       0.101188825460235021E+06,       0.101186627930786824E+06,       0.101183177496864155E+06,       0.101175055095382006E+06,
+        0.101166325451567565E+06,       0.101157506572639366E+06,       0.101149141784503256E+06,       0.101141882059824522E+06,       0.101136611424843984E+06,
+        0.101133780517071078E+06,       0.101133612778250375E+06,       0.101137015702474586E+06,       0.101144048000326933E+06,       0.101152946100252506E+06,
+        0.101162592544671337E+06,       0.101172594122147348E+06,       0.101182525914593833E+06,       0.101192006688188281E+06,       0.101200731545306888E+06,
+        0.101208949653701755E+06,       0.101216776035106115E+06,       0.101223643986761963E+06,       0.101229495275078225E+06,       0.101234397106283810E+06,
+        0.101238325186287970E+06,       0.101241245958931366E+06,       0.101243986310471693E+06,       0.101246885079730608E+06,       0.101250239965938381E+06,
+        0.101254497783043873E+06,       0.101260948534770170E+06,       0.101268693386766550E+06,       0.101277410860750868E+06,       0.101286673004684562E+06,
+        0.101296037156777587E+06,       0.101304973100759889E+06,       0.101312836471203336E+06,       0.101319077100166265E+06,       0.101323200714451756E+06,
+        0.101322250124293394E+06,       0.101319426400325508E+06,       0.101315327879672026E+06,       0.101311379409400208E+06,       0.101308929715621984E+06,
+        0.101307576201749136E+06,       0.101306752066909641E+06,       0.101306276681202202E+06,       0.101306450951061837E+06,       0.101306928825287003E+06,
+        0.101306304370611891E+06,       0.101304071949983219E+06,       0.101298726444911401E+06,       0.101289556844688181E+06,       0.101279573549734007E+06,
+        0.101269900918276995E+06,       0.101262737639210711E+06,       0.101259533404357528E+06,       0.101258456904325285E+06,       0.101259373853730853E+06,
+        0.101261455254273096E+06,       0.101264486663057716E+06,       0.101269671494430630E+06,       0.101277337091813301E+06,       0.101292476984397377E+06,
+        0.101314252890570002E+06,       0.101334243526143560E+06,       0.101349257112687643E+06,       0.101353348220742904E+06,       0.101345316081726181E+06,
+        0.101329205683580891E+06,       0.101306196398575121E+06,       0.101276157501052992E+06,       0.101241050683782683E+06,       0.101205878990180805E+06,
+        0.101173117425566874E+06,       0.101145231775263543E+06,       0.101124829234029152E+06,       0.101110142836540865E+06,       0.101099009983212847E+06,
+        0.101095931793603289E+06,       0.101107937055714152E+06,       0.101129557639286853E+06,       0.101159016947845914E+06,       0.101194290171214365E+06,
+        0.101229194191076458E+06,       0.101259884907642350E+06,       0.101290909335772027E+06,       0.101321534960278805E+06,       0.101350933609778935E+06,
+        0.101378619763291339E+06,       0.101402515553940961E+06,       0.101421126437325220E+06,       0.101433759893184542E+06,       0.101440081432142906E+06,
+        0.101442774222367792E+06,       0.101440175371796868E+06,       0.101430382938397539E+06,       0.101414195446914280E+06,       0.101393183882853962E+06,
+        0.101368556280786899E+06,       0.101342857987377705E+06,       0.101318002031737051E+06,       0.101294900480304379E+06,       0.101274304523903862E+06,
+        0.101256697091383176E+06,       0.101240541623616038E+06,       0.101225909818463362E+06,       0.101213299349493405E+06,       0.101200928172660904E+06,
+        0.101190501742025459E+06,       0.101182213405811461E+06,       0.101176901403817319E+06,       0.101175245583661221E+06,       0.101175762446152599E+06,
+        0.101178005333581008E+06,       0.101181392651505157E+06,       0.101186087494527630E+06,       0.101191405412103719E+06,       0.101195091837111089E+06,
+        0.101197730891759726E+06,       0.101199364382066880E+06,       0.101199730209935369E+06,       0.101245004040932326E+06,       0.101244559135352756E+06,
+        0.101244006361693333E+06,       0.101243220164091719E+06,       0.101242063426875131E+06,       0.101239785127296316E+06,       0.101236357261140554E+06,
+        0.101232655165141550E+06,       0.101227802625625860E+06,       0.101220780822386791E+06,       0.101213322053334618E+06,       0.101205654745465290E+06,
+        0.101198027406206093E+06,       0.101190695138277268E+06,       0.101183902374283105E+06,       0.101177861446733092E+06,       0.101172715839318174E+06,
+        0.101168727915036332E+06,       0.101166083677619172E+06,       0.101165120300427254E+06,       0.101166097664782996E+06,       0.101169176642534818E+06,
+        0.101174400762938254E+06,       0.101181681695578300E+06,       0.101194628149370954E+06,       0.101209354172510837E+06,       0.101224384543212596E+06,
+        0.101241003377192639E+06,       0.101256971279536912E+06,       0.101271325762838256E+06,       0.101283302907598583E+06,       0.101290837888259193E+06,
+        0.101292188600320253E+06,       0.101290316399723524E+06,       0.101285500501916889E+06,       0.101278145707370568E+06,       0.101268063741988299E+06,
+        0.101255992666718317E+06,       0.101243630289196284E+06,       0.101230020660095543E+06,       0.101218300352418431E+06,       0.101208996070145775E+06,
+        0.101202318103285957E+06,       0.101198115125068754E+06,       0.101195865072430563E+06,       0.101192485973754709E+06,       0.101184883550562605E+06,
+        0.101176252043943983E+06,       0.101167064140836461E+06,       0.101157837055866650E+06,       0.101149111932572778E+06,       0.101141425669095363E+06,
+        0.101136096494374695E+06,       0.101133772515929886E+06,       0.101136278536261714E+06,       0.101141790910123251E+06,       0.101149565058361550E+06,
+        0.101159158826086161E+06,       0.101169280924233710E+06,       0.101179364339541717E+06,       0.101189214375348573E+06,       0.101198419330631325E+06,
+        0.101206662421100802E+06,       0.101214110977152406E+06,       0.101221277683224456E+06,       0.101227361193735371E+06,       0.101232391962857888E+06,
+        0.101236456240121115E+06,       0.101239696448804534E+06,       0.101242131415364871E+06,       0.101244485321801025E+06,       0.101247206329288369E+06,
+        0.101250813340918423E+06,       0.101256254483921584E+06,       0.101263638654577793E+06,       0.101272420586206106E+06,       0.101282081390786785E+06,
+        0.101292093147014763E+06,       0.101301886889219619E+06,       0.101311011635127215E+06,       0.101318745388787589E+06,       0.101324552511834278E+06,
+        0.101327137099599713E+06,       0.101325798652594996E+06,       0.101322370281172494E+06,       0.101318873214067411E+06,       0.101316033453167009E+06,
+        0.101314254241750285E+06,       0.101313290040590538E+06,       0.101312777489808956E+06,       0.101312426972162124E+06,       0.101312077043907979E+06,
+        0.101311637613854371E+06,       0.101309930679532728E+06,       0.101306604219150962E+06,       0.101300708574919438E+06,       0.101290667766194849E+06,
+        0.101280103453056901E+06,       0.101270238174615952E+06,       0.101263265305097812E+06,       0.101261210282368877E+06,       0.101261635280168994E+06,
+        0.101264259503469541E+06,       0.101268188459234763E+06,       0.101273120782915241E+06,       0.101280081032422138E+06,       0.101289326234345950E+06,
+        0.101306137507821695E+06,       0.101328331726916280E+06,       0.101348454606262691E+06,       0.101363243724620203E+06,       0.101365228148856142E+06,
+        0.101355701191101674E+06,       0.101338137535693226E+06,       0.101313442343172661E+06,       0.101279893686959578E+06,       0.101241766771608411E+06,
+        0.101204166019317592E+06,       0.101170013105795253E+06,       0.101142432350644231E+06,       0.101122231791865343E+06,       0.101108816561727523E+06,
+        0.101102229721379510E+06,       0.101103813368451665E+06,       0.101116580337189007E+06,       0.101134920647456835E+06,       0.101160141230191730E+06,
+        0.101190695983823272E+06,       0.101217581338673946E+06,       0.101244990949544663E+06,       0.101273917316553634E+06,       0.101303572896501239E+06,
+        0.101333544453130846E+06,       0.101364877370781323E+06,       0.101391063816659895E+06,       0.101411237101045277E+06,       0.101425278782258334E+06,
+        0.101433519934200929E+06,       0.101439158935259431E+06,       0.101436999045160905E+06,       0.101426916105024720E+06,       0.101409617969188068E+06,
+        0.101386542831537823E+06,       0.101358099179373283E+06,       0.101329104321193983E+06,       0.101301390131810738E+06,       0.101275584184176812E+06,
+        0.101252450915750233E+06,       0.101231887457535791E+06,       0.101212090768716560E+06,       0.101196447068532798E+06,       0.101185068443023629E+06,
+        0.101177384135667060E+06,       0.101168309967723544E+06,       0.101161992541140848E+06,       0.101159852630578913E+06,       0.101159796489626082E+06,
+        0.101161597602608847E+06,       0.101164838510229980E+06,       0.101168957886595192E+06,       0.101173308450019656E+06,       0.101177043737997461E+06,
+        0.101180725542300570E+06,       0.101183638211952741E+06,       0.101185541375514644E+06,       0.101186177771331219E+06,       0.101231389269493171E+06,
+        0.101229452023944614E+06,       0.101228492450459045E+06,       0.101227437857730562E+06,       0.101225272919369032E+06,       0.101222115782736248E+06,
+        0.101218895852368762E+06,       0.101215584732123752E+06,       0.101212116636056322E+06,       0.101207354097621472E+06,       0.101200521838921966E+06,
+        0.101193426713001274E+06,       0.101186304142571476E+06,       0.101179395677309934E+06,       0.101172931379861388E+06,       0.101167151828382484E+06,
+        0.101162308500518877E+06,       0.101158300144806009E+06,       0.101155408258388663E+06,       0.101154070184498851E+06,       0.101154559752015484E+06,
+        0.101157052466433044E+06,       0.101161607131965604E+06,       0.101168151354609319E+06,       0.101176471448160533E+06,       0.101190446255643255E+06,
+        0.101207546249739040E+06,       0.101224869025537133E+06,       0.101241629266362957E+06,       0.101257034534386199E+06,       0.101270300423290071E+06,
+        0.101280701804350014E+06,       0.101286032850469506E+06,       0.101285592385854572E+06,       0.101282085195034277E+06,       0.101274697798302746E+06,
+        0.101264580591891121E+06,       0.101253728075986262E+06,       0.101242929317346643E+06,       0.101232485866013521E+06,       0.101222025672053554E+06,
+        0.101213765521939480E+06,       0.101207908438247250E+06,       0.101204284122239580E+06,       0.101199927839590950E+06,       0.101194734819518329E+06,
+        0.101188456889903726E+06,       0.101179666542616309E+06,       0.101170394407501270E+06,       0.101161163472120141E+06,       0.101152520749703152E+06,
+        0.101145006252468942E+06,       0.101139495861547286E+06,       0.101140801932908304E+06,       0.101144658005535239E+06,       0.101150950782672968E+06,
+        0.101159402010231061E+06,       0.101169516352869221E+06,       0.101180618870833394E+06,       0.101190857796199096E+06,       0.101200641550543587E+06,
+        0.101209362327359180E+06,       0.101217130139796180E+06,       0.101224049008589936E+06,       0.101230122753387783E+06,       0.101235212462695199E+06,
+        0.101239229954162147E+06,       0.101242277095199534E+06,       0.101244507835626879E+06,       0.101246153185945266E+06,       0.101247135672995661E+06,
+        0.101249606832741643E+06,       0.101254017340448758E+06,       0.101260512682501125E+06,       0.101268912159280037E+06,       0.101278581961162170E+06,
+        0.101288935630890279E+06,       0.101299344634514127E+06,       0.101309165575948311E+06,       0.101317556887074039E+06,       0.101323172703937016E+06,
+        0.101326358447397986E+06,       0.101327232302474091E+06,       0.101325894572504010E+06,       0.101322706535794525E+06,       0.101319932108380584E+06,
+        0.101318115839731938E+06,       0.101317374329348502E+06,       0.101316802412196412E+06,       0.101316539167573457E+06,       0.101316220872659469E+06,
+        0.101315472541661889E+06,       0.101313988991298058E+06,       0.101311143303248988E+06,       0.101306823565026949E+06,       0.101300909517459571E+06,
+        0.101291139156745485E+06,       0.101281432901143096E+06,       0.101272931024738762E+06,       0.101267480423988032E+06,       0.101267406598649904E+06,
+        0.101269963384954986E+06,       0.101274800002130170E+06,       0.101281233237463195E+06,       0.101288842618392577E+06,       0.101297886975346977E+06,
+        0.101308296387334616E+06,       0.101325624485844790E+06,       0.101346166178142783E+06,       0.101363441252856501E+06,       0.101374801583022883E+06,
+        0.101371478339382054E+06,       0.101357965915636902E+06,       0.101337616663800756E+06,       0.101310513973449386E+06,       0.101272307541573202E+06,
+        0.101230865550039016E+06,       0.101190791911869368E+06,       0.101155350687670492E+06,       0.101129224427448615E+06,       0.101110583343861392E+06,
+        0.101099020700267734E+06,       0.101094724119735372E+06,       0.101099023269690821E+06,       0.101111662707600757E+06,       0.101130628382792580E+06,
+        0.101154442701152686E+06,       0.101179514522985817E+06,       0.101201379997560478E+06,       0.101226265787734679E+06,       0.101253796882664625E+06,
+        0.101283225572595169E+06,       0.101317124967778669E+06,       0.101350989077608407E+06,       0.101379921717535108E+06,       0.101402381642000008E+06,
+        0.101417742462739217E+06,       0.101429901727416946E+06,       0.101436203470310473E+06,       0.101434079341425662E+06,       0.101423164600191842E+06,
+        0.101404037685293821E+06,       0.101376818918793375E+06,       0.101344589194113520E+06,       0.101311531147971255E+06,       0.101279820675164505E+06,
+        0.101251153362574143E+06,       0.101225285333396270E+06,       0.101199764562447148E+06,       0.101178262360150809E+06,       0.101161772194779478E+06,
+        0.101150434481179953E+06,       0.101143909494338062E+06,       0.101141390141577620E+06,       0.101140639767941699E+06,       0.101140632648710569E+06,
+        0.101142372620975060E+06,       0.101145663398052158E+06,       0.101150107990777600E+06,       0.101155154940690569E+06,       0.101159369531278891E+06,
+        0.101162295247948568E+06,       0.101164893804552295E+06,       0.101168002876310085E+06,       0.101170082535517562E+06,       0.101170879828210964E+06,
+        0.101219861459639709E+06,       0.101217353733850920E+06,       0.101214813662341927E+06,       0.101212272616671195E+06,       0.101208980334428372E+06,
+        0.101205795685889956E+06,       0.101202734659769427E+06,       0.101199769990954403E+06,       0.101196834984741159E+06,       0.101193828164992272E+06,
+        0.101189376363543503E+06,       0.101183028116295318E+06,       0.101176590659241221E+06,       0.101170295511546516E+06,       0.101164459781001147E+06,
+        0.101159272837843542E+06,       0.101154626508349247E+06,       0.101150830978481536E+06,       0.101147940393322046E+06,       0.101146374185143752E+06,
+        0.101146551350105059E+06,       0.101148666345078062E+06,       0.101152796928674230E+06,       0.101158889620899077E+06,       0.101166802022490039E+06,
+        0.101178035305259487E+06,       0.101194860122035752E+06,       0.101212325551695918E+06,       0.101229507831180323E+06,       0.101245588075390231E+06,
+        0.101259749204794090E+06,       0.101271227064842373E+06,       0.101279354568716226E+06,       0.101282023041620065E+06,       0.101277735417878983E+06,
+        0.101270065940430606E+06,       0.101260942221718724E+06,       0.101251183302667749E+06,       0.101241580790420048E+06,       0.101232817663754860E+06,
+        0.101224865544509375E+06,       0.101217678236240463E+06,       0.101212672610467605E+06,       0.101207368061914924E+06,       0.101202142949429748E+06,
+        0.101197200360827206E+06,       0.101192321056135959E+06,       0.101185312042045203E+06,       0.101176366919002583E+06,       0.101167575306740793E+06,
+        0.101159499887747690E+06,       0.101153693581619635E+06,       0.101151632492099627E+06,       0.101152648343697670E+06,       0.101157198969257923E+06,
+        0.101164178808173063E+06,       0.101173247856793882E+06,       0.101183857272265639E+06,       0.101195294072408884E+06,       0.101206439742155373E+06,
+        0.101215821840872028E+06,       0.101224223508709707E+06,       0.101231582323487324E+06,       0.101237823030360581E+06,       0.101242874318770337E+06,
+        0.101246774089702827E+06,       0.101249620201836733E+06,       0.101251514633922707E+06,       0.101250998739460556E+06,       0.101250350564701104E+06,
+        0.101251192192736547E+06,       0.101254126969565099E+06,       0.101259362363834385E+06,       0.101266888172729494E+06,       0.101276372037240624E+06,
+        0.101286838617996444E+06,       0.101297573246049607E+06,       0.101307533698699568E+06,       0.101315884770704040E+06,       0.101322262940598855E+06,
+        0.101325965760392661E+06,       0.101327074410681467E+06,       0.101325913256045969E+06,       0.101323124870245505E+06,       0.101319702236701676E+06,
+        0.101317199019545646E+06,       0.101315951598744505E+06,       0.101315806747022463E+06,       0.101315575437492836E+06,       0.101314907982108765E+06,
+        0.101313877512845647E+06,       0.101312479697057366E+06,       0.101309803618787570E+06,       0.101306072028328548E+06,       0.101301517809186698E+06,
+        0.101296222398532715E+06,       0.101287978736962512E+06,       0.101280134483104775E+06,       0.101273858730883643E+06,       0.101270559684999607E+06,
+        0.101272646114663905E+06,       0.101277445816036910E+06,       0.101284587711525965E+06,       0.101293877343276210E+06,       0.101304839668757166E+06,
+        0.101316528257227954E+06,       0.101328366576771165E+06,       0.101345969486117698E+06,       0.101364186088572969E+06,       0.101377148495963469E+06,
+        0.101382093829553254E+06,       0.101370766337072331E+06,       0.101349741353763951E+06,       0.101321811510905638E+06,       0.101288468123698593E+06,
+        0.101244965303345511E+06,       0.101202004776977919E+06,       0.101162860285996649E+06,       0.101126851606302604E+06,       0.101104372225545885E+06,
+        0.101088557676466924E+06,       0.101079807482518576E+06,       0.101078498448923550E+06,       0.101085445131155400E+06,       0.101098827324377111E+06,
+        0.101117379276230466E+06,       0.101139770652544976E+06,       0.101160113557297649E+06,       0.101180387504904938E+06,       0.101203886596317709E+06,
+        0.101230902181368132E+06,       0.101261803558958476E+06,       0.101300608660476937E+06,       0.101337274184836075E+06,       0.101369125977644289E+06,
+        0.101394267041929546E+06,       0.101413158265606093E+06,       0.101427330114929093E+06,       0.101432361057773902E+06,       0.101429910859225725E+06,
+        0.101417624134461643E+06,       0.101395314188587567E+06,       0.101362172145086661E+06,       0.101325960646168634E+06,       0.101289070977803320E+06,
+        0.101253544677021608E+06,       0.101220938962399465E+06,       0.101189935258524172E+06,       0.101161696612905507E+06,       0.101138721820111517E+06,
+        0.101121644349305658E+06,       0.101110649141410599E+06,       0.101105415636551304E+06,       0.101106709372907222E+06,       0.101112684473039320E+06,
+        0.101118393699309789E+06,       0.101122164751330070E+06,       0.101127188453840165E+06,       0.101133080620089138E+06,       0.101138746974859983E+06,
+        0.101142873479913527E+06,       0.101146389620966002E+06,       0.101149025184660437E+06,       0.101150587859464547E+06,       0.101152755345234560E+06,
+        0.101153603260132426E+06,       0.101210525717246186E+06,       0.101207548474999538E+06,       0.101202904596832290E+06,       0.101197951386655157E+06,
+        0.101194386519771622E+06,       0.101191122015514105E+06,       0.101188175657561296E+06,       0.101185519945178385E+06,       0.101183085746111174E+06,
+        0.101180766773284515E+06,       0.101178424993241424E+06,       0.101174517040993989E+06,       0.101168962341147722E+06,       0.101163714253363345E+06,
+        0.101158948557658077E+06,       0.101154261182255184E+06,       0.101149950932639709E+06,       0.101146327181315632E+06,       0.101143687040794233E+06,
+        0.101142126337276364E+06,       0.101142152044085655E+06,       0.101144083527112423E+06,       0.101148021171421016E+06,       0.101154000779215450E+06,
+        0.101162760282120405E+06,       0.101173711396198050E+06,       0.101186611484798021E+06,       0.101203854792520258E+06,       0.101221108630801245E+06,
+        0.101237514909808757E+06,       0.101252212005649548E+06,       0.101264385838287199E+06,       0.101273313773670612E+06,       0.101275991122254636E+06,
+        0.101272633847169331E+06,       0.101265839223746094E+06,       0.101257619395513131E+06,       0.101248828329997094E+06,       0.101240269262524962E+06,
+        0.101232609922544550E+06,       0.101226305719316471E+06,       0.101221001261636731E+06,       0.101215325578545016E+06,       0.101210148330884782E+06,
+        0.101205386910296002E+06,       0.101200913609812837E+06,       0.101196557499459639E+06,       0.101192094621711993E+06,       0.101184939627293686E+06,
+        0.101177056092112194E+06,       0.101171384998373789E+06,       0.101168077457142164E+06,       0.101167062491365999E+06,       0.101168742847490139E+06,
+        0.101173481015017140E+06,       0.101181062252591364E+06,       0.101190688726292763E+06,       0.101201754487460537E+06,       0.101213053590803727E+06,
+        0.101224458950927612E+06,       0.101234613260145692E+06,       0.101242743726390036E+06,       0.101249595831817132E+06,       0.101255046289272010E+06,
+        0.101258984767052723E+06,       0.101261363785577109E+06,       0.101261779254400128E+06,       0.101259695740838331E+06,       0.101257723355522670E+06,
+        0.101256712782620496E+06,       0.101257390131988577E+06,       0.101260812728128207E+06,       0.101266865110914150E+06,       0.101275356425384583E+06,
+        0.101285757165198593E+06,       0.101297005109519319E+06,       0.101307222441895385E+06,       0.101316130802742104E+06,       0.101323131432448601E+06,
+        0.101327755554835458E+06,       0.101329091060690815E+06,       0.101327426676222676E+06,       0.101323405755774875E+06,       0.101317808009742424E+06,
+        0.101312695092861308E+06,       0.101309644418928467E+06,       0.101307843097245379E+06,       0.101307258014776118E+06,       0.101306396062738830E+06,
+        0.101304392989299769E+06,       0.101302318926388383E+06,       0.101300146974100906E+06,       0.101296693003163877E+06,       0.101292171838443071E+06,
+        0.101287472873098537E+06,       0.101282787197424317E+06,       0.101276691890622955E+06,       0.101271343380570586E+06,       0.101267971439309680E+06,
+        0.101267491024100920E+06,       0.101272069334797809E+06,       0.101279335267968272E+06,       0.101288917788163279E+06,       0.101301241225878053E+06,
+        0.101315819189724789E+06,       0.101330320177330534E+06,       0.101343606724499783E+06,       0.101360277666390102E+06,       0.101374651937569957E+06,
+        0.101381948044541350E+06,       0.101379139254734604E+06,       0.101357829215456179E+06,       0.101327280040149271E+06,       0.101289941888269532E+06,
+        0.101246108522415467E+06,       0.101194796632095546E+06,       0.101146024288208340E+06,       0.101103656741928615E+06,       0.101073141515266252E+06,
+        0.101057806173447316E+06,       0.101051682514418280E+06,       0.101049406076037965E+06,       0.101052339673225651E+06,       0.101063115066462298E+06,
+        0.101078506068417060E+06,       0.101097590566484258E+06,       0.101118771179471136E+06,       0.101135489318013730E+06,       0.101154758424584812E+06,
+        0.101177654242688412E+06,       0.101205061131610448E+06,       0.101242230976538951E+06,       0.101283647903067162E+06,       0.101323242160821901E+06,
+        0.101358087742294330E+06,       0.101385937955843910E+06,       0.101409794381458749E+06,       0.101425117131910592E+06,       0.101429997042675925E+06,
+        0.101424225668113679E+06,       0.101409012607044147E+06,       0.101378645916584719E+06,       0.101341017521829854E+06,       0.101300635121866770E+06,
+        0.101259780015675904E+06,       0.101220490612824302E+06,       0.101183385014229250E+06,       0.101147969487759023E+06,       0.101117685992608021E+06,
+        0.101093539937281050E+06,       0.101076195561657238E+06,       0.101065910310074483E+06,       0.101063435753359998E+06,       0.101067804628520898E+06,
+        0.101076221687106154E+06,       0.101087269872699864E+06,       0.101098388777976448E+06,       0.101105436139853176E+06,       0.101112874451142532E+06,
+        0.101118849015061031E+06,       0.101124113984576659E+06,       0.101128454272832299E+06,       0.101131632912711430E+06,       0.101133440671438293E+06,
+        0.101133742258942963E+06,       0.101133420481460824E+06,       0.101203377126110252E+06,       0.101198268613597073E+06,       0.101192518049139719E+06,
+        0.101186803252296639E+06,       0.101181813758537333E+06,       0.101178421999043727E+06,       0.101175553435103371E+06,       0.101173179030172672E+06,
+        0.101171225754259809E+06,       0.101169580857152410E+06,       0.101168097072006873E+06,       0.101166598871645896E+06,       0.101163936200708034E+06,
+        0.101160319529115644E+06,       0.101156350070871646E+06,       0.101152298957045554E+06,       0.101148469397518347E+06,       0.101145174878879858E+06,
+        0.101142716121090431E+06,       0.101141356671128422E+06,       0.101141393983984628E+06,       0.101143318014807519E+06,       0.101147349641468565E+06,
+        0.101153926105170540E+06,       0.101162646354183598E+06,       0.101173404206242340E+06,       0.101185918183552916E+06,       0.101199863730921250E+06,
+        0.101216872253279580E+06,       0.101233295276471807E+06,       0.101248215030952546E+06,       0.101260757021715341E+06,       0.101267495548934719E+06,
+        0.101269706371902867E+06,       0.101268204478453976E+06,       0.101262805085999877E+06,       0.101255380826612120E+06,       0.101247430865831397E+06,
+        0.101239780825202557E+06,       0.101233090454269026E+06,       0.101227802760140185E+06,       0.101223571816330572E+06,       0.101219066722623626E+06,
+        0.101214540599785731E+06,       0.101210406057645538E+06,       0.101206592274863258E+06,       0.101202981532469319E+06,       0.101199400726594919E+06,
+        0.101195627874287937E+06,       0.101191227720762778E+06,       0.101187565739316706E+06,       0.101185464827996155E+06,       0.101185511851585936E+06,
+        0.101188073018881041E+06,       0.101193228150490002E+06,       0.101201132185450770E+06,       0.101211253103469411E+06,       0.101221691007216708E+06,
+        0.101232930515629778E+06,       0.101244622455395234E+06,       0.101256099137093290E+06,       0.101264336488988658E+06,       0.101270613718010951E+06,
+        0.101275186944850837E+06,       0.101277911712320536E+06,       0.101275720871891084E+06,       0.101272701050287156E+06,       0.101269530015498065E+06,
+        0.101266916775846155E+06,       0.101265667085305176E+06,       0.101266412423480491E+06,       0.101269963618393420E+06,       0.101276824074798991E+06,
+        0.101286538984123661E+06,       0.101297754584716895E+06,       0.101309268788473608E+06,       0.101319049570761636E+06,       0.101326688370924327E+06,
+        0.101331858743319128E+06,       0.101334118663267698E+06,       0.101332850026087355E+06,       0.101327763563889297E+06,       0.101320054486635490E+06,
+        0.101310581963123463E+06,       0.101301464042469088E+06,       0.101296071475081029E+06,       0.101292351628835357E+06,       0.101290169534329834E+06,
+        0.101288302766939916E+06,       0.101284014152439850E+06,       0.101279941996829206E+06,       0.101276061598442378E+06,       0.101271538120976256E+06,
+        0.101266097326113042E+06,       0.101261239127189925E+06,       0.101257245251898741E+06,       0.101253483641709958E+06,       0.101251125639619684E+06,
+        0.101251189762292764E+06,       0.101253695416316186E+06,       0.101260342754598576E+06,       0.101269818597965233E+06,       0.101281786685942599E+06,
+        0.101297267888598697E+06,       0.101315752383087500E+06,       0.101333588295053938E+06,       0.101349152940472399E+06,       0.101363783604825469E+06,
+        0.101372978867465237E+06,       0.101373889912201208E+06,       0.101361962340075130E+06,       0.101329656482126462E+06,       0.101288577681367635E+06,
+        0.101241353955692000E+06,       0.101187015186283301E+06,       0.101128342669573714E+06,       0.101074249019373397E+06,       0.101029162958810339E+06,
+        0.101000523612843142E+06,       0.100987089359594960E+06,       0.100984958621042068E+06,       0.100992130612266148E+06,       0.101008448898443559E+06,
+        0.101030521667859153E+06,       0.101051007866767963E+06,       0.101071664234935859E+06,       0.101090175915114785E+06,       0.101106549855269026E+06,
+        0.101125443846952985E+06,       0.101148128478478480E+06,       0.101176649869573142E+06,       0.101219367480301720E+06,       0.101264169410245595E+06,
+        0.101307902998138612E+06,       0.101345704641115881E+06,       0.101377820901637606E+06,       0.101403851472658702E+06,       0.101419708524997433E+06,
+        0.101423957150136412E+06,       0.101416125366734399E+06,       0.101392821386149662E+06,       0.101354118286926780E+06,       0.101311952791900418E+06,
+        0.101267586958551430E+06,       0.101222923148393995E+06,       0.101179984606825063E+06,       0.101137775123404324E+06,       0.101100052058991307E+06,
+        0.101068211877007227E+06,       0.101043182495123227E+06,       0.101025887119877370E+06,       0.101017441028948917E+06,       0.101018646999727091E+06,
+        0.101025249625575729E+06,       0.101036067916060245E+06,       0.101049702828005305E+06,       0.101064676552964025E+06,       0.101079565938465035E+06,
+        0.101088532594576784E+06,       0.101096312478571519E+06,       0.101102983223382442E+06,       0.101108374984337381E+06,       0.101112280329396730E+06,
+        0.101114507038743657E+06,       0.101114428830065517E+06,       0.101111055246130432E+06,       0.101196406538596522E+06,       0.101190461736979341E+06,
+        0.101184419171533169E+06,       0.101178438759959274E+06,       0.101172694307587532E+06,       0.101168042459568693E+06,       0.101165224780188713E+06,
+        0.101163116738625147E+06,       0.101161640044718297E+06,       0.101160673934197897E+06,       0.101160060130737882E+06,       0.101160308872814785E+06,
+        0.101161160328086728E+06,       0.101159852318196237E+06,       0.101156811572228151E+06,       0.101153532829243355E+06,       0.101150328623015521E+06,
+        0.101147521674777250E+06,       0.101145421670737880E+06,       0.101144300600728122E+06,       0.101144366524547018E+06,       0.101146453358106490E+06,
+        0.101151154760197140E+06,       0.101157852536650826E+06,       0.101166593375939396E+06,       0.101177254193880435E+06,       0.101189538295227583E+06,
+        0.101202976381101937E+06,       0.101217143841964367E+06,       0.101233326011591271E+06,       0.101248211830283530E+06,       0.101258376645531374E+06,
+        0.101264582921753405E+06,       0.101267070734474910E+06,       0.101266001194085227E+06,       0.101261820132445268E+06,       0.101255225790946322E+06,
+        0.101247986960119670E+06,       0.101241132826118715E+06,       0.101235589817356347E+06,       0.101231742691396459E+06,       0.101228190519347510E+06,
+        0.101224868811623688E+06,       0.101221346956982394E+06,       0.101217966212733285E+06,       0.101214970532675288E+06,       0.101212299627427041E+06,
+        0.101209926653408853E+06,       0.101209182347595939E+06,       0.101208894928154026E+06,       0.101206557077161851E+06,       0.101205653829090777E+06,
+        0.101206766501731909E+06,       0.101210234953384323E+06,       0.101216093544594405E+06,       0.101223864474518923E+06,       0.101233270650245788E+06,
+        0.101243919236364745E+06,       0.101255411905531102E+06,       0.101267215651558581E+06,       0.101278589053053409E+06,       0.101288326667672663E+06,
+        0.101293977254483369E+06,       0.101295988963460462E+06,       0.101293942850610052E+06,       0.101290379977981182E+06,       0.101286211796570817E+06,
+        0.101282157951643720E+06,       0.101279101833166642E+06,       0.101277814046354848E+06,       0.101278807487432292E+06,       0.101282938226413549E+06,
+        0.101291273361035273E+06,       0.101301583582921769E+06,       0.101312849202165788E+06,       0.101324002651453309E+06,       0.101333489244781522E+06,
+        0.101339488921891199E+06,       0.101342369325021820E+06,       0.101341720289730991E+06,       0.101337127319298394E+06,       0.101327791615567519E+06,
+        0.101315437423608601E+06,       0.101301282640627105E+06,       0.101286811802460725E+06,       0.101276747879297676E+06,       0.101269331760055575E+06,
+        0.101263643990522745E+06,       0.101258989523824217E+06,       0.101251456119543334E+06,       0.101244182196566340E+06,       0.101237348106484831E+06,
+        0.101228692607444944E+06,       0.101218585751885927E+06,       0.101210928314959441E+06,       0.101206232353375613E+06,       0.101203871455940549E+06,
+        0.101203999533384937E+06,       0.101207475042430247E+06,       0.101214320092416674E+06,       0.101224147807091678E+06,       0.101236699974733609E+06,
+        0.101251676274940794E+06,       0.101270825632959895E+06,       0.101293545270099348E+06,       0.101314419599624249E+06,       0.101330994497954525E+06,
+        0.101343242305169362E+06,       0.101347429834497641E+06,       0.101341255518135789E+06,       0.101319524205864262E+06,       0.101278200143226626E+06,
+        0.101228562906559484E+06,       0.101174212317573372E+06,       0.101112623030610339E+06,       0.101048222350508891E+06,       0.100990099190183420E+06,
+        0.100943211786408705E+06,       0.100918044317067266E+06,       0.100907611661432689E+06,       0.100910107183064712E+06,       0.100923917070401818E+06,
+        0.100948850301936414E+06,       0.100978281786140433E+06,       0.101008728042257979E+06,       0.101037658211344344E+06,       0.101057364399701371E+06,
+        0.101074391235513976E+06,       0.101093594285308805E+06,       0.101116488413099345E+06,       0.101150558690399863E+06,       0.101193914933389984E+06,
+        0.101239758121016799E+06,       0.101285323747319708E+06,       0.101327925492475028E+06,       0.101365565138565944E+06,       0.101392573640838629E+06,
+        0.101408539383438299E+06,       0.101411604282492801E+06,       0.101400582930128410E+06,       0.101366946069406418E+06,       0.101324287192622069E+06,
+        0.101276101666633986E+06,       0.101226619258282910E+06,       0.101178585432356136E+06,       0.101130984262627506E+06,       0.101086307783769356E+06,
+        0.101046851053375387E+06,       0.101014063196888950E+06,       0.100988908271188513E+06,       0.100971785835137707E+06,       0.100968245753203373E+06,
+        0.100971380696101813E+06,       0.100980060807918417E+06,       0.100993169646215858E+06,       0.101009312468744305E+06,       0.101026966655764860E+06,
+        0.101044366184895640E+06,       0.101060339563627815E+06,       0.101071158866529076E+06,       0.101079488812984200E+06,       0.101086153913575283E+06,
+        0.101090971172654899E+06,       0.101093525999388585E+06,       0.101092846852564820E+06,       0.101089780957355411E+06,       0.101191123249149765E+06,
+        0.101184975896710632E+06,       0.101178781171733193E+06,       0.101172687284701038E+06,       0.101166856628363908E+06,       0.101161463025241668E+06,
+        0.101157556719236236E+06,       0.101155715658911155E+06,       0.101154729896713383E+06,       0.101154469238441612E+06,       0.101155775624535832E+06,
+        0.101158121462038107E+06,       0.101160042093184384E+06,       0.101161344855236384E+06,       0.101160448275110015E+06,       0.101158071590188309E+06,
+        0.101155631532086059E+06,       0.101153465356088433E+06,       0.101151897289994900E+06,       0.101151213659422618E+06,       0.101151737576582789E+06,
+        0.101154199170773107E+06,       0.101158985005759008E+06,       0.101165841396522868E+06,       0.101174673234837159E+06,       0.101185340894024586E+06,
+        0.101197532040988634E+06,       0.101210762902995120E+06,       0.101224385238204501E+06,       0.101237894404589199E+06,       0.101250772227856185E+06,
+        0.101260411029266310E+06,       0.101266591706174368E+06,       0.101269204187456722E+06,       0.101268397182717250E+06,       0.101264588122030676E+06,
+        0.101258438511883942E+06,       0.101251623403392019E+06,       0.101246063118456994E+06,       0.101242417800723517E+06,       0.101239166549985050E+06,
+        0.101236254306650939E+06,       0.101233631773944420E+06,       0.101231248894982156E+06,       0.101228825720597553E+06,       0.101226772928204024E+06,
+        0.101225473798737570E+06,       0.101225516278296083E+06,       0.101226043519455008E+06,       0.101227093486833808E+06,       0.101228289760449348E+06,
+        0.101228546951147655E+06,       0.101230707510254171E+06,       0.101235093253586310E+06,       0.101241126677553519E+06,       0.101248645598633651E+06,
+        0.101258142018320970E+06,       0.101268933306888299E+06,       0.101280513500391826E+06,       0.101292262732881034E+06,       0.101303355465601169E+06,
+        0.101312817264586003E+06,       0.101316400177874268E+06,       0.101315483458758521E+06,       0.101312277984593762E+06,       0.101307698621808959E+06,
+        0.101302673951913355E+06,       0.101298053010945936E+06,       0.101294840530663249E+06,       0.101294065839099727E+06,       0.101296783533959431E+06,
+        0.101302065639223511E+06,       0.101310033568624291E+06,       0.101320378178744606E+06,       0.101331366932783130E+06,       0.101341800425977897E+06,
+        0.101350415611308272E+06,       0.101354800042096002E+06,       0.101354718500839095E+06,       0.101350294315183972E+06,       0.101341487001001398E+06,
+        0.101327926160731338E+06,       0.101310260858651716E+06,       0.101290273767883307E+06,       0.101269495556410489E+06,       0.101251846238950835E+06,
+        0.101238682635122401E+06,       0.101227174341821534E+06,       0.101213482647208613E+06,       0.101195603009729079E+06,       0.101177872156641286E+06,
+        0.101162325618075352E+06,       0.101149982165601716E+06,       0.101139852149278217E+06,       0.101134024565056650E+06,       0.101132753824598782E+06,
+        0.101135032680571021E+06,       0.101140084766430024E+06,       0.101148877574289698E+06,       0.101161005262514984E+06,       0.101174747769146576E+06,
+        0.101190713232751208E+06,       0.101208811802622309E+06,       0.101231640660711972E+06,       0.101258571723189729E+06,       0.101282336017681446E+06,
+        0.101299629439163051E+06,       0.101308040998087759E+06,       0.101305555171365690E+06,       0.101290435343250807E+06,       0.101256519799893256E+06,
+        0.101204322883293091E+06,       0.101144321216045384E+06,       0.101080811870748948E+06,       0.101014238668434729E+06,       0.100950513534181708E+06,
+        0.100894391363170798E+06,       0.100851829575523923E+06,       0.100832142921501421E+06,       0.100825615789308096E+06,       0.100832955840479583E+06,
+        0.100854821405899405E+06,       0.100888239967709887E+06,       0.100925422763286362E+06,       0.100962602314510819E+06,       0.100994687767612981E+06,
+        0.101018445383155631E+06,       0.101039638130810010E+06,       0.101060824122542370E+06,       0.101084945514884181E+06,       0.101122354145820311E+06,
+        0.101165147778325379E+06,       0.101210847657910417E+06,       0.101256682236652778E+06,       0.101301382158490291E+06,       0.101341411155713809E+06,
+        0.101372219111328362E+06,       0.101389231784620119E+06,       0.101390880863434664E+06,       0.101369226261351185E+06,       0.101331834231281726E+06,
+        0.101285779545129859E+06,       0.101234345503529141E+06,       0.101180743690781746E+06,       0.101127223607977256E+06,       0.101076620915575957E+06,
+        0.101030138146362922E+06,       0.100989582250385356E+06,       0.100956503181212684E+06,       0.100931937764084651E+06,       0.100920299784557195E+06,
+        0.100918057371207338E+06,       0.100922770743209869E+06,       0.100933261994784887E+06,       0.100948483778151451E+06,       0.100967026543898348E+06,
+        0.100987282070977919E+06,       0.101007276882737569E+06,       0.101025807002176851E+06,       0.101042092544874176E+06,       0.101053732614110791E+06,
+        0.101061889868345606E+06,       0.101067702910314212E+06,       0.101070224192290465E+06,       0.101070263142884942E+06,       0.101067836061994312E+06,
+        0.101188101877120876E+06,       0.101181904204517952E+06,       0.101175721080675750E+06,       0.101169689701016847E+06,       0.101163962332899173E+06,
+        0.101158703372389791E+06,       0.101154083105507743E+06,       0.101151357736191479E+06,       0.101150899044327409E+06,       0.101152824487497259E+06,
+        0.101156224838871945E+06,       0.101159507416219887E+06,       0.101162417168140935E+06,       0.101164756494849746E+06,       0.101166400553546104E+06,
+        0.101165982684454619E+06,       0.101164433293333408E+06,       0.101163049411835455E+06,       0.101162175585306977E+06,       0.101162128095756125E+06,
+        0.101163361425100273E+06,       0.101166227742201969E+06,       0.101170937924715152E+06,       0.101177913034471421E+06,       0.101186917319165936E+06,
+        0.101197704545258457E+06,       0.101209946031686050E+06,       0.101223141837685776E+06,       0.101236628019135329E+06,       0.101248564959035430E+06,
+        0.101259061289307880E+06,       0.101268404236147617E+06,       0.101274449875235630E+06,       0.101277082514349167E+06,       0.101276437786749404E+06,
+        0.101272910152209646E+06,       0.101267124457491314E+06,       0.101260716984134080E+06,       0.101256743164844607E+06,       0.101253604663335806E+06,
+        0.101250897345323741E+06,       0.101248591593381454E+06,       0.101246654559015689E+06,       0.101245041613427515E+06,       0.101243680788220503E+06,
+        0.101243097273199470E+06,       0.101243781512439353E+06,       0.101244948599458978E+06,       0.101246597302939059E+06,       0.101248747416430124E+06,
+        0.101251423906546814E+06,       0.101254153427662954E+06,       0.101257318705204321E+06,       0.101261887373189515E+06,       0.101267979989058746E+06,
+        0.101275948774720324E+06,       0.101285713213097159E+06,       0.101296774828760288E+06,       0.101308302668075557E+06,       0.101319850467473152E+06,
+        0.101329837083710619E+06,       0.101335921303205963E+06,       0.101339123113933456E+06,       0.101337898637374194E+06,       0.101333773323031986E+06,
+        0.101328456667992868E+06,       0.101322897112772887E+06,       0.101317900606162963E+06,       0.101315889108461066E+06,       0.101316599306327043E+06,
+        0.101319758730558635E+06,       0.101325424301052059E+06,       0.101333284991047447E+06,       0.101343211873693581E+06,       0.101353644944564134E+06,
+        0.101363021317380320E+06,       0.101370049287251401E+06,       0.101372596455484265E+06,       0.101369268865042672E+06,       0.101360883616870342E+06,
+        0.101347449435595729E+06,       0.101329133164082014E+06,       0.101305327141900649E+06,       0.101278380398203022E+06,       0.101249743471045615E+06,
+        0.101219239546209603E+06,       0.101192352888002861E+06,       0.101165652475197479E+06,       0.101139697586887822E+06,       0.101114494511137265E+06,
+        0.101090858686180072E+06,       0.101071576294283674E+06,       0.101057575297732197E+06,       0.101048074783742806E+06,       0.101044336258060692E+06,
+        0.101046551193469917E+06,       0.101053556962642004E+06,       0.101063713831673056E+06,       0.101077829626709223E+06,       0.101095071852015652E+06,
+        0.101113125151151267E+06,       0.101132720710483336E+06,       0.101154045391176667E+06,       0.101180390285880436E+06,       0.101211142948122884E+06,
+        0.101237614514436951E+06,       0.101255726302408526E+06,       0.101259492448119025E+06,       0.101250509056824711E+06,       0.101227395084634161E+06,
+        0.101182035261948520E+06,       0.101119630114631931E+06,       0.101050635848782738E+06,       0.100979922793482459E+06,       0.100910697623495973E+06,
+        0.100847357213499476E+06,       0.100794166368117731E+06,       0.100758894445481623E+06,       0.100744322296544080E+06,       0.100745120848886974E+06,
+        0.100759352059448109E+06,       0.100791294801023934E+06,       0.100833112039419531E+06,       0.100877562571698305E+06,       0.100920779246866339E+06,
+        0.100955025798225848E+06,       0.100982525754081420E+06,       0.101006044587505748E+06,       0.101028143007870822E+06,       0.101055611280174300E+06,
+        0.101091320427340703E+06,       0.101132355621430252E+06,       0.101176767088174020E+06,       0.101222102616479577E+06,       0.101267504098879013E+06,
+        0.101307233300950669E+06,       0.101337730007502250E+06,       0.101356132691262712E+06,       0.101355517504656993E+06,       0.101326703347885734E+06,
+        0.101286746249401243E+06,       0.101238373176205030E+06,       0.101184685036191077E+06,       0.101128907484998796E+06,       0.101073391747240559E+06,
+        0.101019454525129811E+06,       0.100970871910515343E+06,       0.100929826661987419E+06,       0.100897105571455861E+06,       0.100876831879007659E+06,
+        0.100867962906273533E+06,       0.100867330421829305E+06,       0.100873728684090966E+06,       0.100885749735442761E+06,       0.100902849954122852E+06,
+        0.100924138951177738E+06,       0.100946961851234868E+06,       0.100969279025770302E+06,       0.100990033557581031E+06,       0.101008477654044342E+06,
+        0.101024214908302165E+06,       0.101035732998499894E+06,       0.101041912961714450E+06,       0.101045642366251923E+06,       0.101046792406885972E+06,
+        0.101045365333532347E+06,       0.101187355100872199E+06,       0.101181283838042174E+06,       0.101175299671037268E+06,       0.101169529662610788E+06,
+        0.101164117431673949E+06,       0.101159220075809775E+06,       0.101155001817589582E+06,       0.101151624022777440E+06,       0.101152497595067340E+06,
+        0.101156451659840226E+06,       0.101160648061411019E+06,       0.101164790528929152E+06,       0.101168618147906396E+06,       0.101171926049179310E+06,
+        0.101174580360364256E+06,       0.101176526712674633E+06,       0.101176736224529814E+06,       0.101176257363116325E+06,       0.101176166983752380E+06,
+        0.101176807287626842E+06,       0.101178681128324213E+06,       0.101182078251181316E+06,       0.101187204570596310E+06,       0.101194163269585537E+06,
+        0.101203334524264646E+06,       0.101214364937736551E+06,       0.101226809413448165E+06,       0.101240149829298927E+06,       0.101253261358725853E+06,
+        0.101265100089497806E+06,       0.101275120974395875E+06,       0.101282996940042518E+06,       0.101288828111014154E+06,       0.101291420149586207E+06,
+        0.101290897222999163E+06,       0.101287639377078289E+06,       0.101283002528089506E+06,       0.101278193857728707E+06,       0.101273020512430914E+06,
+        0.101269901051284018E+06,       0.101267678623295869E+06,       0.101265950449211479E+06,       0.101264703039611326E+06,       0.101263900879826906E+06,
+        0.101263923607509249E+06,       0.101265004562038375E+06,       0.101266684912193334E+06,       0.101268855296950496E+06,       0.101271506964180182E+06,
+        0.101274640173084292E+06,       0.101278241537383161E+06,       0.101282245825992912E+06,       0.101286353240369135E+06,       0.101291355828485597E+06,
+        0.101297931619035255E+06,       0.101306253371424813E+06,       0.101316214078965480E+06,       0.101327380285913983E+06,       0.101338920669929619E+06,
+        0.101349293450103680E+06,       0.101357122930671496E+06,       0.101362252520088790E+06,       0.101364464771970830E+06,       0.101363785192026829E+06,
+        0.101359089181177871E+06,       0.101353368594169064E+06,       0.101348059285105599E+06,       0.101344504609358351E+06,       0.101342802273270747E+06,
+        0.101343694674300015E+06,       0.101347186594235303E+06,       0.101353156284255645E+06,       0.101361135003142495E+06,       0.101370388484892959E+06,
+        0.101380640458787442E+06,       0.101388946718752617E+06,       0.101393651801589484E+06,       0.101393499019751704E+06,       0.101386884558896083E+06,
+        0.101374143979384535E+06,       0.101355609362859250E+06,       0.101331626780358332E+06,       0.101301083582183201E+06,       0.101263353354839783E+06,
+        0.101221306897352624E+06,       0.101176993466944725E+06,       0.101136539903244993E+06,       0.101098204242251013E+06,       0.101061761330862719E+06,
+        0.101028266665796909E+06,       0.100998589290583972E+06,       0.100975333400938267E+06,       0.100959068131358043E+06,       0.100949766177223195E+06,
+        0.100947806353674678E+06,       0.100952626346498961E+06,       0.100962758032929953E+06,       0.100976213788639361E+06,       0.100993663080123253E+06,
+        0.101014486892675981E+06,       0.101035822837299012E+06,       0.101058579399157214E+06,       0.101083303211150094E+06,       0.101113186489526008E+06,
+        0.101147351565124962E+06,       0.101176652682216401E+06,       0.101196193972918787E+06,       0.101198569776344622E+06,       0.101186160134931008E+06,
+        0.101157868126258880E+06,       0.101103141394806822E+06,       0.101031831614193070E+06,       0.100956733996206865E+06,       0.100882403087983286E+06,
+        0.100813473138545116E+06,       0.100752516407046714E+06,       0.100703757785565627E+06,       0.100676218536944187E+06,       0.100667431274046598E+06,
+        0.100674873519601999E+06,       0.100697658618489222E+06,       0.100739841159568794E+06,       0.100789068474863947E+06,       0.100839720710070338E+06,
+        0.100886379550526690E+06,       0.100923029883014446E+06,       0.100953143284320337E+06,       0.100977639241319004E+06,       0.100999128395021136E+06,
+        0.101024581691416737E+06,       0.101055845921262473E+06,       0.101093715024692676E+06,       0.101137145750038864E+06,       0.101181709309337297E+06,
+        0.101225325474523444E+06,       0.101263559713032722E+06,       0.101292474677031365E+06,       0.101308682549641118E+06,       0.101297475120822361E+06,
+        0.101271409211849808E+06,       0.101232040601299872E+06,       0.101182869285470704E+06,       0.101128290980360704E+06,       0.101072929755581790E+06,
+        0.101016889073163620E+06,       0.100962491541966170E+06,       0.100912327910715336E+06,       0.100869361400221751E+06,       0.100839775977090918E+06,
+        0.100823441492130820E+06,       0.100816113342184137E+06,       0.100817094874734074E+06,       0.100825233759279654E+06,       0.100839074432490510E+06,
+        0.100858082771811969E+06,       0.100882174552001874E+06,       0.100906977487573211E+06,       0.100931151837540980E+06,       0.100953671595204651E+06,
+        0.100973813441941427E+06,       0.100991208365737388E+06,       0.101004593996319396E+06,       0.101014464426847393E+06,       0.101019840305871679E+06,
+        0.101022516216040211E+06,       0.101022479820383916E+06,       0.101189306237606637E+06,       0.101183099563423224E+06,       0.101177524645541649E+06,
+        0.101172236435105573E+06,       0.101167371532973528E+06,       0.101163082020276575E+06,       0.101159529060147339E+06,       0.101159316447558173E+06,
+        0.101160894564677219E+06,       0.101164348300187223E+06,       0.101169261422140553E+06,       0.101174195290734366E+06,       0.101178879818970003E+06,
+        0.101183100812083387E+06,       0.101186714675334646E+06,       0.101189656703835382E+06,       0.101191942124414170E+06,       0.101192917377320977E+06,
+        0.101193593575982464E+06,       0.101195069630171711E+06,       0.101197693383898673E+06,       0.101201751769885639E+06,       0.101207449602623747E+06,
+        0.101214890679059696E+06,       0.101224061589853489E+06,       0.101235336912347877E+06,       0.101248190104239126E+06,       0.101262427935202722E+06,
+        0.101275786221996692E+06,       0.101287697523967043E+06,       0.101297635973110140E+06,       0.101305160473319178E+06,       0.101310051693956630E+06,
+        0.101312576731523863E+06,       0.101312178530984005E+06,       0.101309704462442271E+06,       0.101306154021924303E+06,       0.101301740366064056E+06,
+        0.101296951709652378E+06,       0.101292269396465854E+06,       0.101290108113855764E+06,       0.101288928548419208E+06,       0.101288387917089291E+06,
+        0.101288777866387623E+06,       0.101290116771842790E+06,       0.101292139767421628E+06,       0.101294723268304471E+06,       0.101297795211849851E+06,
+        0.101301366709605994E+06,       0.101305420330384557E+06,       0.101309869927812077E+06,       0.101314312823006214E+06,       0.101319116997910372E+06,
+        0.101324617109151222E+06,       0.101331532615370001E+06,       0.101340103637168490E+06,       0.101350201834497682E+06,       0.101361344371531173E+06,
+        0.101372418886796950E+06,       0.101381948875157381E+06,       0.101388923839096911E+06,       0.101393136106285616E+06,       0.101394429864949576E+06,
+        0.101392894622174237E+06,       0.101388710803148075E+06,       0.101383777236252092E+06,       0.101379295952832908E+06,       0.101375940276367168E+06,
+        0.101374441230547527E+06,       0.101375326622697306E+06,       0.101379093018278771E+06,       0.101385343361571824E+06,       0.101393971058482173E+06,
+        0.101404050563811383E+06,       0.101413309721598285E+06,       0.101419590399406094E+06,       0.101421556394179410E+06,       0.101418021431235960E+06,
+        0.101407974515161055E+06,       0.101390537479077990E+06,       0.101366032709315157E+06,       0.101334626683717870E+06,       0.101295933958054040E+06,
+        0.101248443893183838E+06,       0.101195557967522065E+06,       0.101139585544601810E+06,       0.101085211343045346E+06,       0.101035266930195139E+06,
+        0.100988241812145512E+06,       0.100945367896748721E+06,       0.100910497202633036E+06,       0.100884702886764164E+06,       0.100866517649476897E+06,
+        0.100856014684083144E+06,       0.100852787000617667E+06,       0.100856653557479323E+06,       0.100867163372326730E+06,       0.100881111266454434E+06,
+        0.100900315195405696E+06,       0.100923976750114074E+06,       0.100948598119614544E+06,       0.100974781704195004E+06,       0.101003202157587060E+06,
+        0.101036407590628412E+06,       0.101073193182310031E+06,       0.101104736474453239E+06,       0.101125695287679831E+06,       0.101129453279073452E+06,
+        0.101117773581594010E+06,       0.101089185532541305E+06,       0.101034032199054171E+06,       0.100963945545633382E+06,       0.100886699328991119E+06,
+        0.100810636627241329E+06,       0.100740715610179395E+06,       0.100679191246166200E+06,       0.100632989251138570E+06,       0.100613781871159343E+06,
+        0.100610871530594683E+06,       0.100624379990977119E+06,       0.100656925116010229E+06,       0.100705935141557828E+06,       0.100761070879974053E+06,
+        0.100816622699684551E+06,       0.100864793595773081E+06,       0.100902967646118850E+06,       0.100932714749620762E+06,       0.100956310150092322E+06,
+        0.100973624358999965E+06,       0.100992241483773090E+06,       0.101016637765204548E+06,       0.101048154107647293E+06,       0.101087466334016062E+06,
+        0.101132339254048915E+06,       0.101174823812832328E+06,       0.101210761915469266E+06,       0.101237271423401384E+06,       0.101243002885737078E+06,
+        0.101230131791106003E+06,       0.101203940299668466E+06,       0.101166656487591579E+06,       0.101121119041289232E+06,       0.101069073832594047E+06,
+        0.101014700223724387E+06,       0.100959265268248433E+06,       0.100905468112225586E+06,       0.100856040902612105E+06,       0.100814460428244129E+06,
+        0.100787259237540056E+06,       0.100772005863003345E+06,       0.100765985352267919E+06,       0.100768479113289053E+06,       0.100778366997407138E+06,
+        0.100794945598743492E+06,       0.100817620478677374E+06,       0.100842147859125718E+06,       0.100867955315801722E+06,       0.100893394586128459E+06,
+        0.100917107047287223E+06,       0.100938380004807230E+06,       0.100955347801049342E+06,       0.100970101009214006E+06,       0.100982904354844184E+06,
+        0.100992784717252944E+06,       0.100997426697573173E+06,       0.100999203666720758E+06,       0.101193726602745155E+06,       0.101187754050723946E+06,
+        0.101182357442443288E+06,       0.101177791388126643E+06,       0.101173723996436573E+06,       0.101170304719806183E+06,       0.101170612153776412E+06,
+        0.101172440371721386E+06,       0.101174837075875621E+06,       0.101177672254314428E+06,       0.101182161160034389E+06,       0.101187828651191783E+06,
+        0.101193320301503438E+06,       0.101198410730358519E+06,       0.101202946144533795E+06,       0.101206852558810875E+06,       0.101210007801575470E+06,
+        0.101212489910168282E+06,       0.101214469378389869E+06,       0.101216878002924321E+06,       0.101220363461237575E+06,       0.101225214136769951E+06,
+        0.101231637580600829E+06,       0.101239741560505950E+06,       0.101249517808410572E+06,       0.101260983023677167E+06,       0.101275957870551239E+06,
+        0.101290656294668952E+06,       0.101304333702323362E+06,       0.101316427532517599E+06,       0.101326426428850100E+06,       0.101333915035895625E+06,
+        0.101338611708287717E+06,       0.101340492859798338E+06,       0.101340362563395611E+06,       0.101338449476013702E+06,       0.101335257523435517E+06,
+        0.101331249861504504E+06,       0.101326886093198918E+06,       0.101322617484757109E+06,       0.101318867500197564E+06,       0.101317900452591755E+06,
+        0.101318314786954928E+06,       0.101319723768116164E+06,       0.101321959881412520E+06,       0.101324889048512938E+06,       0.101328347647524672E+06,
+        0.101332174840765205E+06,       0.101336616060312401E+06,       0.101341556829236884E+06,       0.101346573413864826E+06,       0.101351603295543347E+06,
+        0.101356815104860521E+06,       0.101362438373961399E+06,       0.101369371088361426E+06,       0.101378082295762331E+06,       0.101388314410706720E+06,
+        0.101399372327800622E+06,       0.101410061836120745E+06,       0.101419580351030396E+06,       0.101425913537260407E+06,       0.101429293259021812E+06,
+        0.101429804412116951E+06,       0.101427672924137820E+06,       0.101424080437455879E+06,       0.101419619212416699E+06,       0.101415230974183942E+06,
+        0.101412067965185430E+06,       0.101410791086110883E+06,       0.101411739073867124E+06,       0.101415639705951602E+06,       0.101423312622668134E+06,
+        0.101432474045874798E+06,       0.101442051195699867E+06,       0.101450469188552204E+06,       0.101454491373749755E+06,       0.101453440137517347E+06,
+        0.101446281387837167E+06,       0.101431595048405667E+06,       0.101408886711617088E+06,       0.101378784184722594E+06,       0.101341184770978914E+06,
+        0.101295889547724786E+06,       0.101240328400627433E+06,       0.101177652284460986E+06,       0.101111150684114546E+06,       0.101044053118300144E+06,
+        0.100984918740243505E+06,       0.100930374090685815E+06,       0.100881582472409573E+06,       0.100841112633375247E+06,       0.100809768362702191E+06,
+        0.100786799243457121E+06,       0.100772143085301912E+06,       0.100764968278141983E+06,       0.100765770745809103E+06,       0.100774102380776618E+06,
+        0.100787701814049200E+06,       0.100807502103195773E+06,       0.100832717694658859E+06,       0.100860249536352872E+06,       0.100889852423407749E+06,
+        0.100921848628126099E+06,       0.100957861355781963E+06,       0.100996433916241411E+06,       0.101029829562515966E+06,       0.101052485930506547E+06,
+        0.101058372937639273E+06,       0.101049548410078569E+06,       0.101024243456762211E+06,       0.100972590760278690E+06,       0.100908281417167527E+06,
+        0.100837060983074800E+06,       0.100768161325613342E+06,       0.100704714640766149E+06,       0.100649980401007386E+06,       0.100610226186345069E+06,
+        0.100590748020045430E+06,       0.100587436259410169E+06,       0.100600313080586799E+06,       0.100641206195168561E+06,       0.100694783185600594E+06,
+        0.100753395339411843E+06,       0.100811221255729251E+06,       0.100860359364136690E+06,       0.100899824043495319E+06,       0.100928315410134717E+06,
+        0.100945425133485944E+06,       0.100949685705930868E+06,       0.100959203677864440E+06,       0.100974757114044391E+06,       0.100998131833821230E+06,
+        0.101033920715517670E+06,       0.101074219109624129E+06,       0.101114091820176982E+06,       0.101149405994865883E+06,       0.101170348641579942E+06,
+        0.101169807298637141E+06,       0.101156298476682292E+06,       0.101130628971099330E+06,       0.101094643437300154E+06,       0.101052492078486888E+06,
+        0.101007253119503090E+06,       0.100955907017813224E+06,       0.100902084595712833E+06,       0.100849827379669470E+06,       0.100802083544595851E+06,
+        0.100765913220995702E+06,       0.100739572869835451E+06,       0.100723779479156976E+06,       0.100718506421119528E+06,       0.100722320980193326E+06,
+        0.100734436110120514E+06,       0.100755329206052033E+06,       0.100779519272158068E+06,       0.100805173540144926E+06,       0.100830784490592530E+06,
+        0.100856189170746162E+06,       0.100880432886013805E+06,       0.100899949784039432E+06,       0.100917438620547167E+06,       0.100933522862752710E+06,
+        0.100948109352301544E+06,       0.100961044329522949E+06,       0.100971373211325132E+06,       0.100975423948777170E+06,       0.101200152192834488E+06,
+        0.101194982325493736E+06,       0.101190103263664205E+06,       0.101186138559247396E+06,       0.101183134221834189E+06,       0.101184216681154692E+06,
+        0.101186521041798725E+06,       0.101189436060083317E+06,       0.101192802546943451E+06,       0.101196478796712297E+06,       0.101200354354545649E+06,
+        0.101205668611732151E+06,       0.101211929159398627E+06,       0.101217855930562437E+06,       0.101223284560094209E+06,       0.101227968215825720E+06,
+        0.101231889676374194E+06,       0.101235394681567603E+06,       0.101238691342655846E+06,       0.101242180145337508E+06,       0.101246637252434826E+06,
+        0.101252408136256170E+06,       0.101259706939182157E+06,       0.101268648761024378E+06,       0.101279505402642011E+06,       0.101294343975882977E+06,
+        0.101309563533686218E+06,       0.101324641711895500E+06,       0.101338688391072021E+06,       0.101351044389960793E+06,       0.101361207159967045E+06,
+        0.101368783445243811E+06,       0.101373529077171552E+06,       0.101374957490127519E+06,       0.101374464042535998E+06,       0.101372814207710297E+06,
+        0.101369991240096075E+06,       0.101366429702577938E+06,       0.101362562430391059E+06,       0.101358815668015828E+06,       0.101355589086463762E+06,
+        0.101353446673457220E+06,       0.101354379072032898E+06,       0.101356568662050558E+06,       0.101359675232751892E+06,       0.101363521918530183E+06,
+        0.101367901119934351E+06,       0.101372596354978567E+06,       0.101377679630817802E+06,       0.101383555064504282E+06,       0.101389214201889146E+06,
+        0.101394747283543154E+06,       0.101400304955646759E+06,       0.101406085277459220E+06,       0.101412285840230092E+06,       0.101421118963008921E+06,
+        0.101431763041225102E+06,       0.101442507714153820E+06,       0.101452705296310087E+06,       0.101461587946274274E+06,       0.101468308697248838E+06,
+        0.101470980618346424E+06,       0.101470729759961876E+06,       0.101468260238464049E+06,       0.101464485269084631E+06,       0.101460142280246233E+06,
+        0.101455922507406227E+06,       0.101452998879112638E+06,       0.101452045655453316E+06,       0.101454002525278673E+06,       0.101458795222069632E+06,
+        0.101466167386261062E+06,       0.101474834484365027E+06,       0.101483448321051124E+06,       0.101490293297485317E+06,       0.101492761571887779E+06,
+        0.101487122913431667E+06,       0.101474656695076628E+06,       0.101456224507296021E+06,       0.101430664509854570E+06,       0.101396241168372988E+06,
+        0.101353344458271313E+06,       0.101301873429881321E+06,       0.101240809982906721E+06,       0.101170237649192510E+06,       0.101096056635001150E+06,
+        0.101022326149495057E+06,       0.100954494264510751E+06,       0.100892663983306251E+06,       0.100837194485465618E+06,       0.100789854158125687E+06,
+        0.100752681688232609E+06,       0.100724050472389747E+06,       0.100703743253736306E+06,       0.100691513151292049E+06,       0.100687489061012806E+06,
+        0.100691112445670500E+06,       0.100703488782601926E+06,       0.100723515984008409E+06,       0.100749686437924174E+06,       0.100779862035053753E+06,
+        0.100812870466228749E+06,       0.100848356219152789E+06,       0.100886618033728999E+06,       0.100925814700154908E+06,       0.100959913340029161E+06,
+        0.100983841408427761E+06,       0.100992708938197888E+06,       0.100988038726636543E+06,       0.100967451749821237E+06,       0.100923773661071609E+06,
+        0.100869154347678006E+06,       0.100808293671752166E+06,       0.100749950128448239E+06,       0.100695742144580625E+06,       0.100650055466795442E+06,
+        0.100620543751264457E+06,       0.100607774629359716E+06,       0.100609856499218455E+06,       0.100627731512123690E+06,       0.100665827330432643E+06,
+        0.100713727303578300E+06,       0.100768972922192886E+06,       0.100825101449405265E+06,       0.100873709631678183E+06,       0.100911910907812446E+06,
+        0.100937425920985901E+06,       0.100943826278808614E+06,       0.100938923612846338E+06,       0.100932772703382885E+06,       0.100933209681834254E+06,
+        0.100949942917228545E+06,       0.100978390439217677E+06,       0.101012218238497939E+06,       0.101047001443362271E+06,       0.101078030320958118E+06,
+        0.101092528178749781E+06,       0.101092763600199483E+06,       0.101079667768304178E+06,       0.101055363093306296E+06,       0.101021923023798488E+06,
+        0.100985043918944197E+06,       0.100942576674115116E+06,       0.100896142310934607E+06,       0.100846740359288175E+06,       0.100796745756417309E+06,
+        0.100754281013923188E+06,       0.100719661969801513E+06,       0.100694202095497239E+06,       0.100678990016565542E+06,       0.100674159552381345E+06,
+        0.100679144362130333E+06,       0.100696517057853678E+06,       0.100718723297862292E+06,       0.100743828966135392E+06,       0.100770038155539907E+06,
+        0.100795879753092362E+06,       0.100820314666932885E+06,       0.100840279171251284E+06,       0.100859249879902098E+06,       0.100877455365052447E+06,
+        0.100894767625869688E+06,       0.100911051050858092E+06,       0.100926113687447752E+06,       0.100939677540915931E+06,       0.100954098051095163E+06,
+        0.101208266074669766E+06,       0.101204147301312958E+06,       0.101200416332034234E+06,       0.101197391022381067E+06,       0.101199181271863577E+06,
+        0.101202094479608772E+06,       0.101205718922681015E+06,       0.101209868079757638E+06,       0.101214363087133126E+06,       0.101219049217859545E+06,
+        0.101223809934456556E+06,       0.101228578149758148E+06,       0.101234563424877633E+06,       0.101241302361129114E+06,       0.101247428820028508E+06,
+        0.101252833705618847E+06,       0.101257741214607289E+06,       0.101262268791874914E+06,       0.101266621965163562E+06,       0.101271104202253337E+06,
+        0.101276449761759577E+06,       0.101283261996570189E+06,       0.101291578552841063E+06,       0.101301921001578070E+06,       0.101316864610287244E+06,
+        0.101332633397110185E+06,       0.101348565409528048E+06,       0.101363970375545556E+06,       0.101378339950166031E+06,       0.101391005184961628E+06,
+        0.101401390238182328E+06,       0.101409118811233842E+06,       0.101412813852507519E+06,       0.101413916622343488E+06,       0.101413648249779086E+06,
+        0.101412262363096830E+06,       0.101409843816287481E+06,       0.101406792118611833E+06,       0.101403515263375913E+06,       0.101400419883465394E+06,
+        0.101397648089374270E+06,       0.101396200071828469E+06,       0.101396462464251483E+06,       0.101399249041504649E+06,       0.101403242459244415E+06,
+        0.101408064521844237E+06,       0.101413460579763079E+06,       0.101419299541355576E+06,       0.101425515902185769E+06,       0.101431872156549493E+06,
+        0.101438092345517420E+06,       0.101444082593329236E+06,       0.101449980221889302E+06,       0.101455962961780679E+06,       0.101462741205452243E+06,
+        0.101470817291088752E+06,       0.101480892587434573E+06,       0.101491089133211004E+06,       0.101500643428374140E+06,       0.101508817670985038E+06,
+        0.101514860224122342E+06,       0.101517434476198061E+06,       0.101516541747761323E+06,       0.101513815068472235E+06,       0.101509904719619197E+06,
+        0.101505507654049128E+06,       0.101501313463842132E+06,       0.101498849002981064E+06,       0.101499159934514231E+06,       0.101501693020130377E+06,
+        0.101506338552975649E+06,       0.101512651659291208E+06,       0.101520288072555239E+06,       0.101527432009874057E+06,       0.101531192551327069E+06,
+        0.101528423709889583E+06,       0.101519435532333911E+06,       0.101504734513441072E+06,       0.101484004484384001E+06,       0.101456280732745858E+06,
+        0.101419035179553714E+06,       0.101371837096264266E+06,       0.101315248944149382E+06,       0.101249891741609565E+06,       0.101174205010685138E+06,
+        0.101095025216710172E+06,       0.101016603839094241E+06,       0.100942714517862012E+06,       0.100875651961458614E+06,       0.100815206600637175E+06,
+        0.100762266129504540E+06,       0.100719792923412402E+06,       0.100688381242510412E+06,       0.100664315202569429E+06,       0.100646899315571907E+06,
+        0.100636389190856382E+06,       0.100633921317728295E+06,       0.100640986745192960E+06,       0.100657927960284273E+06,       0.100683603999329847E+06,
+        0.100715139361547874E+06,       0.100750464071587950E+06,       0.100789001781336541E+06,       0.100828980626378441E+06,       0.100867904881876937E+06,
+        0.100901941917073651E+06,       0.100927518925117751E+06,       0.100941703370720032E+06,       0.100943313763502156E+06,       0.100929483993483183E+06,
+        0.100897899422321643E+06,       0.100855144068640948E+06,       0.100806216832129357E+06,       0.100757963881253396E+06,       0.100713882396988687E+06,
+        0.100678037239657642E+06,       0.100660578064393208E+06,       0.100655660139403961E+06,       0.100663394611081239E+06,       0.100687757803070126E+06,
+        0.100726360544964817E+06,       0.100771737117872792E+06,       0.100819550423355045E+06,       0.100863789606076709E+06,       0.100903960982124961E+06,
+        0.100937933974381580E+06,       0.100955929021348216E+06,       0.100950002084778927E+06,       0.100936336168784517E+06,       0.100920611799506456E+06,
+        0.100908792443247541E+06,       0.100909956087163751E+06,       0.100924519937428529E+06,       0.100950317855032117E+06,       0.100978637481090613E+06,
+        0.101001785171553231E+06,       0.101014600980588948E+06,       0.101015533816949537E+06,       0.101004399554267075E+06,       0.100982402170127083E+06,
+        0.100954472767269413E+06,       0.100920498290662959E+06,       0.100881272186000555E+06,       0.100838252143924561E+06,       0.100793001524282852E+06,
+        0.100749722238879811E+06,       0.100710007831689465E+06,       0.100676561452258436E+06,       0.100651754156739727E+06,       0.100637016515992684E+06,
+        0.100632797680647462E+06,       0.100643122435673547E+06,       0.100662040946369423E+06,       0.100684765371038040E+06,       0.100710073382574032E+06,
+        0.100736158886730540E+06,       0.100761558107963079E+06,       0.100780935166741401E+06,       0.100798370121153508E+06,       0.100816555152162895E+06,
+        0.100835390903751701E+06,       0.100853847765655024E+06,       0.100871757501481305E+06,       0.100888895778612612E+06,       0.100908175229415137E+06,
+        0.100925669047910487E+06,       0.101217702072300162E+06,       0.101214879429494846E+06,       0.101212918203238412E+06,       0.101215072363802130E+06,
+        0.101218250672383481E+06,       0.101222522132735277E+06,       0.101227622288938786E+06,       0.101233167267756522E+06,       0.101238956389902218E+06,
+        0.101244820309774892E+06,       0.101250635435466815E+06,       0.101256335683556361E+06,       0.101261921151622766E+06,       0.101268342600560762E+06,
+        0.101275163933372678E+06,       0.101281497833931266E+06,       0.101287383286156546E+06,       0.101292932525330558E+06,       0.101298347923196663E+06,
+        0.101303932128846092E+06,       0.101310090422888767E+06,       0.101317693616226330E+06,       0.101327652607175361E+06,       0.101342480557763687E+06,
+        0.101358556451299402E+06,       0.101375279086523937E+06,       0.101391978870831925E+06,       0.101407971443584844E+06,       0.101422613121423448E+06,
+        0.101435506823643867E+06,       0.101446124078218185E+06,       0.101452234738676838E+06,       0.101455284023688801E+06,       0.101456737369482420E+06,
+        0.101456865445288451E+06,       0.101455916182255954E+06,       0.101454121953738781E+06,       0.101451661773156113E+06,       0.101449081947506013E+06,
+        0.101446228059309360E+06,       0.101444208961239303E+06,       0.101443612932188233E+06,       0.101444705011359765E+06,       0.101447541270001515E+06,
+        0.101452383501387390E+06,       0.101458282693875270E+06,       0.101464997464114887E+06,       0.101472100710916289E+06,       0.101479273864667499E+06,
+        0.101486350419971670E+06,       0.101493152086614995E+06,       0.101499576717366377E+06,       0.101505843270561643E+06,       0.101512436676125639E+06,
+        0.101519641676807107E+06,       0.101527434410592061E+06,       0.101535644765811841E+06,       0.101545029301612725E+06,       0.101553754432012545E+06,
+        0.101560956040866411E+06,       0.101564550165702050E+06,       0.101566892094339870E+06,       0.101567035078111294E+06,       0.101564167039659485E+06,
+        0.101560257949168226E+06,       0.101555969226616333E+06,       0.101552313766367617E+06,       0.101550452021603851E+06,       0.101550963150145908E+06,
+        0.101553454481203808E+06,       0.101557594737071355E+06,       0.101562591960326725E+06,       0.101568055832384678E+06,       0.101570018237429336E+06,
+        0.101568806715803599E+06,       0.101563796324326468E+06,       0.101553825571776295E+06,       0.101537561122490020E+06,       0.101515230788797810E+06,
+        0.101485862600308523E+06,       0.101448189650402157E+06,       0.101397681000099896E+06,       0.101336913516701141E+06,       0.101267241010695536E+06,
+        0.101189600658946001E+06,       0.101107785950000631E+06,       0.101027329917614610E+06,       0.100951013494106854E+06,       0.100883020611558357E+06,
+        0.100825246076290889E+06,       0.100775271676367163E+06,       0.100732070018118597E+06,       0.100693807828755365E+06,       0.100660471847562090E+06,
+        0.100632198820324600E+06,       0.100610336348454613E+06,       0.100597445568148105E+06,       0.100596347705297740E+06,       0.100608739289963560E+06,
+        0.100632312399144867E+06,       0.100664180492312080E+06,       0.100701580165578795E+06,       0.100742885809197804E+06,       0.100784251808581277E+06,
+        0.100822721504335888E+06,       0.100857114729781009E+06,       0.100884974331454141E+06,       0.100904296005382625E+06,       0.100913525976403209E+06,
+        0.100909880311948247E+06,       0.100892635225440783E+06,       0.100865034092500646E+06,       0.100830041776689235E+06,       0.100792635237818962E+06,
+        0.100758858691726316E+06,       0.100734424708176390E+06,       0.100726153683192097E+06,       0.100729591906647329E+06,       0.100742469628359380E+06,
+        0.100772373108355430E+06,       0.100810039805286127E+06,       0.100850865902025442E+06,       0.100889839249818047E+06,       0.100924291493751982E+06,
+        0.100954018166122405E+06,       0.100976020229241141E+06,       0.100977598211779696E+06,       0.100962801120868462E+06,       0.100940325812200113E+06,
+        0.100915300637579014E+06,       0.100897607613392654E+06,       0.100888545266499175E+06,       0.100887361365753401E+06,       0.100894417619390835E+06,
+        0.100914107950286358E+06,       0.100931864535990011E+06,       0.100942729300749750E+06,       0.100943712413188565E+06,       0.100933999633237443E+06,
+        0.100915953837210676E+06,       0.100891962587812566E+06,       0.100861290497928669E+06,       0.100825794229352119E+06,       0.100786805648525173E+06,
+        0.100747059949918155E+06,       0.100708052571343884E+06,       0.100670389177752746E+06,       0.100637438856290988E+06,       0.100612791553316754E+06,
+        0.100598161054412602E+06,       0.100597616745557592E+06,       0.100608245258248513E+06,       0.100627589752602711E+06,       0.100652501052796259E+06,
+        0.100677256390096882E+06,       0.100702485105916334E+06,       0.100721371071945381E+06,       0.100737732280855227E+06,       0.100754743779602475E+06,
+        0.100772593580461515E+06,       0.100791374419969914E+06,       0.100810897025248196E+06,       0.100830367089737425E+06,       0.100852737881952431E+06,
+        0.100874075837282377E+06,       0.100893534157121714E+06,       0.101228070489269143E+06,       0.101227544665406953E+06,       0.101230349746524807E+06,
+        0.101234269851944497E+06,       0.101239184467959683E+06,       0.101244939450664504E+06,       0.101251545017166776E+06,       0.101258662705518451E+06,
+        0.101265918196699597E+06,       0.101273125560589353E+06,       0.101280152736103031E+06,       0.101286933875186733E+06,       0.101293407125996848E+06,
+        0.101299586824039099E+06,       0.101306376779591956E+06,       0.101313623028716072E+06,       0.101320476967868250E+06,       0.101327043370354135E+06,
+        0.101333520713772232E+06,       0.101340211822319048E+06,       0.101347526837547412E+06,       0.101356523012281294E+06,       0.101370533287668499E+06,
+        0.101386582740267011E+06,       0.101403758993542797E+06,       0.101421430602220105E+06,       0.101438909393433467E+06,       0.101455505881131437E+06,
+        0.101470586854150286E+06,       0.101483635012064580E+06,       0.101492144560654036E+06,       0.101497362403152074E+06,       0.101500801900675287E+06,
+        0.101502736875093309E+06,       0.101503413235270535E+06,       0.101503062612840484E+06,       0.101501914512809366E+06,       0.101500206465205003E+06,
+        0.101497831592138784E+06,       0.101495767534276791E+06,       0.101494714546066039E+06,       0.101495119352637426E+06,       0.101497237786485115E+06,
+        0.101501125674684867E+06,       0.101506644060371764E+06,       0.101514150312748505E+06,       0.101522320784248848E+06,       0.101530563331544297E+06,
+        0.101538706294350879E+06,       0.101546559377466736E+06,       0.101553946547580461E+06,       0.101560765945043371E+06,       0.101567653265792658E+06,
+        0.101574587210003941E+06,       0.101581752742970988E+06,       0.101589174518686996E+06,       0.101596642355671458E+06,       0.101603818859754785E+06,
+        0.101610799838750623E+06,       0.101614811522755466E+06,       0.101617790546373333E+06,       0.101619757440904345E+06,       0.101620562545717650E+06,
+        0.101618884459059045E+06,       0.101615191240677028E+06,       0.101611483339551589E+06,       0.101608375965291722E+06,       0.101606589668011176E+06,
+        0.101606767311590491E+06,       0.101608967585915860E+06,       0.101612347393029107E+06,       0.101614810665037265E+06,       0.101614446811429036E+06,
+        0.101613127583126843E+06,       0.101609516694027276E+06,       0.101602475273863849E+06,       0.101591105455035053E+06,       0.101574139304303288E+06,
+        0.101552261616850359E+06,       0.101522964529426812E+06,       0.101483809256113498E+06,       0.101431803333729331E+06,       0.101367984772122625E+06,
+        0.101295216781381270E+06,       0.101216180859079337E+06,       0.101134418945842335E+06,       0.101057719484696820E+06,       0.100987761361816083E+06,
+        0.100925129407695815E+06,       0.100869076127166059E+06,       0.100819148307903684E+06,       0.100772602660554068E+06,       0.100726367887494707E+06,
+        0.100682387602061091E+06,       0.100642046686646194E+06,       0.100608073036628615E+06,       0.100583165331615121E+06,       0.100571567333927058E+06,
+        0.100579161681519065E+06,       0.100599831523424771E+06,       0.100631457444745640E+06,       0.100671162741316628E+06,       0.100715517300559659E+06,
+        0.100759196447210823E+06,       0.100798644466533326E+06,       0.100834218092755124E+06,       0.100864022068452279E+06,       0.100886844670119492E+06,
+        0.100903072952249466E+06,       0.100910324635737983E+06,       0.100907110564502160E+06,       0.100894913649374212E+06,       0.100873485872527890E+06,
+        0.100847908218072756E+06,       0.100825028815845202E+06,       0.100812235195442801E+06,       0.100811789392154620E+06,       0.100821477468724654E+06,
+        0.100842188280174509E+06,       0.100874882105417564E+06,       0.100910352034741096E+06,       0.100944613694273561E+06,       0.100970573806106200E+06,
+        0.100992876564753780E+06,       0.101010256709896377E+06,       0.101017365734439736E+06,       0.101004642180764087E+06,       0.100981216767300502E+06,
+        0.100950670557522288E+06,       0.100918693714911191E+06,       0.100893168282002865E+06,       0.100873786774855747E+06,       0.100862092518860401E+06,
+        0.100858765389723776E+06,       0.100863848594959985E+06,       0.100872455106490743E+06,       0.100880727391939872E+06,       0.100881060958518239E+06,
+        0.100871581642927995E+06,       0.100854982629453050E+06,       0.100833968938175327E+06,       0.100809126941723182E+06,       0.100777926015906574E+06,
+        0.100744862813125714E+06,       0.100711030659190204E+06,       0.100674920663551122E+06,       0.100638665812651045E+06,       0.100604613640158801E+06,
+        0.100577951755037328E+06,       0.100565299257314167E+06,       0.100564490794773781E+06,       0.100574070775104672E+06,       0.100592267906427369E+06,
+        0.100616576592620535E+06,       0.100643954138155808E+06,       0.100661679785274406E+06,       0.100676519993234426E+06,       0.100692101751513052E+06,
+        0.100708845098980164E+06,       0.100726890359751837E+06,       0.100746088291053093E+06,       0.100766274118497415E+06,       0.100790485020117267E+06,
+        0.100814283052694198E+06,       0.100836998900601233E+06,       0.100857834251143926E+06,       0.101239951294366925E+06,       0.101243511198018721E+06,
+        0.101248266604097182E+06,       0.101254120739513630E+06,       0.101260940255995316E+06,       0.101268566543099048E+06,       0.101276830453567702E+06,
+        0.101285622454819968E+06,       0.101294523809254446E+06,       0.101303237484829937E+06,       0.101311620976720500E+06,       0.101319644374765689E+06,
+        0.101327259549206297E+06,       0.101334480948853117E+06,       0.101341388354789131E+06,       0.101348710884544664E+06,       0.101356521517190282E+06,
+        0.101364093945627537E+06,       0.101371621643877312E+06,       0.101379408199202080E+06,       0.101388443315429948E+06,       0.101401687552132498E+06,
+        0.101416572004818678E+06,       0.101433189992554107E+06,       0.101451428970825116E+06,       0.101470024045938291E+06,       0.101488255659360628E+06,
+        0.101505416028128879E+06,       0.101520868917434069E+06,       0.101531842805264969E+06,       0.101539245769958565E+06,       0.101544605958666289E+06,
+        0.101548569302459247E+06,       0.101551134535491103E+06,       0.101552518676128384E+06,       0.101552933361419549E+06,       0.101552598628048305E+06,
+        0.101551346091754502E+06,       0.101549620534837697E+06,       0.101548503290274006E+06,       0.101548531268210281E+06,       0.101550086213979870E+06,
+        0.101553415865284071E+06,       0.101558574308658994E+06,       0.101566141420655156E+06,       0.101575323430362041E+06,       0.101584790524686381E+06,
+        0.101594148506046142E+06,       0.101603272905442951E+06,       0.101611945735174741E+06,       0.101619979003416622E+06,       0.101627204805596586E+06,
+        0.101634427668451928E+06,       0.101641404911077247E+06,       0.101648381901037224E+06,       0.101655340222651532E+06,       0.101662034474683896E+06,
+        0.101666783103935741E+06,       0.101669591715802919E+06,       0.101672592019255666E+06,       0.101674896474706766E+06,       0.101676486613950226E+06,
+        0.101677173545713507E+06,       0.101676735064566892E+06,       0.101674421820609132E+06,       0.101671063643987713E+06,       0.101668202552547300E+06,
+        0.101666520557556054E+06,       0.101666348434875123E+06,       0.101667923680669555E+06,       0.101669351667803800E+06,       0.101668978131977754E+06,
+        0.101666110028333933E+06,       0.101660538752964931E+06,       0.101654594444694463E+06,       0.101645738692219165E+06,       0.101634351733125281E+06,
+        0.101619445806351592E+06,       0.101597486529762551E+06,       0.101566963080607631E+06,       0.101526313623151611E+06,       0.101474414132893216E+06,
+        0.101408806070782084E+06,       0.101334676336432865E+06,       0.101255967485764850E+06,       0.101177930379907673E+06,       0.101105923487214692E+06,
+        0.101041528067973224E+06,       0.100984421243628807E+06,       0.100931366999700622E+06,       0.100882259035952666E+06,       0.100834318510275116E+06,
+        0.100780975023316409E+06,       0.100725029283105585E+06,       0.100672125573187601E+06,       0.100626333648281943E+06,       0.100591108252538659E+06,
+        0.100571154519613207E+06,       0.100572764811242494E+06,       0.100590644123334263E+06,       0.100622114840101916E+06,       0.100663170419413218E+06,
+        0.100711109304953105E+06,       0.100759450274770090E+06,       0.100803668821019484E+06,       0.100843723009858411E+06,       0.100878065056743988E+06,
+        0.100905193898488564E+06,       0.100924238150348683E+06,       0.100935705112497482E+06,       0.100940040808540827E+06,       0.100938611611957211E+06,
+        0.100929132041696241E+06,       0.100917754954705204E+06,       0.100905818223427166E+06,       0.100905472653716875E+06,       0.100913513200435162E+06,
+        0.100929234171202479E+06,       0.100956672791980032E+06,       0.100989933744260285E+06,       0.101021721049159081E+06,       0.101045261345619481E+06,
+        0.101056484086316414E+06,       0.101064376750130497E+06,       0.101068662292293593E+06,       0.101058850049314118E+06,       0.101036734626105259E+06,
+        0.101005396099047648E+06,       0.100967551751069492E+06,       0.100930584068150943E+06,       0.100895049839971194E+06,       0.100865689126530953E+06,
+        0.100843766391791884E+06,       0.100833519035555830E+06,       0.100830429319700765E+06,       0.100830534716874317E+06,       0.100831218872075027E+06,
+        0.100828733033744793E+06,       0.100816736999957517E+06,       0.100801115692818625E+06,       0.100782650624359696E+06,       0.100761638271208169E+06,
+        0.100739079948099330E+06,       0.100715508303584225E+06,       0.100685570121976882E+06,       0.100651926936336182E+06,       0.100616808436076797E+06,
+        0.100582738088950529E+06,       0.100553609533300842E+06,       0.100536151852068826E+06,       0.100533191840017098E+06,       0.100540563795043839E+06,
+        0.100556547268302660E+06,       0.100578647827983019E+06,       0.100597845282151320E+06,       0.100615643951716338E+06,       0.100629644958407152E+06,
+        0.100644649717624998E+06,       0.100661314686951257E+06,       0.100679739011681770E+06,       0.100699923738231213E+06,       0.100724000291545439E+06,
+        0.100748935934403649E+06,       0.100773460147275109E+06,       0.100796886100017015E+06,       0.100818431742268527E+06,       0.101253250319671861E+06,
+        0.101258941275491015E+06,       0.101265825984074268E+06,       0.101273785992740712E+06,       0.101282673338371926E+06,       0.101292322337458594E+06,
+        0.101302564811119126E+06,       0.101313249084015886E+06,       0.101324039732978374E+06,       0.101334420443956798E+06,       0.101344441355969844E+06,
+        0.101353937804033951E+06,       0.101362853548466621E+06,       0.101371239996888005E+06,       0.101379195223571107E+06,       0.101386868114858662E+06,
+        0.101394863418320267E+06,       0.101403421459721620E+06,       0.101411971625535502E+06,       0.101421328676152989E+06,       0.101434052612144369E+06,
+        0.101448448578493975E+06,       0.101464428560022046E+06,       0.101481780318751698E+06,       0.101500377161328623E+06,       0.101519861969620310E+06,
+        0.101538794301281392E+06,       0.101556432572582416E+06,       0.101569913275213607E+06,       0.101580111679331065E+06,       0.101588077608188687E+06,
+        0.101593761388586005E+06,       0.101597743292873696E+06,       0.101601111211300595E+06,       0.101603375473686290E+06,       0.101604722386775393E+06,
+        0.101605277974446421E+06,       0.101605137189286179E+06,       0.101604583774228318E+06,       0.101604027662526438E+06,       0.101605032612257637E+06,
+        0.101607890648949600E+06,       0.101612610274943596E+06,       0.101620190413487217E+06,       0.101629709918692257E+06,       0.101640274485895483E+06,
+        0.101651366271263018E+06,       0.101662017372317307E+06,       0.101672127532921921E+06,       0.101681639836175294E+06,       0.101689695653715113E+06,
+        0.101697371401130935E+06,       0.101704816287710346E+06,       0.101711959261812881E+06,       0.101718592829194225E+06,       0.101724976617920722E+06,
+        0.101729049321389990E+06,       0.101731107282530153E+06,       0.101732743234520705E+06,       0.101734177642089810E+06,       0.101735792298410903E+06,
+        0.101737051523103568E+06,       0.101737813506062157E+06,       0.101737771770358304E+06,       0.101736766611527375E+06,       0.101733998643601444E+06,
+        0.101731285447018498E+06,       0.101729657615879667E+06,       0.101729463824108592E+06,       0.101730467776220365E+06,       0.101730634889909721E+06,
+        0.101728530424326527E+06,       0.101723478773003560E+06,       0.101715128998538450E+06,       0.101705173881448645E+06,       0.101697065128410613E+06,
+        0.101686174729378530E+06,       0.101670746397321127E+06,       0.101648602916028351E+06,       0.101617289856162359E+06,       0.101575677936215157E+06,
+        0.101523549414822643E+06,       0.101459384090740117E+06,       0.101385766535040675E+06,       0.101307806220871105E+06,       0.101230532040925333E+06,
+        0.101163615695121596E+06,       0.101105144301163149E+06,       0.101053953064553687E+06,       0.101004506092646785E+06,       0.100954394425546445E+06,
+        0.100903265851270029E+06,       0.100843568326323351E+06,       0.100779909310060830E+06,       0.100718507897475429E+06,       0.100663227538561507E+06,
+        0.100619196470881463E+06,       0.100590878309716514E+06,       0.100585918330994056E+06,       0.100599670235220139E+06,       0.100629367268692309E+06,
+        0.100671559948193928E+06,       0.100722625470161831E+06,       0.100775876461740903E+06,       0.100826307692812305E+06,       0.100872731273009820E+06,
+        0.100911769660482067E+06,       0.100942401025764135E+06,       0.100964392752327054E+06,       0.100978678374194351E+06,       0.100986716960824007E+06,
+        0.100990258819483715E+06,       0.100986859094204920E+06,       0.100984358423690996E+06,       0.100986880945730183E+06,       0.101001308030144719E+06,
+        0.101021911204537639E+06,       0.101045314756852677E+06,       0.101079374563270016E+06,       0.101112057664106265E+06,       0.101138492426304845E+06,
+        0.101147264582452117E+06,       0.101146181575950890E+06,       0.101139597898295426E+06,       0.101126956426191653E+06,       0.101104207044017559E+06,
+        0.101074184746976593E+06,       0.101036351784390296E+06,       0.100994839802225833E+06,       0.100951701131987342E+06,       0.100907802015808338E+06,
+        0.100866623322513595E+06,       0.100836261177509557E+06,       0.100817609325104844E+06,       0.100806057949370603E+06,       0.100799101756952587E+06,
+        0.100794178922864405E+06,       0.100782586521973222E+06,       0.100770278560914870E+06,       0.100755730874395027E+06,       0.100740174567162278E+06,
+        0.100724221891415305E+06,       0.100711960802472036E+06,       0.100695201938734870E+06,       0.100670904548085469E+06,       0.100639130264881242E+06,
+        0.100604667725497551E+06,       0.100569533181772116E+06,       0.100538827586813903E+06,       0.100515863557522040E+06,       0.100504283432544311E+06,
+        0.100508208880423437E+06,       0.100520846592849106E+06,       0.100533319890499857E+06,       0.100546979620563667E+06,       0.100563406036921282E+06,
+        0.100581336883139578E+06,       0.100596479945475046E+06,       0.100613263609396352E+06,       0.100632606505272503E+06,       0.100655737101977575E+06,
+        0.100680377627359165E+06,       0.100705693019706334E+06,       0.100730567542817560E+06,       0.100753963268230000E+06,       0.100775475443369112E+06,
+        0.101264306669592683E+06,       0.101273005643247234E+06,       0.101282212261941575E+06,       0.101292455230279535E+06,       0.101303569666892407E+06,
+        0.101315379627821021E+06,       0.101327713762651794E+06,       0.101340424766245633E+06,       0.101353413011349316E+06,       0.101366215214067837E+06,
+        0.101378003241061873E+06,       0.101389048142805594E+06,       0.101399358057326695E+06,       0.101408993909155237E+06,       0.101418071350073515E+06,
+        0.101426765747085621E+06,       0.101435320572288721E+06,       0.101444230417056518E+06,       0.101454115342003613E+06,       0.101466281775386233E+06,
+        0.101480018815107192E+06,       0.101495370152025978E+06,       0.101512249092142942E+06,       0.101530457200416044E+06,       0.101549717357720714E+06,
+        0.101569710093644739E+06,       0.101589282549966229E+06,       0.101605011230739328E+06,       0.101617835360473735E+06,       0.101628768238586897E+06,
+        0.101637571031423722E+06,       0.101644166338589697E+06,       0.101648697806602591E+06,       0.101651881208006424E+06,       0.101655220484862148E+06,
+        0.101657859335835557E+06,       0.101659761085947117E+06,       0.101661032940759702E+06,       0.101661921699332699E+06,       0.101662809971163108E+06,
+        0.101664227024246793E+06,       0.101667989933228542E+06,       0.101675508452427108E+06,       0.101685268933038969E+06,       0.101696374945899413E+06,
+        0.101708376350831662E+06,       0.101720741353243910E+06,       0.101732914311869565E+06,       0.101744191311434886E+06,       0.101753679207339199E+06,
+        0.101762383198229145E+06,       0.101770484632283566E+06,       0.101778058653469430E+06,       0.101785052189110153E+06,       0.101791286685933344E+06,
+        0.101795171487182030E+06,       0.101797156941597103E+06,       0.101798421280143026E+06,       0.101799261614609830E+06,       0.101799803038408485E+06,
+        0.101800210895802447E+06,       0.101801683280290250E+06,       0.101802630829050468E+06,       0.101802543397740184E+06,       0.101801482357017914E+06,
+        0.101799624587932572E+06,       0.101797066559983883E+06,       0.101795799625004249E+06,       0.101795785922852519E+06,       0.101796374037248344E+06,
+        0.101796548441705847E+06,       0.101793091799900605E+06,       0.101786346983049574E+06,       0.101776575607877137E+06,       0.101765049283969143E+06,
+        0.101754303368654233E+06,       0.101742481241294314E+06,       0.101726517364683619E+06,       0.101704526213350880E+06,       0.101673251963278643E+06,
+        0.101631549642581842E+06,       0.101579630218674371E+06,       0.101517751331919892E+06,       0.101445587957413649E+06,       0.101369276534187840E+06,
+        0.101293749197962985E+06,       0.101228845743408630E+06,       0.101175974072217723E+06,       0.101128069068520213E+06,       0.101080672101220363E+06,
+        0.101030554297062597E+06,       0.100978255877595599E+06,       0.100917786384446328E+06,       0.100848380590802917E+06,       0.100779685419598463E+06,
+        0.100716993576480047E+06,       0.100665449877585226E+06,       0.100628730188585745E+06,       0.100616768912061103E+06,       0.100625017647516172E+06,
+        0.100651010955717982E+06,       0.100693983128488617E+06,       0.100748028718061119E+06,       0.100807126354548294E+06,       0.100865743222122503E+06,
+        0.100920280263948240E+06,       0.100963697339721592E+06,       0.100996625031755175E+06,       0.101020588466931018E+06,       0.101034801756696354E+06,
+        0.101044107550953762E+06,       0.101050001068824189E+06,       0.101053046373654055E+06,       0.101058552912032319E+06,       0.101072171257776601E+06,
+        0.101095588999532294E+06,       0.101124462408449937E+06,       0.101159998252541394E+06,       0.101199939829214418E+06,       0.101233511940909040E+06,
+        0.101250548981260363E+06,       0.101245238633873159E+06,       0.101231967019851887E+06,       0.101212524735667932E+06,       0.101187116747768814E+06,
+        0.101155254569723096E+06,       0.101117728069520774E+06,       0.101075849861174778E+06,       0.101031454770778844E+06,       0.100982633468066182E+06,
+        0.100931817382534617E+06,       0.100883044212189372E+06,       0.100842431678571462E+06,       0.100810753030772234E+06,       0.100790307235783985E+06,
+        0.100775641660991605E+06,       0.100758065719658363E+06,       0.100742431929372280E+06,       0.100730276589137924E+06,       0.100719950891765460E+06,
+        0.100707897196450547E+06,       0.100704034450479885E+06,       0.100696304475012279E+06,       0.100682955042842383E+06,       0.100662970635189646E+06,
+        0.100635257255516670E+06,       0.100598919177042175E+06,       0.100561998994079375E+06,       0.100529207116205667E+06,       0.100503120931424841E+06,
+        0.100485371253469493E+06,       0.100478084387816067E+06,       0.100480161528695491E+06,       0.100486330170588408E+06,       0.100497656033703854E+06,
+        0.100512793940874559E+06,       0.100530267502319883E+06,       0.100548674998529634E+06,       0.100566870164484106E+06,       0.100588713074028346E+06,
+        0.100612035752629497E+06,       0.100636570551070865E+06,       0.100661555413946771E+06,       0.100685975940573393E+06,       0.100708805081237850E+06,
+        0.100728426698084644E+06,       0.101271996036762896E+06,       0.101284449704480561E+06,       0.101296689346213228E+06,       0.101309400454198360E+06,
+        0.101322901055611903E+06,       0.101337001192974072E+06,       0.101351521575208899E+06,       0.101366313393139906E+06,       0.101382034494546009E+06,
+        0.101397351776588475E+06,       0.101411443443270473E+06,       0.101424117470686309E+06,       0.101435883616085790E+06,       0.101446811616959909E+06,
+        0.101457033181746156E+06,       0.101466747751913790E+06,       0.101476231696805597E+06,       0.101486021283400187E+06,       0.101497396375811921E+06,
+        0.101510400207985600E+06,       0.101524923388815208E+06,       0.101540994381505661E+06,       0.101558520228044814E+06,       0.101577305318149651E+06,
+        0.101597084529118074E+06,       0.101617572913645636E+06,       0.101635935716414897E+06,       0.101650985317801838E+06,       0.101664666828709975E+06,
+        0.101676613583561295E+06,       0.101686531498022989E+06,       0.101694300750966708E+06,       0.101700039232711759E+06,       0.101704155496819658E+06,
+        0.101707559871844016E+06,       0.101711706616868032E+06,       0.101715220819953611E+06,       0.101718183769718671E+06,       0.101720797579619655E+06,
+        0.101723413797095534E+06,       0.101726548168837966E+06,       0.101732421109602874E+06,       0.101741180387240456E+06,       0.101752626090808626E+06,
+        0.101765327683930620E+06,       0.101778794125947126E+06,       0.101792465254962983E+06,       0.101805759257347163E+06,       0.101817578749370528E+06,
+        0.101828002210067600E+06,       0.101837310759124710E+06,       0.101845770211075462E+06,       0.101853420566787143E+06,       0.101860181736826940E+06,
+        0.101864213062694500E+06,       0.101866574115216965E+06,       0.101867875008511299E+06,       0.101868524705411764E+06,       0.101868825959176160E+06,
+        0.101868919433276926E+06,       0.101869678539425964E+06,       0.101870695483190138E+06,       0.101871330785532584E+06,       0.101870979213963699E+06,
+        0.101869675931957303E+06,       0.101867574002842535E+06,       0.101865625644742016E+06,       0.101864444239763863E+06,       0.101864129871809724E+06,
+        0.101864253411905665E+06,       0.101863863423935647E+06,       0.101861147095331355E+06,       0.101853046503827805E+06,       0.101842469691830149E+06,
+        0.101829793173113096E+06,       0.101815148158582204E+06,       0.101801721489973846E+06,       0.101784969966993638E+06,       0.101762516553084497E+06,
+        0.101733198141890345E+06,       0.101692387931239413E+06,       0.101641579160683832E+06,       0.101581604629232388E+06,       0.101513447361368249E+06,
+        0.101440920474624741E+06,       0.101370696075984946E+06,       0.101305428265875380E+06,       0.101254160309156374E+06,       0.101207383873920160E+06,
+        0.101161789898628529E+06,       0.101111489873579616E+06,       0.101058073620173833E+06,       0.100998431410120465E+06,       0.100925178881860134E+06,
+        0.100851277940204382E+06,       0.100782887728638991E+06,       0.100724637342850445E+06,       0.100681654247053943E+06,       0.100660743763258797E+06,
+        0.100662241191619672E+06,       0.100684600997945701E+06,       0.100726431789378737E+06,       0.100783621753223240E+06,       0.100850165592330639E+06,
+        0.100919393459606828E+06,       0.100984663126731160E+06,       0.101035581217426865E+06,       0.101073289555574971E+06,       0.101097883508170984E+06,
+        0.101109275635634360E+06,       0.101115535689499287E+06,       0.101120721213043289E+06,       0.101127445332507938E+06,       0.101138555650677066E+06,
+        0.101162386128591490E+06,       0.101193764958060041E+06,       0.101229324100487633E+06,       0.101272586038755646E+06,       0.101314017050708091E+06,
+        0.101345307647537833E+06,       0.101350681405921583E+06,       0.101336274552223433E+06,       0.101312002659208913E+06,       0.101282108941999220E+06,
+        0.101247511268828879E+06,       0.101208775326433519E+06,       0.101166118942493005E+06,       0.101124324087716755E+06,       0.101077097855417393E+06,
+        0.101023493736806588E+06,       0.100966370678116829E+06,       0.100910649732596605E+06,       0.100860956183662900E+06,       0.100818859583747035E+06,
+        0.100784487610509677E+06,       0.100755633857502806E+06,       0.100730268695456398E+06,       0.100710865638861083E+06,       0.100697679049610029E+06,
+        0.100690061794109570E+06,       0.100696089852752222E+06,       0.100696921102593260E+06,       0.100692632540626320E+06,       0.100681762801710865E+06,
+        0.100663264802660036E+06,       0.100633791904004815E+06,       0.100597430688150896E+06,       0.100559133196241281E+06,       0.100524051576254133E+06,
+        0.100494743325319461E+06,       0.100472843717532320E+06,       0.100453469270866597E+06,       0.100441938855850953E+06,       0.100444602587366870E+06,
+        0.100453700278505523E+06,       0.100467703647186674E+06,       0.100484865751373640E+06,       0.100504556800278908E+06,       0.100526747147881411E+06,
+        0.100548342492759344E+06,       0.100570928110482331E+06,       0.100594499129673175E+06,       0.100618314768352022E+06,       0.100641358389098648E+06,
+        0.100661048545089099E+06,       0.100674922441404182E+06,       0.101277440454925483E+06,       0.101292275045881630E+06,       0.101308217918252703E+06,
+        0.101324032641650105E+06,       0.101340083417949048E+06,       0.101356599817204507E+06,       0.101373389242319026E+06,       0.101391680572806275E+06,
+        0.101409655246696246E+06,       0.101426966070523806E+06,       0.101443353143514600E+06,       0.101458277199001546E+06,       0.101471528522387307E+06,
+        0.101483748681189623E+06,       0.101495083125874895E+06,       0.101505752090554262E+06,       0.101516050089151657E+06,       0.101526815975076141E+06,
+        0.101538795327266271E+06,       0.101552338028206417E+06,       0.101567404995926277E+06,       0.101583932457588046E+06,       0.101601812845274559E+06,
+        0.101620841504076889E+06,       0.101640749378202716E+06,       0.101659290500403222E+06,       0.101676771795349603E+06,       0.101693884723980591E+06,
+        0.101708998663612001E+06,       0.101722276078936207E+06,       0.101733606252533034E+06,       0.101742808520292456E+06,       0.101749958233873534E+06,
+        0.101756733187784732E+06,       0.101761976313215302E+06,       0.101765600227458519E+06,       0.101770624962746049E+06,       0.101775587804667244E+06,
+        0.101780223730697457E+06,       0.101784845963681015E+06,       0.101792019560120360E+06,       0.101800861910829000E+06,       0.101810238167576026E+06,
+        0.101821334626365482E+06,       0.101835649384848730E+06,       0.101850599319270405E+06,       0.101865571025550424E+06,       0.101879726510542314E+06,
+        0.101892673462390783E+06,       0.101903975174055988E+06,       0.101913651691837455E+06,       0.101922403262289721E+06,       0.101930066269132934E+06,
+        0.101934959838625931E+06,       0.101938013574382479E+06,       0.101939867945920269E+06,       0.101940768404829549E+06,       0.101940976512875422E+06,
+        0.101940974808985324E+06,       0.101941915218950715E+06,       0.101942796779357042E+06,       0.101943325071244180E+06,       0.101943321289824438E+06,
+        0.101942520685581403E+06,       0.101940795734215877E+06,       0.101938328485986989E+06,       0.101936102913573559E+06,       0.101934189161022412E+06,
+        0.101933270983365946E+06,       0.101932726854111810E+06,       0.101931071080041162E+06,       0.101927390375963005E+06,       0.101920782487591568E+06,
+        0.101909599976852041E+06,       0.101896034018928112E+06,       0.101880121030327078E+06,       0.101861777722108454E+06,       0.101843441866567693E+06,
+        0.101821175828396939E+06,       0.101793162871491804E+06,       0.101756243381197477E+06,       0.101707526053893132E+06,       0.101651390637597418E+06,
+        0.101591096250860501E+06,       0.101525066978488496E+06,       0.101457842460151805E+06,       0.101392749867658815E+06,       0.101338205739929384E+06,
+        0.101290789521037383E+06,       0.101243732978547458E+06,       0.101191560328100386E+06,       0.101135333560209707E+06,       0.101074991868799916E+06,
+        0.101002789603246347E+06,       0.100928035016280875E+06,       0.100857779212484500E+06,       0.100794984785666602E+06,       0.100746221294778152E+06,
+        0.100717266126841918E+06,       0.100710869212579069E+06,       0.100726313373954297E+06,       0.100765862955971417E+06,       0.100824009621681325E+06,
+        0.100896074483335498E+06,       0.100975156087370415E+06,       0.101050862045185830E+06,       0.101108616996395343E+06,       0.101151397540630162E+06,
+        0.101177118649863274E+06,       0.101187234876946401E+06,       0.101192189574432836E+06,       0.101198920872520132E+06,       0.101209271572763842E+06,
+        0.101225853188380381E+06,       0.101255763867716960E+06,       0.101292205782835576E+06,       0.101333769433737034E+06,       0.101380487686360808E+06,
+        0.101421196585383368E+06,       0.101445943578677994E+06,       0.101442593076884281E+06,       0.101422753739062216E+06,       0.101390520324852318E+06,
+        0.101350761888702051E+06,       0.101308120360709363E+06,       0.101265074031475204E+06,       0.101223556150358476E+06,       0.101181059083197164E+06,
+        0.101131282154724337E+06,       0.101073985674786556E+06,       0.101009316519365500E+06,       0.100945620806578852E+06,       0.100887564966803198E+06,
+        0.100836870701820939E+06,       0.100791306568270127E+06,       0.100748587002241606E+06,       0.100714275195360678E+06,       0.100691096015225994E+06,
+        0.100677036214206237E+06,       0.100679656532840978E+06,       0.100689403954963505E+06,       0.100699806241966638E+06,       0.100699758014009334E+06,
+        0.100690385161567290E+06,       0.100668712287826143E+06,       0.100636906386880102E+06,       0.100599766534639755E+06,       0.100560426804608782E+06,
+        0.100523011227441762E+06,       0.100490487333571364E+06,       0.100458484377625064E+06,       0.100433836484664062E+06,       0.100418321599970062E+06,
+        0.100412076649917391E+06,       0.100419080629848453E+06,       0.100432241000389156E+06,       0.100450792482229837E+06,       0.100472305642769512E+06,
+        0.100493869619492121E+06,       0.100514430080734746E+06,       0.100535036793476407E+06,       0.100556629184451856E+06,       0.100578314394928922E+06,
+        0.100596991295179905E+06,       0.100611500340730694E+06,       0.100623274306907668E+06,       0.101280196625301396E+06,       0.101297364868656936E+06,
+        0.101315860426329833E+06,       0.101335437548964052E+06,       0.101354738212366676E+06,       0.101373945822871654E+06,       0.101394704590563779E+06,
+        0.101415369573864707E+06,       0.101435547066077095E+06,       0.101454900560777067E+06,       0.101473156717428967E+06,       0.101490111858949429E+06,
+        0.101505426648419336E+06,       0.101518896733282789E+06,       0.101531260767964472E+06,       0.101542531309453814E+06,       0.101553164954199878E+06,
+        0.101564411925864319E+06,       0.101576767311889984E+06,       0.101590613786174377E+06,       0.101606186426911474E+06,       0.101622949542643095E+06,
+        0.101640870734518088E+06,       0.101659778611533140E+06,       0.101677671599300767E+06,       0.101695145189232746E+06,       0.101713022490742442E+06,
+        0.101730968458130665E+06,       0.101748633328473559E+06,       0.101764332593418454E+06,       0.101777415582760368E+06,       0.101788327636173344E+06,
+        0.101798745459491343E+06,       0.101807854686651277E+06,       0.101815215507054876E+06,       0.101821043040616947E+06,       0.101825884968623417E+06,
+        0.101832189148969264E+06,       0.101839168448648401E+06,       0.101848045440598347E+06,       0.101858730804693652E+06,       0.101869959329435806E+06,
+        0.101881533268110448E+06,       0.101893454722194554E+06,       0.101906437265534973E+06,       0.101922905509709031E+06,       0.101939197745689977E+06,
+        0.101954795923734462E+06,       0.101969009671704334E+06,       0.101981310726737574E+06,       0.101991415766123711E+06,       0.101999594743156573E+06,
+        0.102005976491342561E+06,       0.102010334316063047E+06,       0.102013157295944911E+06,       0.102014722383416287E+06,       0.102015313093490025E+06,
+        0.102015201185307524E+06,       0.102016512237083880E+06,       0.102017510782104568E+06,       0.102018055903560264E+06,       0.102018084579591843E+06,
+        0.102017466339170613E+06,       0.102015842014936527E+06,       0.102013009808558825E+06,       0.102010188377710918E+06,       0.102007504920719613E+06,
+        0.102004842449303280E+06,       0.102002010784629019E+06,       0.101999472815438930E+06,       0.101995912864510945E+06,       0.101991527724094442E+06,
+        0.101985699759707655E+06,       0.101975812995855114E+06,       0.101961537246313150E+06,       0.101943695019863866E+06,       0.101923033375715851E+06,
+        0.101901362121280530E+06,       0.101879075837123033E+06,       0.101852284874085046E+06,       0.101819539147717020E+06,       0.101776999589703846E+06,
+        0.101726785900868257E+06,       0.101671557646898407E+06,       0.101612042588822980E+06,       0.101548622762663115E+06,       0.101485284216076703E+06,
+        0.101425147441038411E+06,       0.101373420817102917E+06,       0.101321191476503751E+06,       0.101266538752380700E+06,       0.101208938335707280E+06,
+        0.101148533319442722E+06,       0.101080582757091557E+06,       0.101007172321080754E+06,       0.100937106866050381E+06,       0.100872650853732252E+06,
+        0.100818490092161403E+06,       0.100780581038449120E+06,       0.100763989069985822E+06,       0.100769172528104478E+06,       0.100801781036641652E+06,
+        0.100856282722816642E+06,       0.100929221528193739E+06,       0.101013884730459817E+06,       0.101097563707576744E+06,       0.101162534274172547E+06,
+        0.101213486478638646E+06,       0.101244516559525029E+06,       0.101257648408437890E+06,       0.101263733502884890E+06,       0.101275510052246449E+06,
+        0.101290762661853529E+06,       0.101314197491016195E+06,       0.101347943558257903E+06,       0.101386651316440679E+06,       0.101430443429601510E+06,
+        0.101475669896804160E+06,       0.101514950055520574E+06,       0.101531515938051540E+06,       0.101524788957272292E+06,       0.101501664340208648E+06,
+        0.101465580088908755E+06,       0.101421732802947983E+06,       0.101374184582676520E+06,       0.101328046898908578E+06,       0.101289807901878230E+06,
+        0.101246491413997268E+06,       0.101194778317482283E+06,       0.101131646224091921E+06,       0.101060205833383836E+06,       0.100988174374432070E+06,
+        0.100922370979696687E+06,       0.100863854824209222E+06,       0.100809964699915654E+06,       0.100761271524313197E+06,       0.100719104259046479E+06,
+        0.100686430395430245E+06,       0.100678847862221184E+06,       0.100683138663107515E+06,       0.100693073794055832E+06,       0.100704133264039236E+06,
+        0.100711587564049987E+06,       0.100702838554374641E+06,       0.100679156446423745E+06,       0.100646910483054933E+06,       0.100608627281804467E+06,
+        0.100567412671928309E+06,       0.100526528285293534E+06,       0.100483943399388023E+06,       0.100448443665773972E+06,       0.100421899539395425E+06,
+        0.100404924203073868E+06,       0.100397063255380912E+06,       0.100397195586259491E+06,       0.100412985650041403E+06,       0.100432834475288488E+06,
+        0.100453366207182436E+06,       0.100473356439391355E+06,       0.100491742373035304E+06,       0.100507905429383289E+06,       0.100525814076571885E+06,
+        0.100542096974396103E+06,       0.100555812166254138E+06,       0.100567395231908740E+06,       0.100576579149565121E+06,       0.101279908089260382E+06,
+        0.101299372851355220E+06,       0.101320345227797603E+06,       0.101342568251312987E+06,       0.101366203167707048E+06,       0.101390159455080997E+06,
+        0.101413541104309363E+06,       0.101436670068180945E+06,       0.101459134145086064E+06,       0.101480579621756508E+06,       0.101500717501762701E+06,
+        0.101519330301993643E+06,       0.101536279443531355E+06,       0.101551434684382868E+06,       0.101564255195383463E+06,       0.101575422887434994E+06,
+        0.101586445548099669E+06,       0.101597902131166629E+06,       0.101610316943178666E+06,       0.101624105975331244E+06,       0.101639540620591506E+06,
+        0.101656731770743747E+06,       0.101674690803331439E+06,       0.101691335236531100E+06,       0.101707821449698851E+06,       0.101725245164068649E+06,
+        0.101743396815362881E+06,       0.101762005533747782E+06,       0.101780794703432257E+06,       0.101799566956391791E+06,       0.101816729089967106E+06,
+        0.101830810115947446E+06,       0.101843847767199652E+06,       0.101855309960108818E+06,       0.101865083082604426E+06,       0.101873349177960990E+06,
+        0.101880647099664595E+06,       0.101887932618480903E+06,       0.101897799286328358E+06,       0.101910318475203370E+06,       0.101923741945953618E+06,
+        0.101937617512615703E+06,       0.101951634884124011E+06,       0.101965709346062926E+06,       0.101980052214833602E+06,       0.101995075682068244E+06,
+        0.102012705906177565E+06,       0.102029916826673259E+06,       0.102045578980748891E+06,       0.102059048316380504E+06,       0.102069947174644665E+06,
+        0.102077684357740349E+06,       0.102082147312762972E+06,       0.102086500261915091E+06,       0.102089248935513198E+06,       0.102090698933738371E+06,
+        0.102091178364924752E+06,       0.102092701245381337E+06,       0.102093815457381104E+06,       0.102094368575754212E+06,       0.102094331459262947E+06,
+        0.102093649378548696E+06,       0.102091495160413397E+06,       0.102088077118329078E+06,       0.102085266715555787E+06,       0.102082068081696532E+06,
+        0.102078934857918081E+06,       0.102075562114887900E+06,       0.102070631820974115E+06,       0.102064438122544176E+06,       0.102059414174384161E+06,
+        0.102053827822841413E+06,       0.102047097203453392E+06,       0.102038205276517619E+06,       0.102023970080276820E+06,       0.102005255572377879E+06,
+        0.101983545280989390E+06,       0.101959239559772468E+06,       0.101934934813177606E+06,       0.101909416211695381E+06,       0.101879530216405619E+06,
+        0.101843729384204227E+06,       0.101798771374156902E+06,       0.101749131431232046E+06,       0.101696435747962270E+06,       0.101638597439857098E+06,
+        0.101576958615739393E+06,       0.101514239708325505E+06,       0.101456190833159548E+06,       0.101399554349585407E+06,       0.101340424142701784E+06,
+        0.101280446676456311E+06,       0.101219442303719290E+06,       0.101155802903883246E+06,       0.101085010925495619E+06,       0.101016127520053677E+06,
+        0.100949559692596478E+06,       0.100889898302085116E+06,       0.100844209040313392E+06,       0.100816129681629769E+06,       0.100810501379105452E+06,
+        0.100832591111220638E+06,       0.100879523722449056E+06,       0.100948063089510324E+06,       0.101031460853947981E+06,       0.101115973986060417E+06,
+        0.101184231818201646E+06,       0.101240245990651732E+06,       0.101276004337181133E+06,       0.101297693264287940E+06,       0.101316108838536718E+06,
+        0.101339338207326771E+06,       0.101364838726589573E+06,       0.101398212697034352E+06,       0.101435020262566584E+06,       0.101474120214935858E+06,
+        0.101515374742090018E+06,       0.101554913896900893E+06,       0.101585525309637247E+06,       0.101596313029333352E+06,       0.101591763310596391E+06,
+        0.101572063905601564E+06,       0.101533915795807872E+06,       0.101488864498615381E+06,       0.101440950048410057E+06,       0.101401964815710235E+06,
+        0.101362939393266570E+06,       0.101319118725317487E+06,       0.101264253224874032E+06,       0.101194604583161839E+06,       0.101119529697804493E+06,
+        0.101043148821796305E+06,       0.100969817218776385E+06,       0.100904222807714512E+06,       0.100845424566366739E+06,       0.100792297539129795E+06,
+        0.100746429506127941E+06,       0.100716119483396033E+06,       0.100699086889567552E+06,       0.100699855109205411E+06,       0.100707310375888119E+06,
+        0.100716570575528633E+06,       0.100720007898216936E+06,       0.100714797932772417E+06,       0.100695727134459230E+06,       0.100662985850684985E+06,
+        0.100623495462979961E+06,       0.100579571082265902E+06,       0.100528287659914175E+06,       0.100483047690553038E+06,       0.100446858129451386E+06,
+        0.100420432087088702E+06,       0.100404117469529898E+06,       0.100397105480157465E+06,       0.100403234638665162E+06,       0.100415020179178769E+06,
+        0.100433067114222082E+06,       0.100451452530888302E+06,       0.100468854497717490E+06,       0.100484113018387754E+06,       0.100496513635322510E+06,
+        0.100504396642556661E+06,       0.100514796346128511E+06,       0.100524493045942218E+06,       0.100532404153307187E+06,       0.100538289704171490E+06,
+        0.101276336252575435E+06,       0.101298080414544456E+06,       0.101321469561098274E+06,       0.101347127563797287E+06,       0.101375017595738012E+06,
+        0.101402741686854177E+06,       0.101429372639699533E+06,       0.101455094154428705E+06,       0.101479936738935212E+06,       0.101503527247806051E+06,
+        0.101525558424067625E+06,       0.101545795970329476E+06,       0.101564086253569083E+06,       0.101579860400036196E+06,       0.101592656313919491E+06,
+        0.101604222243081458E+06,       0.101615370617936293E+06,       0.101626717204329048E+06,       0.101638824013794816E+06,       0.101652144675515985E+06,
+        0.101666986413953739E+06,       0.101683491567268982E+06,       0.101699730410034434E+06,       0.101715308981035720E+06,       0.101731361440654102E+06,
+        0.101748589449732390E+06,       0.101766824698764540E+06,       0.101785841910313233E+06,       0.101805411629659066E+06,       0.101825381837012450E+06,
+        0.101846839764007193E+06,       0.101867081140515147E+06,       0.101882747001865355E+06,       0.101896903928888263E+06,       0.101909362288120537E+06,
+        0.101920245934517079E+06,       0.101930058238641242E+06,       0.101941637442764200E+06,       0.101954785426383867E+06,       0.101968215450878924E+06,
+        0.101984710778129607E+06,       0.102001549965592465E+06,       0.102018275841846422E+06,       0.102034683222590960E+06,       0.102052401989689286E+06,
+        0.102069645673240069E+06,       0.102086007650836211E+06,       0.102103768116502732E+06,       0.102121127630333416E+06,       0.102135973777942898E+06,
+        0.102147987937177197E+06,       0.102156601874315427E+06,       0.102161672760610920E+06,       0.102163612354316181E+06,       0.102165768392921964E+06,
+        0.102167214431077227E+06,       0.102169260247518920E+06,       0.102170746287005837E+06,       0.102171480626503515E+06,       0.102171269145651808E+06,
+        0.102170214520413967E+06,       0.102167256562754847E+06,       0.102162479386098232E+06,       0.102158371150627951E+06,       0.102155244448894475E+06,
+        0.102152875264177637E+06,       0.102149492287714515E+06,       0.102145495391175835E+06,       0.102139392366010521E+06,       0.102131234162350753E+06,
+        0.102121845495369198E+06,       0.102114444604303775E+06,       0.102106462190456019E+06,       0.102096364075651625E+06,       0.102082958297694466E+06,
+        0.102064065966768365E+06,       0.102041420899050965E+06,       0.102016297892142000E+06,       0.101989261194259234E+06,       0.101963193901333740E+06,
+        0.101934697827006079E+06,       0.101902018630394974E+06,       0.101863893013675159E+06,       0.101820477410193009E+06,       0.101774528513823985E+06,
+        0.101724002882111308E+06,       0.101665763047983230E+06,       0.101603648801794363E+06,       0.101540096977050402E+06,       0.101478947206942044E+06,
+        0.101415470097827929E+06,       0.101351609294201058E+06,       0.101289469642166499E+06,       0.101226537327552069E+06,       0.101158605139549531E+06,
+        0.101091671283985226E+06,       0.101026501778518956E+06,       0.100963906622713315E+06,       0.100912235109733156E+06,       0.100875156448926034E+06,
+        0.100858092199168052E+06,       0.100869196724643829E+06,       0.100906258192389359E+06,       0.100966643545000639E+06,       0.101044871026198045E+06,
+        0.101126128294873750E+06,       0.101195519846174895E+06,       0.101255659962385485E+06,       0.101297057174446716E+06,       0.101328131549875659E+06,
+        0.101358621176643224E+06,       0.101392239138290606E+06,       0.101427359701943147E+06,       0.101468500213009858E+06,       0.101510703720686288E+06,
+        0.101550908563824967E+06,       0.101587166287520682E+06,       0.101619760493459311E+06,       0.101640375989610111E+06,       0.101647164822681414E+06,
+        0.101640476796716728E+06,       0.101620225665346763E+06,       0.101589549071868416E+06,       0.101551044697311809E+06,       0.101511563682290900E+06,
+        0.101475939268223781E+06,       0.101437438003792078E+06,       0.101392805212183681E+06,       0.101332702985176016E+06,       0.101262976832194923E+06,
+        0.101186444126810515E+06,       0.101108333464266703E+06,       0.101034512676034472E+06,       0.100963849818957518E+06,       0.100898562106253885E+06,
+        0.100842056459041982E+06,       0.100798749608423153E+06,       0.100767148703609448E+06,       0.100745027122654850E+06,       0.100731425417328996E+06,
+        0.100731821012642424E+06,       0.100734592849697350E+06,       0.100733986756515151E+06,       0.100727026999971698E+06,       0.100711618349869153E+06,
+        0.100683470368124676E+06,       0.100640250766840603E+06,       0.100586314437398818E+06,       0.100534961959011474E+06,       0.100490642055552060E+06,
+        0.100456264076438296E+06,       0.100432289810027520E+06,       0.100419632142970615E+06,       0.100423645734029778E+06,       0.100432024957258123E+06,
+        0.100442709528904365E+06,       0.100454138069834065E+06,       0.100469282754753091E+06,       0.100483179206656147E+06,       0.100494317659240289E+06,
+        0.100501048475271105E+06,       0.100503737147053136E+06,       0.100502939624753810E+06,       0.100506864511892840E+06,       0.100510205922212830E+06,
+        0.100511985008099888E+06,       0.101269395817640194E+06,       0.101293433370600033E+06,       0.101320709064215349E+06,       0.101350720216622271E+06,
+        0.101381363474586935E+06,       0.101411901774678990E+06,       0.101441702408660596E+06,       0.101470286272251309E+06,       0.101497612121933402E+06,
+        0.101523409436511720E+06,       0.101547349710601979E+06,       0.101569178391354450E+06,       0.101588382552830284E+06,       0.101604424454005639E+06,
+        0.101617806496970152E+06,       0.101629009202247544E+06,       0.101639790736640862E+06,       0.101650653799515901E+06,       0.101662034467563892E+06,
+        0.101674429962589624E+06,       0.101688184881771667E+06,       0.101701776789907686E+06,       0.101715632368359467E+06,       0.101731005396025357E+06,
+        0.101747619021182472E+06,       0.101764475149160600E+06,       0.101782565451806455E+06,       0.101801692572504733E+06,       0.101821649291101741E+06,
+        0.101844372908615100E+06,       0.101868013490669473E+06,       0.101890926735153276E+06,       0.101912734436730447E+06,       0.101930521333358061E+06,
+        0.101945955049482625E+06,       0.101959618341155976E+06,       0.101973842306752718E+06,       0.101990092943988522E+06,       0.102006492234429417E+06,
+        0.102022981199823858E+06,       0.102039845835770568E+06,       0.102059553276874620E+06,       0.102079331788742449E+06,       0.102099902964415654E+06,
+        0.102120532959564909E+06,       0.102140448801236460E+06,       0.102159255793075747E+06,       0.102176879448503649E+06,       0.102194365868866342E+06,
+        0.102211106097444455E+06,       0.102224803244153038E+06,       0.102234823789642047E+06,       0.102240968923527806E+06,       0.102243570541519104E+06,
+        0.102243519688579676E+06,       0.102244750868611838E+06,       0.102246759472131700E+06,       0.102247988131721504E+06,       0.102248209161490959E+06,
+        0.102247170632681489E+06,       0.102243247319650705E+06,       0.102236753031268512E+06,       0.102230982493940493E+06,       0.102226187707310237E+06,
+        0.102222666096639834E+06,       0.102220567141386651E+06,       0.102219855956292071E+06,       0.102215511479397683E+06,       0.102208434908867741E+06,
+        0.102198721169081880E+06,       0.102186789184960857E+06,       0.102174609249495770E+06,       0.102164550205667154E+06,       0.102152502370517235E+06,
+        0.102137501608386214E+06,       0.102118919702411848E+06,       0.102095889999392573E+06,       0.102070100404917495E+06,       0.102041997958624415E+06,
+        0.102012090612610089E+06,       0.101983710969351829E+06,       0.101953137519082840E+06,       0.101920734120792738E+06,       0.101883717982373681E+06,
+        0.101842973734119500E+06,       0.101798428245916861E+06,       0.101747102066966778E+06,       0.101687602338869881E+06,       0.101624664318831565E+06,
+        0.101559707946739305E+06,       0.101491658640950249E+06,       0.101420567276357397E+06,       0.101354355882096454E+06,       0.101289435543346961E+06,
+        0.101224098024003702E+06,       0.101159952737485408E+06,       0.101097956680038245E+06,       0.101035227047009626E+06,       0.100981546520210177E+06,
+        0.100939244847484995E+06,       0.100914786575781181E+06,       0.100915867157493747E+06,       0.100942559164277671E+06,       0.100993021366280096E+06,
+        0.101062207385378511E+06,       0.101136754321606641E+06,       0.101205153055716102E+06,       0.101267549676815237E+06,       0.101315566331653798E+06,
+        0.101356986952566978E+06,       0.101400109049254897E+06,       0.101444047042664242E+06,       0.101488513133860251E+06,       0.101534593023339607E+06,
+        0.101578862893253303E+06,       0.101617989104461085E+06,       0.101651469070145307E+06,       0.101676676962902973E+06,       0.101688426206951568E+06,
+        0.101690699198194692E+06,       0.101681585082600272E+06,       0.101660802224054729E+06,       0.101632322368388574E+06,       0.101602214382015110E+06,
+        0.101577248018812563E+06,       0.101546577483431887E+06,       0.101509347660459607E+06,       0.101460277851145336E+06,       0.101400695177468675E+06,
+        0.101333061941295062E+06,       0.101259893373003069E+06,       0.101185498750814251E+06,       0.101111060613673137E+06,       0.101038806163680754E+06,
+        0.100970853556921851E+06,       0.100913205537255504E+06,       0.100868081185120318E+06,       0.100831661076531760E+06,       0.100803490881640522E+06,
+        0.100782858759036229E+06,       0.100767010800255986E+06,       0.100760517927946479E+06,       0.100755313595541767E+06,       0.100745011420950410E+06,
+        0.100727337942231010E+06,       0.100696437123156371E+06,       0.100650083823098379E+06,       0.100597278983266224E+06,       0.100548413676936747E+06,
+        0.100507765427222563E+06,       0.100477948430878227E+06,       0.100463614942480534E+06,       0.100466404104801695E+06,       0.100473340681007379E+06,
+        0.100482742216284692E+06,       0.100492637659898319E+06,       0.100501306119762710E+06,       0.100508155310289090E+06,       0.100517896956254641E+06,
+        0.100523967020314361E+06,       0.100525551437862276E+06,       0.100522692726944748E+06,       0.100516008939190593E+06,       0.100506617021169775E+06,
+        0.100504130401290677E+06,       0.100500855757604397E+06,       0.101259195015618316E+06,       0.101287394131248599E+06,       0.101318624387393094E+06,
+        0.101351388311065471E+06,       0.101384848445848693E+06,       0.101418230695586331E+06,       0.101450864090695264E+06,       0.101482215379592511E+06,
+        0.101512000328888942E+06,       0.101540081556911420E+06,       0.101565958007626774E+06,       0.101589239793549044E+06,       0.101609354590231524E+06,
+        0.101626245425942194E+06,       0.101640116415258730E+06,       0.101651384047841973E+06,       0.101660624537901342E+06,       0.101669864682349900E+06,
+        0.101680046518619303E+06,       0.101691016789836227E+06,       0.101701600972581538E+06,       0.101712344116073305E+06,       0.101724596034016693E+06,
+        0.101738626214170567E+06,       0.101754578760972465E+06,       0.101772464174383247E+06,       0.101790289256249525E+06,       0.101809225095436283E+06,
+        0.101831409086778760E+06,       0.101855713865937665E+06,       0.101880304248738481E+06,       0.101904708267321548E+06,       0.101928659429272666E+06,
+        0.101952215895369998E+06,       0.101973129343184191E+06,       0.101990492819853054E+06,       0.102009155453432861E+06,       0.102028626658851339E+06,
+        0.102048465714061036E+06,       0.102068480817810836E+06,       0.102088846460710702E+06,       0.102110232566220016E+06,       0.102133295641766570E+06,
+        0.102157356921516912E+06,       0.102181314870907911E+06,       0.102204374004590238E+06,       0.102226000444488978E+06,       0.102246017656184413E+06,
+        0.102265607213167954E+06,       0.102282589184103534E+06,       0.102298432423255334E+06,       0.102310352702715958E+06,       0.102317999706446251E+06,
+        0.102321598850661234E+06,       0.102323515138576258E+06,       0.102323197704490987E+06,       0.102322212878332677E+06,       0.102323063816814887E+06,
+        0.102322646091264614E+06,       0.102319439183542258E+06,       0.102312970911412354E+06,       0.102304997794601848E+06,       0.102296841478971372E+06,
+        0.102291418130089238E+06,       0.102288360395478667E+06,       0.102288552237265947E+06,       0.102287701703575425E+06,       0.102284538846590702E+06,
+        0.102276897495121520E+06,       0.102265740813761135E+06,       0.102252134571836228E+06,       0.102237131022390793E+06,       0.102221272996986561E+06,
+        0.102206507054624482E+06,       0.102189132554294789E+06,       0.102168602609417649E+06,       0.102145544389345145E+06,       0.102118566149667124E+06,
+        0.102089083952633140E+06,       0.102057798140960163E+06,       0.102026969995698295E+06,       0.101997794023706476E+06,       0.101966743922712252E+06,
+        0.101933057167765714E+06,       0.101896592945729586E+06,       0.101857371791885336E+06,       0.101815607416803119E+06,       0.101763023383776948E+06,
+        0.101702407436462090E+06,       0.101635116047538351E+06,       0.101562945833011370E+06,       0.101485822606547168E+06,       0.101411005039628857E+06,
+        0.101339835091662317E+06,       0.101272689532459044E+06,       0.101210368076346276E+06,       0.101154473004817381E+06,       0.101097829928473817E+06,
+        0.101048482059940754E+06,       0.101007048910648111E+06,       0.100979473833055905E+06,       0.100973447727585182E+06,       0.100990584221201716E+06,
+        0.101029960997994902E+06,       0.101087951257948895E+06,       0.101153695183268181E+06,       0.101219018003879406E+06,       0.101282293838312820E+06,
+        0.101338465984178547E+06,       0.101391368230947162E+06,       0.101446772222011277E+06,       0.101500085973176334E+06,       0.101550853250171887E+06,
+        0.101598573456663202E+06,       0.101641988898670184E+06,       0.101679214186169236E+06,       0.101710098564568776E+06,       0.101732780885386266E+06,
+        0.101743179226637279E+06,       0.101740055966295447E+06,       0.101722994425650759E+06,       0.101700469255730888E+06,       0.101674123165238838E+06,
+        0.101653160060864204E+06,       0.101631596453806415E+06,       0.101607075787893336E+06,       0.101574486424828559E+06,       0.101526976419999381E+06,
+        0.101469612332252946E+06,       0.101404225279481514E+06,       0.101336714868594907E+06,       0.101267916935403031E+06,       0.101195492908750399E+06,
+        0.101123687793417601E+06,       0.101058751346724224E+06,       0.101000171416406578E+06,       0.100947653236097554E+06,       0.100904324965127365E+06,
+        0.100869022485961759E+06,       0.100838631774334179E+06,       0.100814997040174785E+06,       0.100796371893838630E+06,       0.100782994420463059E+06,
+        0.100767931078048772E+06,       0.100738709347425858E+06,       0.100699551218149616E+06,       0.100657848886243373E+06,       0.100613930496747955E+06,
+        0.100570328091677089E+06,       0.100536417956577148E+06,       0.100522106220241680E+06,       0.100523981788664518E+06,       0.100534576173254580E+06,
+        0.100544607428678122E+06,       0.100555100707554739E+06,       0.100564477570051735E+06,       0.100571044680449282E+06,       0.100573984997784108E+06,
+        0.100574098036419746E+06,       0.100574969682196417E+06,       0.100570985693230745E+06,       0.100562235725965831E+06,       0.100549403090203457E+06,
+        0.100533663303323410E+06,       0.100514985690890928E+06,       0.100501506969102309E+06,       0.101247028543607215E+06,       0.101279000272323727E+06,
+        0.101313044900483452E+06,       0.101348706117229129E+06,       0.101385099864543183E+06,       0.101421406335684835E+06,       0.101456908730823867E+06,
+        0.101491027169870344E+06,       0.101523346965489472E+06,       0.101553641131603319E+06,       0.101581591041353255E+06,       0.101606456037034135E+06,
+        0.101627802489960915E+06,       0.101645553091339185E+06,       0.101659871959589625E+06,       0.101671125963614424E+06,       0.101679833672676948E+06,
+        0.101686600287344059E+06,       0.101693249899754504E+06,       0.101700828771449567E+06,       0.101708214676399468E+06,       0.101716786788727914E+06,
+        0.101726994188702083E+06,       0.101739189978545895E+06,       0.101753597010140846E+06,       0.101770294478413707E+06,       0.101789229323241438E+06,
+        0.101810439881563492E+06,       0.101833551125124432E+06,       0.101857745342370516E+06,       0.101882520275840274E+06,       0.101907489508364233E+06,
+        0.101932461599410264E+06,       0.101957552146214075E+06,       0.101983305456973438E+06,       0.102008579834297911E+06,       0.102030494060992147E+06,
+        0.102053548115608966E+06,       0.102077104427164624E+06,       0.102100783210934751E+06,       0.102124584361851768E+06,       0.102151618960978216E+06,
+        0.102178487299050277E+06,       0.102203837934088209E+06,       0.102231789811787370E+06,       0.102258565924026567E+06,       0.102283435612743153E+06,
+        0.102308168911264584E+06,       0.102331519967324959E+06,       0.102351306090243161E+06,       0.102367344163488393E+06,       0.102380956720203612E+06,
+        0.102390540926741916E+06,       0.102396561280422888E+06,       0.102399644414793191E+06,       0.102399967479044542E+06,       0.102398097050173761E+06,
+        0.102394877934586664E+06,       0.102392579382061362E+06,       0.102387437885771593E+06,       0.102380474134807795E+06,       0.102372089234619867E+06,
+        0.102363087167973557E+06,       0.102355720695108947E+06,       0.102355336216227777E+06,       0.102355244528026058E+06,       0.102353863384518510E+06,
+        0.102349945815737563E+06,       0.102342442703922468E+06,       0.102329934370864139E+06,       0.102314612359457431E+06,       0.102297370131901000E+06,
+        0.102278388120427626E+06,       0.102257491551240819E+06,       0.102236307907230104E+06,       0.102213097347429662E+06,       0.102187800432568954E+06,
+        0.102160229919730293E+06,       0.102129097981842890E+06,       0.102096889363146300E+06,       0.102063827052134482E+06,       0.102031184486610946E+06,
+        0.101999264622467439E+06,       0.101966221591490219E+06,       0.101931754343580265E+06,       0.101897700536754972E+06,       0.101861993529889558E+06,
+        0.101819636716650479E+06,       0.101763615901241341E+06,       0.101697976370488861E+06,       0.101620393736143524E+06,       0.101535102872161384E+06,
+        0.101449253069692393E+06,       0.101374420264238244E+06,       0.101306501858255855E+06,       0.101247778577939956E+06,       0.101198381473636808E+06,
+        0.101152064836353820E+06,       0.101110344624142366E+06,       0.101075281561938828E+06,       0.101049407554255304E+06,       0.101040768998780331E+06,
+        0.101052199471517510E+06,       0.101082392815890635E+06,       0.101129144157533199E+06,       0.101184092780294726E+06,       0.101243772906750455E+06,
+        0.101307121999288836E+06,       0.101369991062098430E+06,       0.101433698297000723E+06,       0.101498903828178067E+06,       0.101560474018943947E+06,
+        0.101615857050411636E+06,       0.101665138596523073E+06,       0.101705590047241931E+06,       0.101738943786932854E+06,       0.101767114003134644E+06,
+        0.101789192730629773E+06,       0.101799147989736230E+06,       0.101794735430608300E+06,       0.101777146397531964E+06,       0.101750372193384130E+06,
+        0.101723141667504169E+06,       0.101702833712477848E+06,       0.101682678205011733E+06,       0.101660302359832262E+06,       0.101630633216063026E+06,
+        0.101590584748240784E+06,       0.101537939783765964E+06,       0.101477184750419154E+06,       0.101412613988421668E+06,       0.101346432956553763E+06,
+        0.101280354991399392E+06,       0.101215950742003886E+06,       0.101152407700542390E+06,       0.101091630971862964E+06,       0.101034381306262483E+06,
+        0.100980581565512359E+06,       0.100932607474756849E+06,       0.100894526231033058E+06,       0.100863524006721316E+06,       0.100837940986693153E+06,
+        0.100815616712752075E+06,       0.100783831314269482E+06,       0.100747340055464098E+06,       0.100708359519305974E+06,       0.100669700349442544E+06,
+        0.100634134123292621E+06,       0.100602055798299742E+06,       0.100591037034284673E+06,       0.100590664657868474E+06,       0.100599127748830913E+06,
+        0.100614596189110918E+06,       0.100634150489947802E+06,       0.100646345748706677E+06,       0.100655865724535965E+06,       0.100661116257080008E+06,
+        0.100661028163947834E+06,       0.100655523835145024E+06,       0.100646490601253885E+06,       0.100636711851892294E+06,       0.100621894936014534E+06,
+        0.100602810704563395E+06,       0.100576368488764041E+06,       0.100548286166395032E+06,       0.100522977180969814E+06,       0.101228903510937074E+06,
+        0.101265781795862422E+06,       0.101303509185958625E+06,       0.101342284425688282E+06,       0.101381796177970391E+06,       0.101421170386188518E+06,
+        0.101459636817675681E+06,       0.101496562449942183E+06,       0.101531479594885182E+06,       0.101564960000747014E+06,       0.101594803080993937E+06,
+        0.101621355790812595E+06,       0.101644027594565501E+06,       0.101662677874236993E+06,       0.101677441926593165E+06,       0.101688651352830973E+06,
+        0.101696785059940390E+06,       0.101702406683447451E+06,       0.101704728868073435E+06,       0.101705248359237783E+06,       0.101710033061244059E+06,
+        0.101715986265950589E+06,       0.101723653592966657E+06,       0.101733480291010681E+06,       0.101745772459652580E+06,       0.101760677660607515E+06,
+        0.101780220410703594E+06,       0.101803075598452182E+06,       0.101826488604444239E+06,       0.101849820362239523E+06,       0.101873892351949500E+06,
+        0.101898378960095564E+06,       0.101923130766489805E+06,       0.101948518897807691E+06,       0.101975696258303404E+06,       0.102004061929304342E+06,
+        0.102033460145040677E+06,       0.102061651327409054E+06,       0.102089414327740989E+06,       0.102117077133701037E+06,       0.102147883501053424E+06,
+        0.102180718015203005E+06,       0.102212493723892243E+06,       0.102242559046992334E+06,       0.102271049350391899E+06,       0.102300915058795246E+06,
+        0.102331227250506359E+06,       0.102361003675242988E+06,       0.102387797529886448E+06,       0.102410738749007287E+06,       0.102429543001075872E+06,
+        0.102444601309541205E+06,       0.102455934113666241E+06,       0.102463826248762096E+06,       0.102468461440316110E+06,       0.102469870975073049E+06,
+        0.102468446450288320E+06,       0.102464798290121791E+06,       0.102458449322550092E+06,       0.102451735051873286E+06,       0.102444849067868476E+06,
+        0.102436636367539046E+06,       0.102428988993985171E+06,       0.102425331914020266E+06,       0.102421620005855337E+06,       0.102419560924305013E+06,
+        0.102417115927208128E+06,       0.102411283378863518E+06,       0.102401124644854805E+06,       0.102388294546935547E+06,       0.102372130138911380E+06,
+        0.102352872703988251E+06,       0.102330900792506814E+06,       0.102305906692453034E+06,       0.102278836660343848E+06,       0.102251891886031619E+06,
+        0.102223352000414103E+06,       0.102193067106830058E+06,       0.102161078903831076E+06,       0.102125912821954276E+06,       0.102089510678556544E+06,
+        0.102052507421496150E+06,       0.102015228902546209E+06,       0.101978931284532373E+06,       0.101944546111379605E+06,       0.101912474602996255E+06,
+        0.101881505541306557E+06,       0.101847220983536259E+06,       0.101796545763435774E+06,       0.101731194445780915E+06,       0.101655521374345393E+06,
+        0.101570254785904996E+06,       0.101481522317187802E+06,       0.101401331116195521E+06,       0.101332141668882890E+06,       0.101273993470810659E+06,
+        0.101228638656778901E+06,       0.101190604276845741E+06,       0.101158196197344718E+06,       0.101133936056759660E+06,       0.101117981664703751E+06,
+        0.101116933850947476E+06,       0.101131399795691948E+06,       0.101160604644423380E+06,       0.101201518443580746E+06,       0.101248903707713456E+06,
+        0.101300592974865489E+06,       0.101357214090897702E+06,       0.101418441744321666E+06,       0.101485557443350626E+06,       0.101555445746166064E+06,
+        0.101621303501475879E+06,       0.101679228518906544E+06,       0.101728241686716501E+06,       0.101766854072509333E+06,       0.101798436487011495E+06,
+        0.101826906634104991E+06,       0.101847291990324695E+06,       0.101856878275200172E+06,       0.101852227620230362E+06,       0.101834698267214306E+06,
+        0.101809239675292964E+06,       0.101781969547875371E+06,       0.101755152512939356E+06,       0.101732931589822008E+06,       0.101712653074247995E+06,
+        0.101684830999865546E+06,       0.101647239704296619E+06,       0.101599826041378212E+06,       0.101544653396053778E+06,       0.101483464700333992E+06,
+        0.101420696082338764E+06,       0.101361355157000173E+06,       0.101303077019503457E+06,       0.101242949922489031E+06,       0.101180470229611776E+06,
+        0.101117365765681796E+06,       0.101054059738264114E+06,       0.100995066688862426E+06,       0.100946512981860345E+06,       0.100908291761953325E+06,
+        0.100873905402216697E+06,       0.100835045455127693E+06,       0.100798873170272855E+06,       0.100762695696108858E+06,       0.100726025871425081E+06,
+        0.100692734909454986E+06,       0.100668902864702948E+06,       0.100663213502720391E+06,       0.100664621390201341E+06,       0.100671374502519597E+06,
+        0.100685680453359950E+06,       0.100705798123986984E+06,       0.100728995575579524E+06,       0.100751658112675097E+06,       0.100762519462763623E+06,
+        0.100767027529124854E+06,       0.100764553224004907E+06,       0.100755187738630775E+06,       0.100739605979863540E+06,       0.100720551089520799E+06,
+        0.100698313533178705E+06,       0.100666865056198847E+06,       0.100634031483894869E+06,       0.100601785153826728E+06,       0.100571987820731039E+06,
+        0.101206374045435979E+06,       0.101245886159229500E+06,       0.101288633787391896E+06,       0.101331822184275137E+06,       0.101374720391458119E+06,
+        0.101417383823794662E+06,       0.101458981013573735E+06,       0.101498818874093005E+06,       0.101538685205643225E+06,       0.101575422468180957E+06,
+        0.101607594064004836E+06,       0.101634787525358639E+06,       0.101658391829702683E+06,       0.101677992927276675E+06,       0.101693216382147584E+06,
+        0.101704372381742840E+06,       0.101711917535928253E+06,       0.101714961207000641E+06,       0.101714465004361307E+06,       0.101712311040969114E+06,
+        0.101709673671424040E+06,       0.101711218999391320E+06,       0.101715783535561670E+06,       0.101722657082666818E+06,       0.101732238893442816E+06,
+        0.101747062236834958E+06,       0.101766365174287086E+06,       0.101787109475394507E+06,       0.101808925705709073E+06,       0.101831553485340701E+06,
+        0.101854101136956699E+06,       0.101876977318564983E+06,       0.101900071328279475E+06,       0.101924414875452247E+06,       0.101951462468272264E+06,
+        0.101980975232741199E+06,       0.102012836826491402E+06,       0.102047258491401968E+06,       0.102083474297558190E+06,       0.102117469380506620E+06,
+        0.102154658530511195E+06,       0.102192659983700083E+06,       0.102229894335694480E+06,       0.102265384438205918E+06,       0.102298947455958070E+06,
+        0.102332733340180333E+06,       0.102366161911789881E+06,       0.102400223366988168E+06,       0.102430989231899657E+06,       0.102457385343324306E+06,
+        0.102478953671150099E+06,       0.102497140263958892E+06,       0.102511039792962809E+06,       0.102520299291871444E+06,       0.102526846630820248E+06,
+        0.102529945588383314E+06,       0.102529752833756676E+06,       0.102527108906249603E+06,       0.102521410242623388E+06,       0.102513405849115865E+06,
+        0.102504764193898140E+06,       0.102498120743343170E+06,       0.102494756241843366E+06,       0.102491412904970945E+06,       0.102487349910826408E+06,
+        0.102482003045019752E+06,       0.102474975478072651E+06,       0.102465362858837878E+06,       0.102453624922867719E+06,       0.102439388282147716E+06,
+        0.102422313370157048E+06,       0.102401857750208626E+06,       0.102377162061003954E+06,       0.102349188460773526E+06,       0.102318424237125233E+06,
+        0.102285363297180986E+06,       0.102252385208010586E+06,       0.102218029776633513E+06,       0.102181810380545387E+06,       0.102143591228429039E+06,
+        0.102102341867038209E+06,       0.102057770995654748E+06,       0.102012593759546347E+06,       0.101970748503609808E+06,       0.101933725108693834E+06,
+        0.101900789684666524E+06,       0.101867979870800904E+06,       0.101834235978935918E+06,       0.101794954568116285E+06,       0.101739484665823096E+06,
+        0.101671789500483821E+06,       0.101593418617286006E+06,       0.101506698290483502E+06,       0.101422237896336897E+06,       0.101350833220772416E+06,
+        0.101290575286891341E+06,       0.101248402171152557E+06,       0.101218529092999917E+06,       0.101197447450399108E+06,       0.101187612570890138E+06,
+        0.101185871864261528E+06,       0.101196499134288402E+06,       0.101218353571942265E+06,       0.101249194623964548E+06,       0.101286372345386742E+06,
+        0.101326464875508391E+06,       0.101369986766969960E+06,       0.101419749853660280E+06,       0.101476722498559480E+06,       0.101542829739890207E+06,
+        0.101612522924097197E+06,       0.101678721249810798E+06,       0.101737575823144638E+06,       0.101785395492746917E+06,       0.101823368561408701E+06,
+        0.101856014056084430E+06,       0.101884313206989173E+06,       0.101903695929922687E+06,       0.101912969317636380E+06,       0.101908832298462992E+06,
+        0.101892237038585794E+06,       0.101866203497664581E+06,       0.101837081196005645E+06,       0.101809606048398258E+06,       0.101786840568731568E+06,
+        0.101762564033379982E+06,       0.101734680154915579E+06,       0.101696592635540685E+06,       0.101650662453849189E+06,       0.101599162120752633E+06,
+        0.101544343001196743E+06,       0.101488647544765059E+06,       0.101433089123172278E+06,       0.101377125096785036E+06,       0.101320042947392227E+06,
+        0.101256674805424394E+06,       0.101187987297748215E+06,       0.101120641997896339E+06,       0.101056247927954246E+06,       0.100996331972370142E+06,
+        0.100943232428022544E+06,       0.100895353842840079E+06,       0.100852555312220196E+06,       0.100815337064243067E+06,       0.100783799781542155E+06,
+        0.100753868748835012E+06,       0.100736637044447663E+06,       0.100730650096307727E+06,       0.100733232093861763E+06,       0.100743913291446443E+06,
+        0.100758835470579754E+06,       0.100778259316407013E+06,       0.100802567061591370E+06,       0.100828283762383522E+06,       0.100855135515023372E+06,
+        0.100877691529341333E+06,       0.100882602938691591E+06,       0.100878787688210650E+06,       0.100866582130667157E+06,       0.100846949291204379E+06,
+        0.100815418882725819E+06,       0.100780247866813195E+06,       0.100745087245795497E+06,       0.100709396490561645E+06,       0.100675020472311327E+06,
+        0.100643622948665085E+06,       0.101179250397845899E+06,       0.101221149498052953E+06,       0.101266816356343159E+06,       0.101315335097978430E+06,
+        0.101363838550262313E+06,       0.101410108301517408E+06,       0.101455090720967710E+06,       0.101501448789654576E+06,       0.101545139345543692E+06,
+        0.101584741389399278E+06,       0.101619452976458153E+06,       0.101648772604086349E+06,       0.101672509578882498E+06,       0.101691865395895249E+06,
+        0.101707555892752804E+06,       0.101718643945821881E+06,       0.101724156365132570E+06,       0.101724941937858879E+06,       0.101722568702130273E+06,
+        0.101718069834871334E+06,       0.101712578971246767E+06,       0.101707223787895346E+06,       0.101704839789861668E+06,       0.101708104689497137E+06,
+        0.101716865742578157E+06,       0.101731053443752840E+06,       0.101746952161869922E+06,       0.101764257279303914E+06,       0.101782706182959490E+06,
+        0.101802123848941148E+06,       0.101822482313672357E+06,       0.101842936616784311E+06,       0.101860934973268697E+06,       0.101882854305976114E+06,
+        0.101908552344231415E+06,       0.101937813400383588E+06,       0.101970499454458186E+06,       0.102006741063404974E+06,       0.102048298491096837E+06,
+        0.102094559383243701E+06,       0.102138864116678858E+06,       0.102182980858368159E+06,       0.102226517702417070E+06,       0.102268076174545422E+06,
+        0.102309052474061144E+06,       0.102352381321886001E+06,       0.102391102131696549E+06,       0.102425199358256839E+06,       0.102458541492672259E+06,
+        0.102488862618142084E+06,       0.102514290917361213E+06,       0.102535791702452596E+06,       0.102552503476764061E+06,       0.102564543232835902E+06,
+        0.102572720164328770E+06,       0.102578198051091356E+06,       0.102580323990135614E+06,       0.102579265394634727E+06,       0.102574962647335808E+06,
+        0.102568059504060235E+06,       0.102560319977754334E+06,       0.102556118504191676E+06,       0.102553057067685237E+06,       0.102550069919232395E+06,
+        0.102545676460258372E+06,       0.102538438321503912E+06,       0.102526558414006213E+06,       0.102512331043456594E+06,       0.102498934035030790E+06,
+        0.102483367837719314E+06,       0.102465528571415576E+06,       0.102444019300123240E+06,       0.102417539855634386E+06,       0.102386941153851396E+06,
+        0.102352803854769852E+06,       0.102315908735629360E+06,       0.102276253891919623E+06,       0.102235698643740441E+06,       0.102193754813942534E+06,
+        0.102149197092732255E+06,       0.102100466547888893E+06,       0.102048387340808171E+06,       0.101995636407850165E+06,       0.101944784700201388E+06,
+        0.101899202783926419E+06,       0.101857839910913841E+06,       0.101822276933475470E+06,       0.101792037001853430E+06,       0.101761456733915693E+06,
+        0.101723124817417673E+06,       0.101667540093368385E+06,       0.101602052196997916E+06,       0.101524286713149719E+06,       0.101443448254745468E+06,
+        0.101372151184877337E+06,       0.101312547429677303E+06,       0.101270741733953284E+06,       0.101245862300696550E+06,       0.101237403284129323E+06,
+        0.101240955267019526E+06,       0.101253727619962054E+06,       0.101276647528408124E+06,       0.101307289777398546E+06,       0.101342096503173772E+06,
+        0.101377440256415284E+06,       0.101410859947128090E+06,       0.101445291144028568E+06,       0.101485896954639960E+06,       0.101536034363702740E+06,
+        0.101598275532425832E+06,       0.101665271864468625E+06,       0.101730455163620383E+06,       0.101789053839460757E+06,       0.101836451975671342E+06,
+        0.101875114449402914E+06,       0.101909841821580325E+06,       0.101937388731349492E+06,       0.101957316621074744E+06,       0.101965726747313485E+06,
+        0.101960066223235612E+06,       0.101941333444338321E+06,       0.101914153314528972E+06,       0.101884034639169928E+06,       0.101858023754631969E+06,
+        0.101832589987368483E+06,       0.101805510097226972E+06,       0.101772567651719524E+06,       0.101733410070028302E+06,       0.101687946616198518E+06,
+        0.101638303259297347E+06,       0.101588584508090702E+06,       0.101540424262528119E+06,       0.101488738611497931E+06,       0.101435260593399056E+06,
+        0.101375735107437940E+06,       0.101312542555417007E+06,       0.101246134029601395E+06,       0.101177277643560679E+06,       0.101109587858444022E+06,
+        0.101039831433180021E+06,       0.100972865937903305E+06,       0.100917142934489922E+06,       0.100872742649287640E+06,       0.100836992191858386E+06,
+        0.100811317083979215E+06,       0.100803167641532855E+06,       0.100798970012812904E+06,       0.100800172827859802E+06,       0.100809159254650964E+06,
+        0.100825090132632613E+06,       0.100846063732092007E+06,       0.100868925096583727E+06,       0.100895209549142979E+06,       0.100924583482422255E+06,
+        0.100954767114643226E+06,       0.100982762726865476E+06,       0.101000126944911273E+06,       0.100996312696391295E+06,       0.100980278059754797E+06,
+        0.100948675007578538E+06,       0.100912131109198177E+06,       0.100873893055713954E+06,       0.100836895686632663E+06,       0.100800840190763440E+06,
+        0.100766824999287084E+06,       0.100736390306808840E+06,       0.101147547908848283E+06,       0.101191548413107710E+06,       0.101239813004555443E+06,
+        0.101291456639815791E+06,       0.101345618815623297E+06,       0.101399848017628567E+06,       0.101452120246013321E+06,       0.101502531147260263E+06,
+        0.101549713655955595E+06,       0.101592520742368200E+06,       0.101630069264663078E+06,       0.101661769202013544E+06,       0.101687336031179409E+06,
+        0.101706783718499020E+06,       0.101720752729463624E+06,       0.101730352171304155E+06,       0.101734303682047248E+06,       0.101733803712048772E+06,
+        0.101729673880940856E+06,       0.101722933683541196E+06,       0.101714707079396278E+06,       0.101706119415995257E+06,       0.101698183703231305E+06,
+        0.101694443401773460E+06,       0.101701997679200067E+06,       0.101711622212974413E+06,       0.101722702839184887E+06,       0.101735051927557608E+06,
+        0.101748506288605597E+06,       0.101762966981866150E+06,       0.101778437616403622E+06,       0.101789127619601830E+06,       0.101803967912821841E+06,
+        0.101822592115495441E+06,       0.101845777685417066E+06,       0.101873478314957349E+06,       0.101905482242767845E+06,       0.101942888324591171E+06,
+        0.101988404530944768E+06,       0.102038702733784274E+06,       0.102092474242398283E+06,       0.102148032734040069E+06,       0.102199248899464394E+06,
+        0.102248915596860126E+06,       0.102302591874664358E+06,       0.102352656965704402E+06,       0.102397731646050539E+06,       0.102437448450124619E+06,
+        0.102472449474120032E+06,       0.102503421423363616E+06,       0.102532064367287210E+06,       0.102556777288245488E+06,       0.102576671821794167E+06,
+        0.102591572855277176E+06,       0.102602228863800672E+06,       0.102612279279788083E+06,       0.102616851593614643E+06,       0.102617893333235930E+06,
+        0.102615765691172550E+06,       0.102610441888248854E+06,       0.102607301386114821E+06,       0.102603993592939412E+06,       0.102600663908017392E+06,
+        0.102597488187445881E+06,       0.102592493791941044E+06,       0.102582466666192224E+06,       0.102569826273933562E+06,       0.102554713868615829E+06,
+        0.102537648672080177E+06,       0.102521039168448478E+06,       0.102503173475915130E+06,       0.102480635537613605E+06,       0.102452652573625455E+06,
+        0.102419350874903001E+06,       0.102382346399272821E+06,       0.102341612134553201E+06,       0.102297029075732309E+06,       0.102248948564059086E+06,
+        0.102198720030139870E+06,       0.102145758870677353E+06,       0.102088950595530157E+06,       0.102029051584965782E+06,       0.101967199226732264E+06,
+        0.101903210271600808E+06,       0.101842958311824055E+06,       0.101794271532633502E+06,       0.101756533651972539E+06,       0.101727257623922851E+06,
+        0.101703822910323244E+06,       0.101679786232533574E+06,       0.101644516695705548E+06,       0.101595106427152612E+06,       0.101536504683202511E+06,
+        0.101467865301457467E+06,       0.101405006154835806E+06,       0.101354849767181862E+06,       0.101317686662273423E+06,       0.101296595665381508E+06,
+        0.101290414819946876E+06,       0.101298257504082198E+06,       0.101319018351106934E+06,       0.101351193190044753E+06,       0.101389882715506814E+06,
+        0.101429774758297252E+06,       0.101465327153650665E+06,       0.101493697248690820E+06,       0.101519475777882981E+06,       0.101549278536429629E+06,
+        0.101589674862889879E+06,       0.101644437539602266E+06,       0.101707639653092512E+06,       0.101773446880721283E+06,       0.101832627929812195E+06,
+        0.101881326017934320E+06,       0.101922991773475122E+06,       0.101958375717528819E+06,       0.101986274837340650E+06,       0.102005491030983016E+06,
+        0.102011686815100737E+06,       0.102002038930530602E+06,       0.101979844500374034E+06,       0.101949713592872038E+06,       0.101919794688969385E+06,
+        0.101890097820657014E+06,       0.101860915631872151E+06,       0.101828511020572609E+06,       0.101792400720458652E+06,       0.101751700978283421E+06,
+        0.101705424659848417E+06,       0.101656344874022790E+06,       0.101609238060088639E+06,       0.101564980684227325E+06,       0.101522208207649019E+06,
+        0.101469412985671690E+06,       0.101412347630207965E+06,       0.101351832558558221E+06,       0.101288709894130297E+06,       0.101222062151738224E+06,
+        0.101149874038784459E+06,       0.101078002130177440E+06,       0.101009088984990114E+06,       0.100945974661293003E+06,       0.100898762938745946E+06,
+        0.100870562536964586E+06,       0.100856855516523385E+06,       0.100855450035140704E+06,       0.100864081929396765E+06,       0.100872263570757554E+06,
+        0.100886283473303847E+06,       0.100905686340654982E+06,       0.100926632293872623E+06,       0.100951268783756459E+06,       0.100980364613721176E+06,
+        0.101012594678026580E+06,       0.101045448177269616E+06,       0.101076054483113505E+06,       0.101101140326098612E+06,       0.101100763828566429E+06,
+        0.101077946327603815E+06,       0.101047158711316821E+06,       0.101011715736067359E+06,       0.100974871631289832E+06,       0.100939265943285602E+06,
+        0.100905758734950185E+06,       0.100874978764764266E+06,       0.100855175471442562E+06,       0.101111520792912168E+06,       0.101157325849907211E+06,
+        0.101207855335016298E+06,       0.101262234561872421E+06,       0.101320453238625094E+06,       0.101383611932041124E+06,       0.101446021580746979E+06,
+        0.101500639373333164E+06,       0.101551782605323038E+06,       0.101598222486408573E+06,       0.101638989420395039E+06,       0.101673403579343765E+06,
+        0.101701089807805052E+06,       0.101721974472240297E+06,       0.101735419880771398E+06,       0.101741369945130849E+06,       0.101743897808629612E+06,
+        0.101742267006478505E+06,       0.101736494037811004E+06,       0.101727612235604785E+06,       0.101716766590943007E+06,       0.101705114503249541E+06,
+        0.101695691907190470E+06,       0.101691082917827283E+06,       0.101688492565094857E+06,       0.101689693834759819E+06,       0.101694319117847946E+06,
+        0.101699984888099891E+06,       0.101706624023230441E+06,       0.101714209290037295E+06,       0.101714886189053461E+06,       0.101718477607258348E+06,
+        0.101727166805334680E+06,       0.101741942812281210E+06,       0.101762884060961267E+06,       0.101787922016469936E+06,       0.101818124304470504E+06,
+        0.101856144652932824E+06,       0.101902274632393572E+06,       0.101955219215111909E+06,       0.102013545239481187E+06,       0.102075989637765349E+06,
+        0.102141825734524129E+06,       0.102209412008951840E+06,       0.102271101455590702E+06,       0.102328905451065119E+06,       0.102380997966748007E+06,
+        0.102426592472327698E+06,       0.102466679017069036E+06,       0.102502492265674373E+06,       0.102531828163015132E+06,       0.102557693337524877E+06,
+        0.102581562159738140E+06,       0.102599817594232780E+06,       0.102617360456048831E+06,       0.102630533755776734E+06,       0.102638413398652745E+06,
+        0.102641585059017671E+06,       0.102641643207641609E+06,       0.102639909103140890E+06,       0.102637870663539637E+06,       0.102635390209430159E+06,
+        0.102632452553768846E+06,       0.102629055188468876E+06,       0.102622883797323870E+06,       0.102613396703866238E+06,       0.102601167982128070E+06,
+        0.102586228500797864E+06,       0.102570641502416736E+06,       0.102554342163336842E+06,       0.102534088219572732E+06,       0.102511041429401579E+06,
+        0.102481963706129696E+06,       0.102447121630716501E+06,       0.102407091340582192E+06,       0.102362401740888643E+06,       0.102313427305605088E+06,
+        0.102259555941640690E+06,       0.102201038299707958E+06,       0.102138783904224241E+06,       0.102073015852343407E+06,       0.102003417942998523E+06,
+        0.101925865118624715E+06,       0.101850155355117560E+06,       0.101780650482480312E+06,       0.101721528392427077E+06,       0.101678592950691062E+06,
+        0.101649600593305571E+06,       0.101630406458717945E+06,       0.101617445713840047E+06,       0.101603733747246617E+06,       0.101577149951594518E+06,
+        0.101547743780961551E+06,       0.101507738128132827E+06,       0.101462001737325336E+06,       0.101417253659172507E+06,       0.101379673252643261E+06,
+        0.101354722198341828E+06,       0.101344083982961922E+06,       0.101350090319994677E+06,       0.101372932240478462E+06,       0.101408874721438551E+06,
+        0.101453217513073498E+06,       0.101497802352511892E+06,       0.101536224569247846E+06,       0.101563019361021943E+06,       0.101582620293203203E+06,
+        0.101603379870639314E+06,       0.101634664417891821E+06,       0.101681132562699248E+06,       0.101739502773358443E+06,       0.101803164120008223E+06,
+        0.101863683127456912E+06,       0.101917393438978630E+06,       0.101963558171047160E+06,       0.101999276960053059E+06,       0.102027732037148526E+06,
+        0.102044731025719229E+06,       0.102045431775095058E+06,       0.102030705033808161E+06,       0.102003666856825570E+06,       0.101970343646836016E+06,
+        0.101935360181740762E+06,       0.101900669036632447E+06,       0.101865688643875081E+06,       0.101829409780582253E+06,       0.101790176042387873E+06,
+        0.101745151599830831E+06,       0.101696472660873420E+06,       0.101648060959889524E+06,       0.101603410369994090E+06,       0.101561835852602439E+06,
+        0.101521855998799132E+06,       0.101482037163334768E+06,       0.101431340410975914E+06,       0.101375699870779092E+06,       0.101314779976223654E+06,
+        0.101251712502201844E+06,       0.101185784883436660E+06,       0.101116517257030340E+06,       0.101049883113580014E+06,       0.100989563385332454E+06,
+        0.100941765093850961E+06,       0.100916306862933794E+06,       0.100906980056579865E+06,       0.100910197269982164E+06,       0.100922958161069488E+06,
+        0.100941314458770998E+06,       0.100957519326146881E+06,       0.100976831072572779E+06,       0.100999605735160003E+06,       0.101025582535843947E+06,
+        0.101054164787686663E+06,       0.101087890451072817E+06,       0.101122283479534453E+06,       0.101149350938674921E+06,       0.101166873408313593E+06,
+        0.101177821152178367E+06,       0.101167655432610394E+06,       0.101141220410113790E+06,       0.101110321588459745E+06,       0.101078361586283063E+06,
+        0.101047967121170557E+06,       0.101023734539325480E+06,       0.101008383694813747E+06,       0.100996781521485842E+06,       0.101071681166949435E+06,
+        0.101119012263039112E+06,       0.101171496350808069E+06,       0.101230050130927513E+06,       0.101294972556584413E+06,       0.101361718999132645E+06,
+        0.101428515451916319E+06,       0.101493595145979649E+06,       0.101550612440880213E+06,       0.101601210858501552E+06,       0.101645666556374214E+06,
+        0.101683206121268653E+06,       0.101713363718937704E+06,       0.101736031118329251E+06,       0.101750515944612693E+06,       0.101757053628392736E+06,
+        0.101756382807271759E+06,       0.101751079781741602E+06,       0.101743715819909994E+06,       0.101732729519215369E+06,       0.101719316686245147E+06,
+        0.101706213959027606E+06,       0.101695984176562313E+06,       0.101686190677071994E+06,       0.101677301261342131E+06,       0.101669511529871947E+06,
+        0.101662644903393695E+06,       0.101659294762388396E+06,       0.101657066043437371E+06,       0.101647001805639928E+06,       0.101637372304767356E+06,
+        0.101632049251178221E+06,       0.101632583495971994E+06,       0.101640198281276986E+06,       0.101655810259860154E+06,       0.101680028481804649E+06,
+        0.101706638821039131E+06,       0.101742286180341995E+06,       0.101788109417502055E+06,       0.101842726554478882E+06,       0.101904504042995715E+06,
+        0.101971839066862056E+06,       0.102051325178151485E+06,       0.102132183694597014E+06,       0.102209672996832567E+06,       0.102278148214885616E+06,
+        0.102338448224708001E+06,       0.102390873033725249E+06,       0.102438626144456910E+06,       0.102479259552033545E+06,       0.102513206393975473E+06,
+        0.102541824188105747E+06,       0.102567198188429233E+06,       0.102591367917437441E+06,       0.102612619776373147E+06,       0.102629292784196412E+06,
+        0.102640555112501301E+06,       0.102646561280503796E+06,       0.102650072544106879E+06,       0.102650385076837265E+06,       0.102648623310889074E+06,
+        0.102647398290377925E+06,       0.102645017994891765E+06,       0.102642292476577204E+06,       0.102637067835034904E+06,       0.102629000591322547E+06,
+        0.102618729003435990E+06,       0.102606585296063713E+06,       0.102594489398555161E+06,       0.102579129366844747E+06,       0.102559288929741029E+06,
+        0.102534463674515951E+06,       0.102503683064059122E+06,       0.102467677027648388E+06,       0.102425952698371388E+06,       0.102378489696413220E+06,
+        0.102325464394964612E+06,       0.102266592853272959E+06,       0.102201770963158517E+06,       0.102131402230157837E+06,       0.102054746212255937E+06,
+        0.101968929014764348E+06,       0.101881350922099227E+06,       0.101796528814235106E+06,       0.101718540575217223E+06,       0.101652169308423996E+06,
+        0.101599956132104824E+06,       0.101567900805891448E+06,       0.101551935071902582E+06,       0.101547427861477787E+06,       0.101554419426909473E+06,
+        0.101561600978615184E+06,       0.101559452993868224E+06,       0.101543318540946057E+06,       0.101516046490907509E+06,       0.101480708475794294E+06,
+        0.101442199752635075E+06,       0.101409794893836297E+06,       0.101389114738180739E+06,       0.101385262237127725E+06,       0.101400028248419621E+06,
+        0.101431176088229637E+06,       0.101474781214988048E+06,       0.101522572921117302E+06,       0.101566852249736243E+06,       0.101600450643120159E+06,
+        0.101625889986676848E+06,       0.101647907487096571E+06,       0.101675661997654053E+06,       0.101714463575179296E+06,       0.101767306549608373E+06,
+        0.101829328954263532E+06,       0.101890507206039634E+06,       0.101946066216170686E+06,       0.101992520848846892E+06,       0.102030925636120199E+06,
+        0.102058119932572736E+06,       0.102069397218130180E+06,       0.102063960577488731E+06,       0.102043326123970241E+06,       0.102008553848255615E+06,
+        0.101967472871147096E+06,       0.101926394136031289E+06,       0.101886043970172454E+06,       0.101846744426466306E+06,       0.101807275512743188E+06,
+        0.101761955344090966E+06,       0.101713799217710359E+06,       0.101665117193273894E+06,       0.101617359026062331E+06,       0.101572592180247302E+06,
+        0.101533981842693742E+06,       0.101499194744985522E+06,       0.101466415578573593E+06,       0.101432243614177438E+06,       0.101381882914991351E+06,
+        0.101327735566313961E+06,       0.101272085428944469E+06,       0.101216117169049772E+06,       0.101156916040190554E+06,       0.101098197832462072E+06,
+        0.101045083251186894E+06,       0.101001341900752319E+06,       0.100969631972021365E+06,       0.100962352822747649E+06,       0.100968513387743296E+06,
+        0.100983909597780104E+06,       0.101002878032770619E+06,       0.101021997578890048E+06,       0.101041366902723443E+06,       0.101063829282811043E+06,
+        0.101089246526039147E+06,       0.101117245287077734E+06,       0.101145180487582722E+06,       0.101169961535366980E+06,       0.101193870243324593E+06,
+        0.101214945572481010E+06,       0.101231265902229890E+06,       0.101240946166576672E+06,       0.101226758959788902E+06,       0.101203801319224774E+06,
+        0.101180554692105070E+06,       0.101163284364848339E+06,       0.101153028319845049E+06,       0.101150355172476586E+06,       0.101145580058182692E+06,
+        0.101028800627874574E+06,       0.101077428684324259E+06,       0.101134167142638209E+06,       0.101197990565301836E+06,       0.101265722975280849E+06,
+        0.101335709112544850E+06,       0.101406209334330430E+06,       0.101475487925550115E+06,       0.101541907493692343E+06,       0.101600856889744842E+06,
+        0.101649573257523298E+06,       0.101690733358275495E+06,       0.101724376638615926E+06,       0.101749510141425519E+06,       0.101765791117457280E+06,
+        0.101773452578481490E+06,       0.101773114885158633E+06,       0.101765715127990101E+06,       0.101752413867995332E+06,       0.101738692514285227E+06,
+        0.101723904619569148E+06,       0.101710227930270819E+06,       0.101695310346281782E+06,       0.101679758838352922E+06,       0.101664029621015856E+06,
+        0.101648327607929226E+06,       0.101632507008869143E+06,       0.101615973949263309E+06,       0.101591834033789346E+06,       0.101568495570761865E+06,
+        0.101547691859404833E+06,       0.101531530936334253E+06,       0.101521827887484746E+06,       0.101520050854732108E+06,       0.101527313513054993E+06,
+        0.101537145982894304E+06,       0.101560590862112396E+06,       0.101599562166824646E+06,       0.101645766826557534E+06,       0.101701752618078797E+06,
+        0.101766692067664408E+06,       0.101846710834492522E+06,       0.101935405126349360E+06,       0.102024396175872622E+06,       0.102110867349092339E+06,
+        0.102192853218211705E+06,       0.102269413494696259E+06,       0.102330281542130935E+06,       0.102383945506085889E+06,       0.102430199256480380E+06,
+        0.102469066393364890E+06,       0.102501583023640342E+06,       0.102532817139689723E+06,       0.102561960069998779E+06,       0.102585754372647149E+06,
+        0.102606277240311640E+06,       0.102621561801826407E+06,       0.102631876834385388E+06,       0.102638884194148588E+06,       0.102641934388380745E+06,
+        0.102641959420915780E+06,       0.102640521654950935E+06,       0.102639686428696965E+06,       0.102638253506522131E+06,       0.102634465365988304E+06,
+        0.102627915114268661E+06,       0.102619787557100746E+06,       0.102613378349844119E+06,       0.102603999870031650E+06,       0.102590631585167415E+06,
+        0.102572103225089755E+06,       0.102547313635873026E+06,       0.102516398885249058E+06,       0.102479446900462790E+06,       0.102437237325361522E+06,
+        0.102388874413479600E+06,       0.102333718028784861E+06,       0.102271049401030890E+06,       0.102201028861754414E+06,       0.102122663528859397E+06,
+        0.102032876851637207E+06,       0.101938463410692304E+06,       0.101842660210214104E+06,       0.101749957344606999E+06,       0.101664764507437576E+06,
+        0.101591439187819764E+06,       0.101533919460466379E+06,       0.101494271575071776E+06,       0.101478987993255127E+06,       0.101485263674090980E+06,
+        0.101506279443945081E+06,       0.101532941096559764E+06,       0.101553896677561657E+06,       0.101563917085832989E+06,       0.101552692436306723E+06,
+        0.101526766068070108E+06,       0.101490572300548680E+06,       0.101454740971174542E+06,       0.101425776324883132E+06,       0.101411062568111098E+06,
+        0.101413866812942622E+06,       0.101435131474614493E+06,       0.101474051380900128E+06,       0.101522941427092213E+06,       0.101574152032058948E+06,
+        0.101618098831177398E+06,       0.101654170137284003E+06,       0.101684054984246599E+06,       0.101716539075889523E+06,       0.101756604551361495E+06,
+        0.101806467761705877E+06,       0.101862424100462653E+06,       0.101918408568819126E+06,       0.101971439624029648E+06,       0.102015800714595636E+06,
+        0.102049385208646127E+06,       0.102069908714661666E+06,       0.102076032068515779E+06,       0.102064732659179368E+06,       0.102034093795762514E+06,
+        0.101992630086863239E+06,       0.101944780810628261E+06,       0.101894141477159937E+06,       0.101849042057571452E+06,       0.101805808680122878E+06,
+        0.101760916109816302E+06,       0.101714291793644923E+06,       0.101666393705850103E+06,       0.101619297696421156E+06,       0.101573598742667251E+06,
+        0.101529420471224686E+06,       0.101490381423561645E+06,       0.101460489541744115E+06,       0.101432531917615197E+06,       0.101405679166028422E+06,
+        0.101376758400729959E+06,       0.101333014356477448E+06,       0.101288061869102195E+06,       0.101243137897010267E+06,       0.101200014773099698E+06,
+        0.101153035601030700E+06,       0.101107255027280131E+06,       0.101068975039667697E+06,       0.101040318598185462E+06,       0.101026239021205620E+06,
+        0.101036150724925217E+06,       0.101050786638747362E+06,       0.101066960176317720E+06,       0.101082545023658342E+06,       0.101098187778212945E+06,
+        0.101117678130985703E+06,       0.101139021760228803E+06,       0.101155522461091532E+06,       0.101175020122667425E+06,       0.101198265495543150E+06,
+        0.101224832562545693E+06,       0.101250329820757150E+06,       0.101272684085133165E+06,       0.101289811161881575E+06,       0.101299701614067628E+06,
+        0.101289739336630024E+06,       0.101279678002747503E+06,       0.101273826681569160E+06,       0.101274570526567550E+06,       0.101282465694758634E+06,
+        0.101293902962443753E+06,       0.100983835656151976E+06,       0.101036388934372706E+06,       0.101096497142358145E+06,       0.101162397946509547E+06,
+        0.101232608232112354E+06,       0.101305480982330599E+06,       0.101379283841868455E+06,       0.101452283197187178E+06,       0.101522834159475562E+06,
+        0.101589476875808105E+06,       0.101650386759155634E+06,       0.101696210127681858E+06,       0.101733613430271813E+06,       0.101761832290367092E+06,
+        0.101780569821559126E+06,       0.101789961901369534E+06,       0.101790532679209500E+06,       0.101783131653860866E+06,       0.101768849808582265E+06,
+        0.101750041068809616E+06,       0.101731803246356489E+06,       0.101713921895166000E+06,       0.101693731889764837E+06,       0.101671835744684708E+06,
+        0.101648705771986570E+06,       0.101624585079514640E+06,       0.101599389025969096E+06,       0.101563768387053642E+06,       0.101522704766848532E+06,
+        0.101483489785699712E+06,       0.101448687013231232E+06,       0.101419615240213854E+06,       0.101397479525329196E+06,       0.101384028029676760E+06,
+        0.101370836998047147E+06,       0.101368370266732833E+06,       0.101383065641375812E+06,       0.101416090998647196E+06,       0.101467290265164353E+06,
+        0.101534882313080263E+06,       0.101609445319890510E+06,       0.101699733235880441E+06,       0.101794859855521834E+06,       0.101891101060966321E+06,
+        0.101985315130313480E+06,       0.102075076914327306E+06,       0.102159945052938041E+06,       0.102235771297951098E+06,       0.102301477656430769E+06,
+        0.102354930558367778E+06,       0.102399782724316072E+06,       0.102438694369211255E+06,       0.102476839111309280E+06,       0.102509751156878236E+06,
+        0.102537521783681077E+06,       0.102560895469354815E+06,       0.102580819063130271E+06,       0.102594854584419911E+06,       0.102605160074562926E+06,
+        0.102611577337313051E+06,       0.102614486702620023E+06,       0.102617674490494959E+06,       0.102619973525111447E+06,       0.102618324460179618E+06,
+        0.102615416266488261E+06,       0.102610851205396946E+06,       0.102607299216665502E+06,       0.102602572628475973E+06,       0.102595515104050908E+06,
+        0.102585432283621078E+06,       0.102569550312714797E+06,       0.102546496599273247E+06,       0.102517612581426918E+06,       0.102482362007529839E+06,
+        0.102441544642516921E+06,       0.102393921375066857E+06,       0.102338338767732290E+06,       0.102273827698305467E+06,       0.102199580759235032E+06,
+        0.102112717239415593E+06,       0.102017541011033652E+06,       0.101917267901995700E+06,       0.101815758981969469E+06,       0.101717854365049221E+06,
+        0.101627270343615834E+06,       0.101547308817353100E+06,       0.101483765146806487E+06,       0.101441943712900873E+06,       0.101423999856314156E+06,
+        0.101430776328316933E+06,       0.101457783973006139E+06,       0.101497023306538365E+06,       0.101538146597104598E+06,       0.101564980031804182E+06,
+        0.101571345079031700E+06,       0.101556555710264554E+06,       0.101527227279379993E+06,       0.101491242458124063E+06,       0.101455431195561541E+06,
+        0.101427222639413303E+06,       0.101413952789479707E+06,       0.101420016873493543E+06,       0.101448672726717166E+06,       0.101494479796940665E+06,
+        0.101550679225448213E+06,       0.101607025893701604E+06,       0.101659304835337243E+06,       0.101705889950175377E+06,       0.101749787609497245E+06,
+        0.101793551387452957E+06,       0.101844793551510127E+06,       0.101899113907290477E+06,       0.101951953582127840E+06,       0.101997167012573933E+06,
+        0.102030191525044342E+06,       0.102053787395966574E+06,       0.102064887574337728E+06,       0.102060267944376203E+06,       0.102039749700523636E+06,
+        0.102005081906476669E+06,       0.101957654047840246E+06,       0.101904801258523614E+06,       0.101850843726662788E+06,       0.101798946363995929E+06,
+        0.101751878064897523E+06,       0.101705939443378287E+06,       0.101659768391705205E+06,       0.101615380159911743E+06,       0.101570783461705709E+06,
+        0.101526947551755860E+06,       0.101484787939652975E+06,       0.101445231219594032E+06,       0.101413345817087800E+06,       0.101391047300393111E+06,
+        0.101372584877227360E+06,       0.101355566853485740E+06,       0.101335220992961375E+06,       0.101303837716816255E+06,       0.101271525370591757E+06,
+        0.101240298133351855E+06,       0.101211003024413338E+06,       0.101175839364889063E+06,       0.101146665774628709E+06,       0.101127801050420749E+06,
+        0.101116214564623544E+06,       0.101115217567181709E+06,       0.101124992952320288E+06,       0.101134962605509543E+06,       0.101143290627816998E+06,
+        0.101149282865567409E+06,       0.101151001731697805E+06,       0.101160080279956310E+06,       0.101174468885292459E+06,       0.101194158852267166E+06,
+        0.101218629627263130E+06,       0.101247610934086246E+06,       0.101278139638903813E+06,       0.101306993640526780E+06,       0.101332857422239162E+06,
+        0.101352835922766695E+06,       0.101364854062282961E+06,       0.101366215681609348E+06,       0.101371982657827277E+06,       0.101384204628605657E+06,
+        0.101403123567578412E+06,       0.101427293507956012E+06,       0.100939699761507189E+06,       0.100993926545564740E+06,       0.101055617446205957E+06,
+        0.101123302505147047E+06,       0.101195700951661318E+06,       0.101271150132425566E+06,       0.101347899405442047E+06,       0.101424189839355866E+06,
+        0.101498339603613043E+06,       0.101568835452811982E+06,       0.101636401101424097E+06,       0.101695457584751377E+06,       0.101740082571501800E+06,
+        0.101772165987128828E+06,       0.101794061760174460E+06,       0.101805821721959510E+06,       0.101807890769523758E+06,       0.101801052084176001E+06,
+        0.101787222143099047E+06,       0.101769333451322513E+06,       0.101746134751190912E+06,       0.101718716143227328E+06,       0.101691356809011646E+06,
+        0.101662464249923956E+06,       0.101631298348493656E+06,       0.101598170677190283E+06,       0.101554964683279206E+06,       0.101502331999436428E+06,
+        0.101449056042133889E+06,       0.101396847279871756E+06,       0.101347056172201555E+06,       0.101300460882216124E+06,       0.101262584703042259E+06,
+        0.101225780265849375E+06,       0.101194459775717551E+06,       0.101179417053502169E+06,       0.101183702376592380E+06,       0.101209076499852017E+06,
+        0.101255909037280071E+06,       0.101326640203920455E+06,       0.101424239758254218E+06,       0.101531367651623077E+06,       0.101632910073723979E+06,
+        0.101736158570445637E+06,       0.101837656744184424E+06,       0.101936360666710083E+06,       0.102029774479476604E+06,       0.102113550935132720E+06,
+        0.102187275245992423E+06,       0.102251742085495353E+06,       0.102308744854441014E+06,       0.102354056548559587E+06,       0.102395496326958368E+06,
+        0.102432085609497080E+06,       0.102463450245845990E+06,       0.102489865598489851E+06,       0.102514853262571502E+06,       0.102534082770129738E+06,
+        0.102548592777604266E+06,       0.102559883810599669E+06,       0.102568794081739034E+06,       0.102579021392062437E+06,       0.102585007107402751E+06,
+        0.102586497457448539E+06,       0.102584376842419224E+06,       0.102580903181294503E+06,       0.102577151681759657E+06,       0.102573827515381417E+06,
+        0.102568538059750121E+06,       0.102560561364228692E+06,       0.102548460310359820E+06,       0.102530289426340809E+06,       0.102505861568008157E+06,
+        0.102475498063954670E+06,       0.102440643792700503E+06,       0.102396241614374099E+06,       0.102341446243588929E+06,       0.102276649353635905E+06,
+        0.102199862029058393E+06,       0.102111863644497949E+06,       0.102014314786398143E+06,       0.101910607455440113E+06,       0.101806306816961252E+06,
+        0.101704399917697054E+06,       0.101609603981306922E+06,       0.101526211311625375E+06,       0.101459322473350869E+06,       0.101412795838567283E+06,
+        0.101389618525710335E+06,       0.101393845554395113E+06,       0.101424357742906359E+06,       0.101472713797786171E+06,       0.101522607587252613E+06,
+        0.101559998357663775E+06,       0.101576743781235520E+06,       0.101573310646049868E+06,       0.101549833954751783E+06,       0.101514456685338067E+06,
+        0.101472694191529066E+06,       0.101434208011361596E+06,       0.101406914911600485E+06,       0.101398454904380153E+06,       0.101415253675564527E+06,
+        0.101455136695375608E+06,       0.101512719547979839E+06,       0.101577237869349250E+06,       0.101641152022720256E+06,       0.101700396834169049E+06,
+        0.101757567947174000E+06,       0.101815111575731135E+06,       0.101874014294397304E+06,       0.101930155420364375E+06,       0.101979578233631371E+06,
+        0.102017827567168875E+06,       0.102041453032023797E+06,       0.102049181677356071E+06,       0.102042624564991027E+06,       0.102027458526470917E+06,
+        0.101998856271186160E+06,       0.101958763385915998E+06,       0.101909825004560786E+06,       0.101855834630693556E+06,       0.101803471305377156E+06,
+        0.101751840395667561E+06,       0.101701669671223848E+06,       0.101657371568089962E+06,       0.101614737302306821E+06,       0.101571808841198203E+06,
+        0.101529035182503387E+06,       0.101487836291383923E+06,       0.101448187429775586E+06,       0.101410201287687276E+06,       0.101375725543945955E+06,
+        0.101354091334976038E+06,       0.101343701275904139E+06,       0.101337958790157587E+06,       0.101334014323027164E+06,       0.101323058410853802E+06,
+        0.101303680281432564E+06,       0.101285071086934273E+06,       0.101269046902558985E+06,       0.101256912292666253E+06,       0.101239485050412128E+06,
+        0.101225094542196108E+06,       0.101214114558167246E+06,       0.101206300766355242E+06,       0.101205366180458252E+06,       0.101205376802251209E+06,
+        0.101196436467417006E+06,       0.101184014918681118E+06,       0.101170971956995039E+06,       0.101173896703063627E+06,       0.101186778426832985E+06,
+        0.101207425966799259E+06,       0.101235075391491133E+06,       0.101268299800364039E+06,       0.101308063493844020E+06,       0.101344788336284473E+06,
+        0.101376389450400151E+06,       0.101402378295128001E+06,       0.101423140134659829E+06,       0.101438782026730638E+06,       0.101455746728587110E+06,
+        0.101479368387625509E+06,       0.101509546030359561E+06,       0.101546739387306210E+06,       0.100893625093361974E+06,       0.100948455392464501E+06,
+        0.101011317645263582E+06,       0.101080913011082172E+06,       0.101155302174425058E+06,       0.101233112731396410E+06,       0.101312551980581891E+06,
+        0.101391810121618284E+06,       0.101469643740293817E+06,       0.101547894952444782E+06,       0.101619713078854009E+06,       0.101683304064554628E+06,
+        0.101737232999154556E+06,       0.101779617777438179E+06,       0.101805388291197829E+06,       0.101820150398714570E+06,       0.101824280737551730E+06,
+        0.101819067925622789E+06,       0.101806980910888844E+06,       0.101787436214918198E+06,       0.101761287349566453E+06,       0.101729423465328233E+06,
+        0.101692622608612961E+06,       0.101651573936670728E+06,       0.101611590783753491E+06,       0.101562833006838278E+06,       0.101502364394767414E+06,
+        0.101438724936641054E+06,       0.101373805958635741E+06,       0.101309369954324357E+06,       0.101246873385268977E+06,       0.101187267453513661E+06,
+        0.101122914968029043E+06,       0.101055428119650373E+06,       0.101008249772026029E+06,       0.100979473982631680E+06,       0.100972177967227311E+06,
+        0.100988832853860484E+06,       0.101031262783445170E+06,       0.101112202656024601E+06,       0.101211093846252057E+06,       0.101323155130905317E+06,
+        0.101443212391304434E+06,       0.101565274984548159E+06,       0.101675064133449094E+06,       0.101783046764746541E+06,       0.101883427362778093E+06,
+        0.101974048605326316E+06,       0.102054089915572622E+06,       0.102123916001737191E+06,       0.102185138506351650E+06,       0.102239277647944138E+06,
+        0.102288043635062262E+06,       0.102329848961112002E+06,       0.102365570526105090E+06,       0.102398175565311816E+06,       0.102427118018994763E+06,
+        0.102451215888181687E+06,       0.102470889959435211E+06,       0.102487322259304128E+06,       0.102507363262553656E+06,       0.102522539511451090E+06,
+        0.102533202617323841E+06,       0.102538447738773189E+06,       0.102539366679125000E+06,       0.102537806325041631E+06,       0.102534134338413278E+06,
+        0.102529616480806799E+06,       0.102525504718401397E+06,       0.102520340764588414E+06,       0.102512361946182253E+06,       0.102499685852779818E+06,
+        0.102481370178637997E+06,       0.102461804458447645E+06,       0.102433116211535496E+06,       0.102394820498302695E+06,       0.102344806742965229E+06,
+        0.102282869771580241E+06,       0.102208190347609911E+06,       0.102122230232017173E+06,       0.102026360478078772E+06,       0.101922376088166435E+06,
+        0.101815964790077211E+06,       0.101712553837059808E+06,       0.101615912730210781E+06,       0.101531538428717235E+06,       0.101462015329520931E+06,
+        0.101411095529211190E+06,       0.101383553801811446E+06,       0.101387868686696354E+06,       0.101419065450411930E+06,       0.101465197763774107E+06,
+        0.101514122624701689E+06,       0.101554157750064871E+06,       0.101577510533460605E+06,       0.101578561408166206E+06,       0.101561717136454608E+06,
+        0.101527942832344896E+06,       0.101485492708933743E+06,       0.101442040681691869E+06,       0.101407214730937660E+06,       0.101391475969427891E+06,
+        0.101402057936737707E+06,       0.101438129992839313E+06,       0.101494675186752138E+06,       0.101561405991801003E+06,       0.101631832958464947E+06,
+        0.101700764128050694E+06,       0.101765471244284083E+06,       0.101829298739144535E+06,       0.101891487805957440E+06,       0.101949649930012936E+06,
+        0.101996983260441179E+06,       0.102028825999188412E+06,       0.102041977726062381E+06,       0.102037063043873364E+06,       0.102018484271153007E+06,
+        0.101987519813082123E+06,       0.101953322744109144E+06,       0.101911210582393775E+06,       0.101863879485885569E+06,       0.101813868935175255E+06,
+        0.101763558865488987E+06,       0.101714781421884982E+06,       0.101669784944327868E+06,       0.101626116114336663E+06,       0.101583855166139518E+06,
+        0.101542346971029430E+06,       0.101502633877275308E+06,       0.101464939559164166E+06,       0.101426766367174598E+06,       0.101390458857219390E+06,
+        0.101358471458522574E+06,       0.101334112694217969E+06,       0.101328407691393310E+06,       0.101330874497622441E+06,       0.101337110359200757E+06,
+        0.101343736678259927E+06,       0.101343244142495707E+06,       0.101341300900043818E+06,       0.101339844172589394E+06,       0.101338724330486657E+06,
+        0.101333664918719776E+06,       0.101322891249048946E+06,       0.101311826452015521E+06,       0.101299221594776434E+06,       0.101282571152943405E+06,
+        0.101266530780531204E+06,       0.101246643011162712E+06,       0.101224150063358495E+06,       0.101202571591745436E+06,       0.101188612840670292E+06,
+        0.101199966484071061E+06,       0.101222097051704724E+06,       0.101260233588647054E+06,       0.101304129252313578E+06,       0.101350161554908336E+06,
+        0.101389652624068185E+06,       0.101424551417429771E+06,       0.101454274075586436E+06,       0.101479148917351384E+06,       0.101500388782067501E+06,
+        0.101525545796928971E+06,       0.101562513561929518E+06,       0.101606090475506091E+06,       0.101653619386718725E+06,       0.100845507039246062E+06,
+        0.100900566753226827E+06,       0.100964147998307293E+06,       0.101035004760987780E+06,       0.101111734714359307E+06,       0.101192123809297234E+06,
+        0.101274156352906692E+06,       0.101357605885697238E+06,       0.101443671119726976E+06,       0.101525544557033369E+06,       0.101601182677887831E+06,
+        0.101668789681363778E+06,       0.101726898348598319E+06,       0.101774441929614739E+06,       0.101810815552412794E+06,       0.101832035149566495E+06,
+        0.101838765440822797E+06,       0.101835596101807649E+06,       0.101823419644672496E+06,       0.101802715728713345E+06,       0.101774151142095492E+06,
+        0.101738457612419079E+06,       0.101696295926065533E+06,       0.101648104911459959E+06,       0.101590285842002006E+06,       0.101521209919707282E+06,
+        0.101450839575846665E+06,       0.101376697188940336E+06,       0.101300744148618498E+06,       0.101224863840720194E+06,       0.101150697403150189E+06,
+        0.101073301607053800E+06,       0.100983235760375988E+06,       0.100901684378507489E+06,       0.100833101972986929E+06,       0.100781373167571786E+06,
+        0.100760772506158712E+06,       0.100768040826660945E+06,       0.100819963855216105E+06,       0.100898361962391151E+06,       0.100996401252706506E+06,
+        0.101109805590524003E+06,       0.101233684034863138E+06,       0.101362757333502159E+06,       0.101494642793831357E+06,       0.101619684005633680E+06,
+        0.101728129058541483E+06,       0.101825059560781054E+06,       0.101910320070122136E+06,       0.101982389350624275E+06,       0.102044412115271698E+06,
+        0.102100145695870931E+06,       0.102151182120026933E+06,       0.102199014246850449E+06,       0.102244844616859526E+06,       0.102284509458517772E+06,
+        0.102318215421307876E+06,       0.102347902960885476E+06,       0.102373421335254781E+06,       0.102401951332123936E+06,       0.102429181477717284E+06,
+        0.102450532016644735E+06,       0.102465997336774948E+06,       0.102475777963121422E+06,       0.102478313815590023E+06,       0.102478110250759957E+06,
+        0.102475657036715347E+06,       0.102471918321198871E+06,       0.102469939192222024E+06,       0.102467007436977176E+06,       0.102462490014742158E+06,
+        0.102456722431479779E+06,       0.102450737615132341E+06,       0.102440335034919917E+06,       0.102420575011656954E+06,       0.102389812989896382E+06,
+        0.102347122683242473E+06,       0.102292275082950306E+06,       0.102224438636867562E+06,       0.102143836217952965E+06,       0.102050866494433591E+06,
+        0.101949943411085245E+06,       0.101845736377779569E+06,       0.101742816153747364E+06,       0.101647911129982123E+06,       0.101563216996056130E+06,
+        0.101491604823778136E+06,       0.101437861556007003E+06,       0.101412287502927546E+06,       0.101412856551671823E+06,       0.101435247443498505E+06,
+        0.101472966599928535E+06,       0.101514519271643498E+06,       0.101550307716508367E+06,       0.101572773831424129E+06,       0.101577300876503461E+06,
+        0.101561783761491213E+06,       0.101528832671536744E+06,       0.101487621468217170E+06,       0.101449333621855301E+06,       0.101421572690143163E+06,
+        0.101412849368901254E+06,       0.101428815273143569E+06,       0.101468452704213269E+06,       0.101526342258825374E+06,       0.101593070240422909E+06,
+        0.101660293633886846E+06,       0.101724359259873541E+06,       0.101785772418607943E+06,       0.101847556062125179E+06,       0.101908363003809383E+06,
+        0.101961701914240010E+06,       0.102002429874153109E+06,       0.102025185688122059E+06,       0.102030228237618969E+06,       0.102016392623057240E+06,
+        0.101989203583738155E+06,       0.101954215596148948E+06,       0.101916658897302012E+06,       0.101876815696310456E+06,       0.101833071043157586E+06,
+        0.101787308476072212E+06,       0.101741539193291770E+06,       0.101697630101558476E+06,       0.101654119182481736E+06,       0.101610960850170581E+06,
+        0.101569179414185535E+06,       0.101528773468682877E+06,       0.101490142318063241E+06,       0.101454189911789217E+06,       0.101420537325155994E+06,
+        0.101387196165512592E+06,       0.101359208745426033E+06,       0.101338989486127597E+06,       0.101329695327606096E+06,       0.101338867992364074E+06,
+        0.101355871810450670E+06,       0.101375430345140587E+06,       0.101394209504973755E+06,       0.101402919751202760E+06,       0.101410688334029808E+06,
+        0.101416920285657412E+06,       0.101420489242522977E+06,       0.101413658635510583E+06,       0.101399351916641783E+06,       0.101380364637205465E+06,
+        0.101357315413079603E+06,       0.101331383086953632E+06,       0.101302463143222500E+06,       0.101271861027862804E+06,       0.101243797629858222E+06,
+        0.101225102912379341E+06,       0.101230895188582799E+06,       0.101260967028080006E+06,       0.101301126414935963E+06,       0.101347821784489817E+06,
+        0.101397550525323837E+06,       0.101444003541722705E+06,       0.101480976560253359E+06,       0.101512946357403111E+06,       0.101540212183607568E+06,
+        0.101567953884550225E+06,       0.101594468785546575E+06,       0.101637676393726375E+06,       0.101688399693186482E+06,       0.101742930184759069E+06,
+        0.100795882153115017E+06,       0.100850797431345025E+06,       0.100914750948998306E+06,       0.100986523708389999E+06,       0.101064741053657359E+06,
+        0.101147944583867647E+06,       0.101236474647069423E+06,       0.101327593382317646E+06,       0.101416818345205553E+06,       0.101501970105562199E+06,
+        0.101581006340059568E+06,       0.101652107178935606E+06,       0.101713753841424812E+06,       0.101764799350409041E+06,       0.101804529976921447E+06,
+        0.101832451081090258E+06,       0.101847567048303332E+06,       0.101846442214230046E+06,       0.101834900151378431E+06,       0.101813744156519519E+06,
+        0.101783490044669117E+06,       0.101744750228076155E+06,       0.101698109004179641E+06,       0.101641364118676778E+06,       0.101569583201128436E+06,
+        0.101490816574609969E+06,       0.101406531256311253E+06,       0.101319625817001812E+06,       0.101233091961074242E+06,       0.101146347584902731E+06,
+        0.101058989124578555E+06,       0.100953964690316512E+06,       0.100852899705475327E+06,       0.100760578698964149E+06,       0.100681685450575751E+06,
+        0.100620492778267973E+06,       0.100580496608869158E+06,       0.100579462774121028E+06,       0.100625977088063315E+06,       0.100699672061534206E+06,
+        0.100794647180633037E+06,       0.100907249288633233E+06,       0.101033016501104474E+06,       0.101170532820658074E+06,       0.101310202043631813E+06,
+        0.101443951517617694E+06,       0.101566665342990047E+06,       0.101674561727816923E+06,       0.101762857707379371E+06,       0.101831050817027455E+06,
+        0.101892059674295087E+06,       0.101947353598683054E+06,       0.101998507084363489E+06,       0.102047351014086569E+06,       0.102096770563981801E+06,
+        0.102143221374936838E+06,       0.102186890306655871E+06,       0.102228196597294736E+06,       0.102264105567156759E+06,       0.102302445150954794E+06,
+        0.102336246787148004E+06,       0.102363781472504663E+06,       0.102384291162903231E+06,       0.102397430622010026E+06,       0.102403312624922473E+06,
+        0.102403832627536103E+06,       0.102402612769131738E+06,       0.102401390930183130E+06,       0.102401466546220196E+06,       0.102401874865610895E+06,
+        0.102402100027913009E+06,       0.102404524182350739E+06,       0.102408945753433436E+06,       0.102408228479075435E+06,       0.102399207567720179E+06,
+        0.102378727543360583E+06,       0.102346081419689654E+06,       0.102300584036716507E+06,       0.102242408524207058E+06,       0.102170172560628038E+06,
+        0.102084827969266131E+06,       0.101990466580006148E+06,       0.101891305283198890E+06,       0.101794051647235989E+06,       0.101701758202335564E+06,
+        0.101617607399452128E+06,       0.101545673956610553E+06,       0.101493920019806435E+06,       0.101463389589686616E+06,       0.101454707404169429E+06,
+        0.101465784796775130E+06,       0.101489404864046577E+06,       0.101519701691131908E+06,       0.101547620610180951E+06,       0.101565576165996550E+06,
+        0.101562026624260950E+06,       0.101539419490073633E+06,       0.101508015501831396E+06,       0.101475602714955035E+06,       0.101449209652947975E+06,
+        0.101436251410560508E+06,       0.101442877175111498E+06,       0.101471341372345414E+06,       0.101518178052896081E+06,       0.101577355032239313E+06,
+        0.101641314782584261E+06,       0.101703564541155953E+06,       0.101762362987943518E+06,       0.101818379277178246E+06,       0.101872714548978096E+06,
+        0.101924119264252775E+06,       0.101966776195386803E+06,       0.101995500768842219E+06,       0.102007086660768691E+06,       0.102002030153628395E+06,
+        0.101985038462701981E+06,       0.101956611217972633E+06,       0.101924174284332606E+06,       0.101890531345005773E+06,       0.101858684611865552E+06,
+        0.101821867670641383E+06,       0.101781442886233301E+06,       0.101738169818174909E+06,       0.101693020445221118E+06,       0.101649533509090848E+06,
+        0.101606065252630258E+06,       0.101563356987927487E+06,       0.101522196794781717E+06,       0.101483000104046587E+06,       0.101448492093986119E+06,
+        0.101420196255985837E+06,       0.101395294590973572E+06,       0.101373162271020163E+06,       0.101359621762719311E+06,       0.101356933368830039E+06,
+        0.101368947980949306E+06,       0.101392192190573551E+06,       0.101417779659041989E+06,       0.101442531040709990E+06,       0.101462476541542521E+06,
+        0.101476476704636079E+06,       0.101486973325915984E+06,       0.101492708978460287E+06,       0.101491506327010982E+06,       0.101476163566485891E+06,
+        0.101454012045195879E+06,       0.101426588508176050E+06,       0.101395767868210212E+06,       0.101361555520167341E+06,       0.101327388871009054E+06,
+        0.101300667576237203E+06,       0.101284994174892112E+06,       0.101283350959747040E+06,       0.101309210052713708E+06,       0.101350688755181967E+06,
+        0.101399465772761600E+06,       0.101451857069433157E+06,       0.101504338927611956E+06,       0.101548087731741456E+06,       0.101585173851711908E+06,
+        0.101617418107249265E+06,       0.101645918462371425E+06,       0.101672368866688703E+06,       0.101702644054264791E+06,       0.101756834440843944E+06,
+        0.101815020493009375E+06,       0.100745394112667054E+06,       0.100799832870823317E+06,       0.100863855953311213E+06,       0.100936251298315474E+06,
+        0.101015648499264644E+06,       0.101104654341683374E+06,       0.101200128443110370E+06,       0.101296361142831636E+06,       0.101389195762127056E+06,
+        0.101477275829104881E+06,       0.101559295351936235E+06,       0.101633387586243814E+06,       0.101697961740723156E+06,       0.101751772598623953E+06,
+        0.101793901427349119E+06,       0.101823866729636080E+06,       0.101841583691637163E+06,       0.101847052782340179E+06,       0.101840097601263231E+06,
+        0.101819364884434224E+06,       0.101788292383590582E+06,       0.101747405137351147E+06,       0.101695621343299601E+06,       0.101627436111935327E+06,
+        0.101550322384277897E+06,       0.101465476616664964E+06,       0.101374194733789423E+06,       0.101277718928660746E+06,       0.101177047947947533E+06,
+        0.101075621770040874E+06,       0.100963507971772880E+06,       0.100850151599165794E+06,       0.100741049456883455E+06,       0.100641201275214524E+06,
+        0.100555640521779089E+06,       0.100489164793431541E+06,       0.100453712051746988E+06,       0.100455966233873114E+06,       0.100484341033634380E+06,
+        0.100537490332318921E+06,       0.100620003905902136E+06,       0.100729309835612949E+06,       0.100858870023752374E+06,       0.101002649715674357E+06,
+        0.101147678361066428E+06,       0.101287802540963821E+06,       0.101417496539417145E+06,       0.101532273896933402E+06,       0.101613683175199098E+06,
+        0.101680723164626179E+06,       0.101737444859119263E+06,       0.101791182708811306E+06,       0.101841314940347904E+06,       0.101891796533315224E+06,
+        0.101941590080887530E+06,       0.101990059211011772E+06,       0.102037355306302023E+06,       0.102083701488133767E+06,       0.102136891332944331E+06,
+        0.102186806386969169E+06,       0.102230479823408270E+06,       0.102264774535572782E+06,       0.102290420308268731E+06,       0.102307702555592783E+06,
+        0.102317766904831617E+06,       0.102321662148245741E+06,       0.102321498408406202E+06,       0.102320441248726507E+06,       0.102319523718290511E+06,
+        0.102322447750704567E+06,       0.102327503158949214E+06,       0.102340754529364640E+06,       0.102353506384693246E+06,       0.102362358688122375E+06,
+        0.102364445626707267E+06,       0.102355674159446760E+06,       0.102335040551811529E+06,       0.102301981999839074E+06,       0.102255676163442389E+06,
+        0.102195798314690837E+06,       0.102122639698007450E+06,       0.102039086723219865E+06,       0.101949840960878224E+06,       0.101859938889724974E+06,
+        0.101771880315094095E+06,       0.101689691466275064E+06,       0.101619553461018091E+06,       0.101564784382206009E+06,       0.101527063676792590E+06,
+        0.101506865347517232E+06,       0.101503522390084341E+06,       0.101512744653858725E+06,       0.101529231308459130E+06,       0.101545937638918578E+06,
+        0.101543746232650679E+06,       0.101529149091683401E+06,       0.101505036617385034E+06,       0.101477259643610611E+06,       0.101452985842091570E+06,
+        0.101443019818922796E+06,       0.101450005107018835E+06,       0.101477223491849247E+06,       0.101523231314288976E+06,       0.101581629450517838E+06,
+        0.101644098508760901E+06,       0.101703051093558723E+06,       0.101755080739197074E+06,       0.101801349748540073E+06,       0.101847343504094184E+06,
+        0.101892088842664132E+06,       0.101930776572625342E+06,       0.101959972929516225E+06,       0.101973275480066382E+06,       0.101972016851233420E+06,
+        0.101959747868463455E+06,       0.101940685784926434E+06,       0.101919336338791196E+06,       0.101894507185877927E+06,       0.101871113669696017E+06,
+        0.101847657889249851E+06,       0.101820887903955852E+06,       0.101784170021964572E+06,       0.101741602583369866E+06,       0.101694747059338464E+06,
+        0.101647292622998575E+06,       0.101600773270067424E+06,       0.101554052329806203E+06,       0.101509997350416306E+06,       0.101472107321641699E+06,
+        0.101442071551669200E+06,       0.101420240877131699E+06,       0.101406891473258380E+06,       0.101396015807551084E+06,       0.101392164060749914E+06,
+        0.101397198621684831E+06,       0.101410725481402653E+06,       0.101436168965154429E+06,       0.101464448461599168E+06,       0.101491134274545591E+06,
+        0.101513817760506034E+06,       0.101531534488231206E+06,       0.101544658070101810E+06,       0.101551681755858954E+06,       0.101551216434335554E+06,
+        0.101539195357785327E+06,       0.101514919199184893E+06,       0.101483010220912314E+06,       0.101448007466093870E+06,       0.101414858070553688E+06,
+        0.101383218898751307E+06,       0.101359262217297684E+06,       0.101346709055278770E+06,       0.101347915439013712E+06,       0.101365119587774912E+06,
+        0.101407924765819262E+06,       0.101458658683875430E+06,       0.101515675014729291E+06,       0.101573920518004117E+06,       0.101629788706552135E+06,
+        0.101668434413804149E+06,       0.101700504314289530E+06,       0.101727848552964642E+06,       0.101752288382924846E+06,       0.101776226460626523E+06,
+        0.101814361167678813E+06,       0.101872139466116685E+06,       0.100694816386903738E+06,       0.100748531064111390E+06,       0.100812413075077391E+06,
+        0.100885240325433202E+06,       0.100971984589634725E+06,       0.101066079836500590E+06,       0.101163332246353209E+06,       0.101261519892330936E+06,
+        0.101358385768427062E+06,       0.101451421123224791E+06,       0.101536054276749637E+06,       0.101612689419430462E+06,       0.101679641914763270E+06,
+        0.101735174644287632E+06,       0.101778750617147758E+06,       0.101810665166487233E+06,       0.101830410029895895E+06,       0.101837810772118624E+06,
+        0.101833022665443903E+06,       0.101816510393020842E+06,       0.101787854012666052E+06,       0.101744823421577603E+06,       0.101683938556403096E+06,
+        0.101613036597664483E+06,       0.101532884942156001E+06,       0.101444504410039342E+06,       0.101349069651044396E+06,       0.101247781610335631E+06,
+        0.101141708506075884E+06,       0.101021202144232695E+06,       0.100894721062327983E+06,       0.100769982600624178E+06,       0.100655427823023274E+06,
+        0.100550770964121868E+06,       0.100461477319971644E+06,       0.100396193533225101E+06,       0.100370475160386210E+06,       0.100369362731624045E+06,
+        0.100393088104568509E+06,       0.100440996230512974E+06,       0.100511511049115361E+06,       0.100603846780177613E+06,       0.100726574426591877E+06,
+        0.100871208402494914E+06,       0.101018016887883554E+06,       0.101160944293748136E+06,       0.101294154343677379E+06,       0.101398406532467285E+06,
+        0.101478074072107382E+06,       0.101546049324473512E+06,       0.101603974418745871E+06,       0.101653727077973454E+06,       0.101697954544609078E+06,
+        0.101741376690074656E+06,       0.101789988330066262E+06,       0.101838680208411213E+06,       0.101887795803836605E+06,       0.101942598855672841E+06,
+        0.102000837418646348E+06,       0.102056277940396962E+06,       0.102106768405713607E+06,       0.102150535774670396E+06,       0.102182996899048041E+06,
+        0.102206750157000613E+06,       0.102221201245532342E+06,       0.102228757950974235E+06,       0.102230269318708335E+06,       0.102229908214737996E+06,
+        0.102230221444085299E+06,       0.102233117647704858E+06,       0.102243955867660014E+06,       0.102261169827573845E+06,       0.102280623025385154E+06,
+        0.102298710646779829E+06,       0.102311720481040116E+06,       0.102316483254606297E+06,       0.102310329085876278E+06,       0.102292054686377145E+06,
+        0.102261582445110776E+06,       0.102217278999264774E+06,       0.102159938958497296E+06,       0.102090651836751262E+06,       0.102014420809727890E+06,
+        0.101933158619991009E+06,       0.101851325383247095E+06,       0.101773700996606422E+06,       0.101704655579852813E+06,       0.101645470306280142E+06,
+        0.101599387487163476E+06,       0.101568762309086727E+06,       0.101551200721109650E+06,       0.101544950055199806E+06,       0.101545234940555893E+06,
+        0.101536151271568684E+06,       0.101520957074193793E+06,       0.101499514166347813E+06,       0.101472481430049040E+06,       0.101447481037651174E+06,
+        0.101431698928562022E+06,       0.101432519665399988E+06,       0.101455989679772596E+06,       0.101503867701139068E+06,       0.101569707321795955E+06,
+        0.101641541183263049E+06,       0.101707359784777087E+06,       0.101760909663319078E+06,       0.101802944092112913E+06,       0.101837429073186562E+06,
+        0.101868490058515003E+06,       0.101895999089963501E+06,       0.101921719560774494E+06,       0.101935208629263929E+06,       0.101934734847469299E+06,
+        0.101921789770189804E+06,       0.101905337918664198E+06,       0.101889233907825823E+06,       0.101876223533093609E+06,       0.101864529046626514E+06,
+        0.101850666495852842E+06,       0.101835575764428810E+06,       0.101815211112956240E+06,       0.101783740571016519E+06,       0.101739678309719806E+06,
+        0.101689041718466135E+06,       0.101634899667157661E+06,       0.101583884425190394E+06,       0.101535509776931387E+06,       0.101491128441498251E+06,
+        0.101453011421685966E+06,       0.101428708334432333E+06,       0.101415133080661239E+06,       0.101411902195392497E+06,       0.101415741142001993E+06,
+        0.101421700628259656E+06,       0.101434916879656914E+06,       0.101454096376128975E+06,       0.101478884585159176E+06,       0.101507961817356219E+06,
+        0.101534772926637874E+06,       0.101557090728886120E+06,       0.101574113620330667E+06,       0.101587280909418565E+06,       0.101593317203057959E+06,
+        0.101589233196906163E+06,       0.101574814776511601E+06,       0.101547332581751762E+06,       0.101514869284270651E+06,       0.101481998192358122E+06,
+        0.101452150550811974E+06,       0.101427572510067519E+06,       0.101409813743047896E+06,       0.101403676308175665E+06,       0.101410943983370715E+06,
+        0.101433007929108295E+06,       0.101473704830047689E+06,       0.101528968358056605E+06,       0.101588585098966272E+06,       0.101648865730780017E+06,
+        0.101706538485246449E+06,       0.101754905727487509E+06,       0.101785976200502380E+06,       0.101811017148794053E+06,       0.101832089114193281E+06,
+        0.101851827047180632E+06,       0.101871848271984418E+06,       0.101914442748880043E+06,       0.100645050821058583E+06,       0.100697921098829320E+06,
+        0.100761591261288675E+06,       0.100844244243942405E+06,       0.100934005537327830E+06,       0.101028963380699686E+06,       0.101127123691640561E+06,
+        0.101226361187462535E+06,       0.101324505036089657E+06,       0.101419431488063798E+06,       0.101509163971173737E+06,       0.101590063785101636E+06,
+        0.101657671467199980E+06,       0.101713396702810118E+06,       0.101758515364488485E+06,       0.101792091325616479E+06,       0.101813481673006056E+06,
+        0.101822350253392695E+06,       0.101818668615804971E+06,       0.101802702749391727E+06,       0.101774619027333058E+06,       0.101728109831474241E+06,
+        0.101668908134665704E+06,       0.101597584119515159E+06,       0.101516856663981162E+06,       0.101427599824837293E+06,       0.101330896414631075E+06,
+        0.101227935201261804E+06,       0.101113372919066416E+06,       0.100989129696766337E+06,       0.100861373889168084E+06,       0.100733678225485171E+06,
+        0.100610105917794019E+06,       0.100495004451233079E+06,       0.100402578780181022E+06,       0.100353109983544055E+06,       0.100326440206043859E+06,
+        0.100322735531117156E+06,       0.100342802276422299E+06,       0.100386646482634504E+06,       0.100453451962470805E+06,       0.100549574897853177E+06,
+        0.100666205550992949E+06,       0.100795807241975184E+06,       0.100931381874395069E+06,       0.101067411193584325E+06,       0.101192762302618430E+06,
+        0.101283622761741586E+06,       0.101362350787791220E+06,       0.101430423297678528E+06,       0.101489314399921583E+06,       0.101540641111512159E+06,
+        0.101585585061290316E+06,       0.101627410996723280E+06,       0.101667724011934901E+06,       0.101707970653555123E+06,       0.101751269935565215E+06,
+        0.101811021944586406E+06,       0.101870809774501089E+06,       0.101928469764575537E+06,       0.101981732364511379E+06,       0.102026310772180412E+06,
+        0.102061898497918446E+06,       0.102089845634957077E+06,       0.102110105242362508E+06,       0.102121882127719451E+06,       0.102124061355970684E+06,
+        0.102123733324673376E+06,       0.102124546125847337E+06,       0.102129219082775890E+06,       0.102145351303200790E+06,       0.102166260171440692E+06,
+        0.102190433845960331E+06,       0.102216291023032318E+06,       0.102242152119835548E+06,       0.102260901292175229E+06,       0.102271019053290802E+06,
+        0.102270194336435845E+06,       0.102258376332468251E+06,       0.102232740434276260E+06,       0.102193082447496578E+06,       0.102140339518538545E+06,
+        0.102077291761659100E+06,       0.102007943796066291E+06,       0.101934901694509579E+06,       0.101863769251748963E+06,       0.101795867039438526E+06,
+        0.101734634917306947E+06,       0.101683465453549536E+06,       0.101643719755611994E+06,       0.101613589850316028E+06,       0.101591266195843433E+06,
+        0.101568063676064237E+06,       0.101544190597726789E+06,       0.101518173523634308E+06,       0.101489293133355706E+06,       0.101456969224960791E+06,
+        0.101429471204937334E+06,       0.101413477375518429E+06,       0.101417790921687454E+06,       0.101450822395921219E+06,       0.101510233193849519E+06,
+        0.101585841462266966E+06,       0.101664438788265412E+06,       0.101733920550829818E+06,       0.101788706066789920E+06,       0.101825829329588349E+06,
+        0.101850405636027645E+06,       0.101871083937706790E+06,       0.101887382097668247E+06,       0.101896455049501354E+06,       0.101897289413654769E+06,
+        0.101886248870001597E+06,       0.101867415759247539E+06,       0.101847995171556977E+06,       0.101838485076295401E+06,       0.101834100858943464E+06,
+        0.101832686427819717E+06,       0.101828063075528247E+06,       0.101816399093795466E+06,       0.101796719243765314E+06,       0.101767216502717842E+06,
+        0.101721966250064579E+06,       0.101668953652310433E+06,       0.101611959093829370E+06,       0.101556227036786251E+06,       0.101506414279391960E+06,
+        0.101461971390057777E+06,       0.101425468706421860E+06,       0.101404163733341426E+06,       0.101399096476539751E+06,       0.101405522879150667E+06,
+        0.101421050121819761E+06,       0.101438689378578158E+06,       0.101460180927881505E+06,       0.101485796004159551E+06,       0.101513713918150577E+06,
+        0.101542550860272706E+06,       0.101568068025141562E+06,       0.101588331740948968E+06,       0.101600913455480535E+06,       0.101607630152187616E+06,
+        0.101607407012941694E+06,       0.101598607139348926E+06,       0.101581645287700347E+06,       0.101557205094100689E+06,       0.101527626140599372E+06,
+        0.101498954813168501E+06,       0.101474478229909684E+06,       0.101456851592814171E+06,       0.101447916547657107E+06,       0.101451532249133510E+06,
+        0.101469023039587555E+06,       0.101500095660945575E+06,       0.101543265481331633E+06,       0.101599989966535504E+06,       0.101661394639400824E+06,
+        0.101722843298708525E+06,       0.101781217785530855E+06,       0.101833962893083750E+06,       0.101869504665579036E+06,       0.101891006131465809E+06,
+        0.101907724224272592E+06,       0.101922174311177543E+06,       0.101935867942354409E+06,       0.101950426065447158E+06,       0.100607098755765037E+06,
+        0.100655240281701743E+06,       0.100726600376942501E+06,       0.100809356254825645E+06,       0.100899004634437370E+06,       0.100993829979357848E+06,
+        0.101091906852125423E+06,       0.101191172811513417E+06,       0.101289507328918466E+06,       0.101384817108912728E+06,       0.101475128234200398E+06,
+        0.101556622026723067E+06,       0.101627508170991190E+06,       0.101685968687809233E+06,       0.101732567539073978E+06,       0.101767665006896481E+06,
+        0.101790488350008833E+06,       0.101800548295886649E+06,       0.101797644943693944E+06,       0.101781861361740375E+06,       0.101747873759633774E+06,
+        0.101701859594637368E+06,       0.101644745116156497E+06,       0.101577648617696381E+06,       0.101501095515959882E+06,       0.101413668608079461E+06,
+        0.101318547892610906E+06,       0.101214143017131020E+06,       0.101099338905386365E+06,       0.100978397278849705E+06,       0.100854041321450713E+06,
+        0.100729710648106629E+06,       0.100609462614676057E+06,       0.100497826949930561E+06,       0.100414459388165211E+06,       0.100356511886266162E+06,
+        0.100322777395156372E+06,       0.100316042351856522E+06,       0.100332097081535409E+06,       0.100371561029088683E+06,       0.100439298341075264E+06,
+        0.100532568922400489E+06,       0.100643002914990837E+06,       0.100765387761929349E+06,       0.100893492581718543E+06,       0.101020399500629603E+06,
+        0.101112706098134367E+06,       0.101194570041727216E+06,       0.101269273413618284E+06,       0.101335562528605122E+06,       0.101394060212437602E+06,
+        0.101445483977905038E+06,       0.101491335215433006E+06,       0.101533800970901357E+06,       0.101574594133775521E+06,       0.101615314066683874E+06,
+        0.101662259781339875E+06,       0.101713149881755875E+06,       0.101764653351764238E+06,       0.101815034877485959E+06,       0.101864609985221337E+06,
+        0.101906670614871124E+06,       0.101942016196974146E+06,       0.101970135166829859E+06,       0.101990609169172516E+06,       0.101996950610404732E+06,
+        0.101996810049367472E+06,       0.101996317886868128E+06,       0.101998445642552077E+06,       0.102008824591142213E+06,       0.102027635971959302E+06,
+        0.102051641514833580E+06,       0.102080850665324571E+06,       0.102117904503131693E+06,       0.102157634194590821E+06,       0.102192504721610734E+06,
+        0.102219235460459910E+06,       0.102236777347130861E+06,       0.102242902162718834E+06,       0.102236355155139478E+06,       0.102216651883876315E+06,
+        0.102180426444035780E+06,       0.102133083528179093E+06,       0.102077034681391349E+06,       0.102016323324797893E+06,       0.101953628282518228E+06,
+        0.101890856388452012E+06,       0.101830915333128054E+06,       0.101779447310396441E+06,       0.101734080624489550E+06,       0.101693870504157734E+06,
+        0.101656684022070389E+06,       0.101619340499046710E+06,       0.101584139894536143E+06,       0.101548750508560886E+06,       0.101508927593507731E+06,
+        0.101469477866382847E+06,       0.101436805815304979E+06,       0.101415993387059803E+06,       0.101423466131997789E+06,       0.101453632286171531E+06,
+        0.101508029375078389E+06,       0.101580823336132147E+06,       0.101656593588021438E+06,       0.101722011470405239E+06,       0.101771508397742451E+06,
+        0.101807913013677957E+06,       0.101834964343916130E+06,       0.101850402618856344E+06,       0.101859186985402383E+06,       0.101860587418252151E+06,
+        0.101854518941434624E+06,       0.101838720084331697E+06,       0.101819824582356232E+06,       0.101803402458019846E+06,       0.101796893209118367E+06,
+        0.101799592648883248E+06,       0.101802452116411427E+06,       0.101801265547130839E+06,       0.101788566176828695E+06,       0.101765879286445153E+06,
+        0.101732953696931960E+06,       0.101687950182710265E+06,       0.101633167492824286E+06,       0.101575598313827417E+06,       0.101518917024984054E+06,
+        0.101468456845219422E+06,       0.101425013728590406E+06,       0.101390361593186084E+06,       0.101368216911030337E+06,       0.101370279495935785E+06,
+        0.101384930299833504E+06,       0.101409208395769369E+06,       0.101438468993645060E+06,       0.101467787546390668E+06,       0.101499453696433935E+06,
+        0.101530518538351142E+06,       0.101558938309742618E+06,       0.101581645149348537E+06,       0.101598207551499479E+06,       0.101607649285544889E+06,
+        0.101609802844516307E+06,       0.101605573988511765E+06,       0.101593037714059843E+06,       0.101573514674016667E+06,       0.101549196000671189E+06,
+        0.101522849664976588E+06,       0.101498330261054754E+06,       0.101479889987571310E+06,       0.101470097853539497E+06,       0.101471225349216998E+06,
+        0.101486588535369752E+06,       0.101515334980482352E+06,       0.101556357596876667E+06,       0.101607560846124834E+06,       0.101666443968593783E+06,
+        0.101729419441298363E+06,       0.101791387702929569E+06,       0.101848011454613385E+06,       0.101897514583017852E+06,       0.101939642427183790E+06,
+        0.101960271009820077E+06,       0.101975158780464568E+06,       0.101986424653725320E+06,       0.101995822513432664E+06,       0.102004992120982162E+06,
+        0.100578411052675729E+06,       0.100635318784110554E+06,       0.100702588041198120E+06,       0.100778983082032035E+06,       0.100867372014784603E+06,
+        0.100961003291497836E+06,       0.101057944061462069E+06,       0.101156164506401896E+06,       0.101253562485936651E+06,       0.101348041518852056E+06,
+        0.101435305736620867E+06,       0.101514565773677881E+06,       0.101585969098869886E+06,       0.101648080408071197E+06,       0.101699676885091831E+06,
+        0.101737081890784044E+06,       0.101761287426791518E+06,       0.101772434840921720E+06,       0.101770158786062922E+06,       0.101748537453835859E+06,
+        0.101714770053279746E+06,       0.101669742860261249E+06,       0.101614251954373656E+06,       0.101549290791504973E+06,       0.101476027861641691E+06,
+        0.101395781087328636E+06,       0.101309332351133024E+06,       0.101208930191804626E+06,       0.101100827344175617E+06,       0.100987036454510526E+06,
+        0.100870048278151575E+06,       0.100753131768219901E+06,       0.100640279785382925E+06,       0.100543839073244162E+06,       0.100470119984832578E+06,
+        0.100412920571785522E+06,       0.100374418672954038E+06,       0.100356321711452154E+06,       0.100359754832890321E+06,       0.100393037545625295E+06,
+        0.100461456665693026E+06,       0.100548040695085903E+06,       0.100649774320544951E+06,       0.100762231735881898E+06,       0.100879810004682629E+06,
+        0.100978944107382951E+06,       0.101056139035317683E+06,       0.101129122973660080E+06,       0.101197131809436498E+06,       0.101259400864402109E+06,
+        0.101315369721067444E+06,       0.101366567376128267E+06,       0.101413068730518760E+06,       0.101456050767495792E+06,       0.101497394979706776E+06,
+        0.101540388547235518E+06,       0.101589723482442452E+06,       0.101639287384227951E+06,       0.101688119127630343E+06,       0.101734881227949692E+06,
+        0.101774055633342999E+06,       0.101806176343790416E+06,       0.101833758016756707E+06,       0.101855867301477920E+06,       0.101869669516056863E+06,
+        0.101867423844660036E+06,       0.101862185064065459E+06,       0.101857648911106618E+06,       0.101857166947219768E+06,       0.101869453362050233E+06,
+        0.101889395994667357E+06,       0.101917145273055416E+06,       0.101952665990595080E+06,       0.102005113066678605E+06,       0.102059201352783610E+06,
+        0.102110590092891594E+06,       0.102155134120450733E+06,       0.102189008661845161E+06,       0.102212893719536674E+06,       0.102224794573552019E+06,
+        0.102221917283866860E+06,       0.102203717818992911E+06,       0.102173729797711843E+06,       0.102134066117315539E+06,       0.102088155198460590E+06,
+        0.102037322504280150E+06,       0.101983804157969324E+06,       0.101930882216981918E+06,       0.101882568835916391E+06,       0.101835848097687121E+06,
+        0.101791045975844638E+06,       0.101745969221785286E+06,       0.101701401299452598E+06,       0.101658034247290489E+06,       0.101613792586539625E+06,
+        0.101566658381616784E+06,       0.101523107840297394E+06,       0.101485865057037794E+06,       0.101467196461575470E+06,       0.101465231282475186E+06,
+        0.101481792269703801E+06,       0.101521171184929379E+06,       0.101584362409188645E+06,       0.101654606382538637E+06,       0.101708085889500013E+06,
+        0.101750884319908815E+06,       0.101781151271932016E+06,       0.101802265119226417E+06,       0.101814660749166302E+06,       0.101818059160636913E+06,
+        0.101815376584443497E+06,       0.101808025978518664E+06,       0.101796093709958877E+06,       0.101783205967926551E+06,       0.101773519465245452E+06,
+        0.101768347262196490E+06,       0.101772318875173907E+06,       0.101774032894583841E+06,       0.101769304008539359E+06,       0.101752736287782580E+06,
+        0.101724576811767562E+06,       0.101687606667018787E+06,       0.101642832213384885E+06,       0.101588413046507747E+06,       0.101532052789407389E+06,
+        0.101477089478998780E+06,       0.101426937636667906E+06,       0.101383983337104524E+06,       0.101350070067916895E+06,       0.101327894217902314E+06,
+        0.101330294767154453E+06,       0.101349863124191863E+06,       0.101379498558547202E+06,       0.101415335536042723E+06,       0.101450570253408456E+06,
+        0.101486617503024216E+06,       0.101521790468661828E+06,       0.101553679702050722E+06,       0.101576951634593526E+06,       0.101592599322586801E+06,
+        0.101600882539355007E+06,       0.101601982296252419E+06,       0.101593711037322297E+06,       0.101576295595724252E+06,       0.101552760225610255E+06,
+        0.101525860012702775E+06,       0.101500304746004782E+06,       0.101482529221745732E+06,       0.101472615361795470E+06,       0.101472486373178777E+06,
+        0.101483501295817390E+06,       0.101509279618775763E+06,       0.101549321581216165E+06,       0.101600205319342873E+06,       0.101659295372980385E+06,
+        0.101721590076149907E+06,       0.101783337171577281E+06,       0.101842427132610639E+06,       0.101897333754838794E+06,       0.101946395082493676E+06,
+        0.101988236942542819E+06,       0.102017526821220177E+06,       0.102031828714653369E+06,       0.102041305631011754E+06,       0.102047936605813040E+06,
+        0.102053545022376406E+06,       0.100561618890645521E+06,       0.100618675407796312E+06,       0.100685232428278308E+06,       0.100760148812781379E+06,
+        0.100842043992347171E+06,       0.100930626779751663E+06,       0.101025380770443604E+06,       0.101121496737499227E+06,       0.101216863489791329E+06,
+        0.101306591907260168E+06,       0.101390820508431876E+06,       0.101469198549494278E+06,       0.101540194252744899E+06,       0.101602382440106187E+06,
+        0.101654511301229999E+06,       0.101695567045773627E+06,       0.101724835997739530E+06,       0.101738206502799672E+06,       0.101728469792924647E+06,
+        0.101706705766990082E+06,       0.101673943944349550E+06,       0.101630654689779229E+06,       0.101577521269946941E+06,       0.101515423259462186E+06,
+        0.101445417400194085E+06,       0.101369301689578249E+06,       0.101289207179891833E+06,       0.101202291357723705E+06,       0.101109840862024794E+06,
+        0.101010060536526478E+06,       0.100903624985256116E+06,       0.100797206247763170E+06,       0.100697721229483854E+06,       0.100617879166639119E+06,
+        0.100549334862444375E+06,       0.100494554672908853E+06,       0.100455829928310864E+06,       0.100435159192249281E+06,       0.100434140902790139E+06,
+        0.100463827743078145E+06,       0.100516682399563157E+06,       0.100588924784875649E+06,       0.100677081454071609E+06,       0.100775641942890885E+06,
+        0.100875619518922729E+06,       0.100945870321605689E+06,       0.101013133541299816E+06,       0.101077503451870405E+06,       0.101138697419382283E+06,
+        0.101196245970018281E+06,       0.101247478059058092E+06,       0.101295381961911495E+06,       0.101341293286219021E+06,       0.101385520658941925E+06,
+        0.101428507369388099E+06,       0.101477628384924552E+06,       0.101527439265766385E+06,       0.101575625370267109E+06,       0.101621502298168052E+06,
+        0.101663832962092813E+06,       0.101694866512688139E+06,       0.101720503961646493E+06,       0.101740691340596662E+06,       0.101755087321406769E+06,
+        0.101753809082437700E+06,       0.101741526291839808E+06,       0.101728608499199152E+06,       0.101718502985755840E+06,       0.101716703972249219E+06,
+        0.101727329002141589E+06,       0.101746865685733879E+06,       0.101776394054624689E+06,       0.101821041668101156E+06,       0.101883903619016666E+06,
+        0.101950707313021689E+06,       0.102016579439056790E+06,       0.102074857884153607E+06,       0.102122966684235507E+06,       0.102162229375958646E+06,
+        0.102191070936530305E+06,       0.102205291241337400E+06,       0.102205781057829736E+06,       0.102194562190391560E+06,       0.102173148282368042E+06,
+        0.102144343637741913E+06,       0.102108830373893230E+06,       0.102068178268037620E+06,       0.102026306869767315E+06,       0.101984352807968040E+06,
+        0.101941207962857719E+06,       0.101897306791024865E+06,       0.101851675563811092E+06,       0.101805566459294409E+06,       0.101759497966033654E+06,
+        0.101711369603787127E+06,       0.101663340792011426E+06,       0.101619227450208040E+06,       0.101582695699032221E+06,       0.101558695579259147E+06,
+        0.101546029798913645E+06,       0.101545588074274448E+06,       0.101567771713567665E+06,       0.101607748589558381E+06,       0.101688531278736336E+06,
+        0.101712604992569381E+06,       0.101743096832469848E+06,       0.101760620836449103E+06,       0.101769961191482769E+06,       0.101772822414354494E+06,
+        0.101770897529126829E+06,       0.101765958574697099E+06,       0.101759443212774597E+06,       0.101753267088761611E+06,       0.101750523367411457E+06,
+        0.101749706624054088E+06,       0.101749678109808025E+06,       0.101749285406108000E+06,       0.101744523322546709E+06,       0.101733022628531995E+06,
+        0.101711787295703034E+06,       0.101679008351294804E+06,       0.101639130834085285E+06,       0.101593625025334943E+06,       0.101541393928166348E+06,
+        0.101487105460277933E+06,       0.101434417444056598E+06,       0.101385551046964029E+06,       0.101342006161188154E+06,       0.101307140291916905E+06,
+        0.101283659047930778E+06,       0.101280818499683781E+06,       0.101302531797972479E+06,       0.101335121595155433E+06,       0.101374651651055479E+06,
+        0.101415853089015101E+06,       0.101456337388213346E+06,       0.101495434796083166E+06,       0.101530692665964845E+06,       0.101556780887815577E+06,
+        0.101572252524485899E+06,       0.101580348283763422E+06,       0.101581288046389862E+06,       0.101573497525049606E+06,       0.101553231842264839E+06,
+        0.101527699101148173E+06,       0.101500366015751919E+06,       0.101475147159402040E+06,       0.101462872833845016E+06,       0.101461553787802579E+06,
+        0.101470899121458526E+06,       0.101491574771335596E+06,       0.101526109462851629E+06,       0.101575993595638676E+06,       0.101633539000189689E+06,
+        0.101696017474012726E+06,       0.101760468358366721E+06,       0.101823741442191822E+06,       0.101882328042741588E+06,       0.101936367528451112E+06,
+        0.101984427337493747E+06,       0.102025414498975340E+06,       0.102058638462272647E+06,       0.102075739484648249E+06,       0.102084208298001584E+06,
+        0.102090352048999324E+06,       0.102097473483009948E+06,       0.100548208007167515E+06,       0.100605095427047316E+06,       0.100670706010579946E+06,
+        0.100743978438203791E+06,       0.100823629545142438E+06,       0.100908178696427160E+06,       0.100995982580288008E+06,       0.101087314481146692E+06,
+        0.101176414116338347E+06,       0.101262458356531424E+06,       0.101344547676157905E+06,       0.101421163164599711E+06,       0.101490796631980134E+06,
+        0.101552014265238700E+06,       0.101603518886931997E+06,       0.101644210460807284E+06,       0.101673244462872826E+06,       0.101680735386759538E+06,
+        0.101674706326058280E+06,       0.101655388783202914E+06,       0.101624670690422980E+06,       0.101584138623298597E+06,       0.101534372942937815E+06,
+        0.101476149074961329E+06,       0.101410568098193849E+06,       0.101343974609530458E+06,       0.101270896963409337E+06,       0.101192137510717424E+06,
+        0.101108880683603289E+06,       0.101022724309234283E+06,       0.100935715390839119E+06,       0.100850390680374665E+06,       0.100774745624155403E+06,
+        0.100703597598235123E+06,       0.100641200968575649E+06,       0.100589854186508950E+06,       0.100551830710988637E+06,       0.100529267606730675E+06,
+        0.100528295556730111E+06,       0.100549682448172025E+06,       0.100589658714417616E+06,       0.100646339245096955E+06,       0.100716647083594595E+06,
+        0.100796330849082777E+06,       0.100862509969368170E+06,       0.100921980592583743E+06,       0.100978572070364797E+06,       0.101033342690100937E+06,
+        0.101086524659137300E+06,       0.101137201268390738E+06,       0.101183872284207260E+06,       0.101229010938212319E+06,       0.101273109489612165E+06,
+        0.101316619892713090E+06,       0.101361395459038307E+06,       0.101412097251747749E+06,       0.101462443230712757E+06,       0.101510984330326377E+06,
+        0.101556016862365155E+06,       0.101593723038725308E+06,       0.101622224707454676E+06,       0.101642725690420295E+06,       0.101656123946685548E+06,
+        0.101662476115757090E+06,       0.101646779923387396E+06,       0.101626132803217159E+06,       0.101605491482854268E+06,       0.101589147781629013E+06,
+        0.101585251139149026E+06,       0.101593208937773641E+06,       0.101612184718608827E+06,       0.101643206312575028E+06,       0.101695818816071987E+06,
+        0.101764928221785813E+06,       0.101840193899589591E+06,       0.101916494038259974E+06,       0.101982907500618603E+06,       0.102040970845980133E+06,
+        0.102091837845918839E+06,       0.102134078254784647E+06,       0.102164394058369740E+06,       0.102183887971255608E+06,       0.102192909965391460E+06,
+        0.102191628213096585E+06,       0.102180725302393228E+06,       0.102161729213580154E+06,       0.102136138522838941E+06,       0.102107142982990175E+06,
+        0.102074807010027405E+06,       0.102039103318180598E+06,       0.102000767273371166E+06,       0.101960362993373739E+06,       0.101918302600709168E+06,
+        0.101875356744285367E+06,       0.101830760544282428E+06,       0.101787058843222650E+06,       0.101746854946198102E+06,       0.101712081627763269E+06,
+        0.101684170852595838E+06,       0.101663959106856215E+06,       0.101652494286064044E+06,       0.101669560085676902E+06,       0.101704444840698343E+06,
+        0.101700571875176043E+06,       0.101721535240709272E+06,       0.101745779185469408E+06,       0.101743873285487498E+06,       0.101738112527286779E+06,
+        0.101730354652939321E+06,       0.101722249363334777E+06,       0.101714810079808434E+06,       0.101708639567806546E+06,       0.101706113756708350E+06,
+        0.101714036658689380E+06,       0.101722369687996295E+06,       0.101728359378835914E+06,       0.101725407412529981E+06,       0.101714092896974922E+06,
+        0.101695958827062772E+06,       0.101670373525743838E+06,       0.101635678816692453E+06,       0.101595418488830386E+06,       0.101550830010831283E+06,
+        0.101501001127021242E+06,       0.101448446456819016E+06,       0.101396954698346424E+06,       0.101348845039631386E+06,       0.101304062386825870E+06,
+        0.101267451987425215E+06,       0.101242193004994537E+06,       0.101233636404356381E+06,       0.101254846780972948E+06,       0.101287816325990920E+06,
+        0.101328479900242310E+06,       0.101372263340125617E+06,       0.101414617472293321E+06,       0.101455579958959497E+06,       0.101492853465017077E+06,
+        0.101523278594798670E+06,       0.101540885808085994E+06,       0.101551450070809791E+06,       0.101555278183125236E+06,       0.101552538038431827E+06,
+        0.101533468414678850E+06,       0.101508500675057512E+06,       0.101482796927905787E+06,       0.101462379842144772E+06,       0.101454892688142470E+06,
+        0.101464325466535738E+06,       0.101484135316789325E+06,       0.101513829601535981E+06,       0.101552601163330517E+06,       0.101603687744035284E+06,
+        0.101663791684624332E+06,       0.101727767774695865E+06,       0.101792762408730807E+06,       0.101856171640086162E+06,       0.101914393070144404E+06,
+        0.101966522189743861E+06,       0.102012469486766611E+06,       0.102051444457628037E+06,       0.102084940153698932E+06,       0.102109046172999864E+06,
+        0.102120432478447823E+06,       0.102128404810622902E+06,       0.102134103220031029E+06,       0.100537775584916468E+06,       0.100594064464056602E+06,
+        0.100658361556240663E+06,       0.100729672253821584E+06,       0.100806792979668055E+06,       0.100888331818478662E+06,       0.100972640703881028E+06,
+        0.101054356923499276E+06,       0.101136218305642746E+06,       0.101218059282136164E+06,       0.101297128938538604E+06,       0.101371075949467442E+06,
+        0.101438396724319813E+06,       0.101497631946100053E+06,       0.101547424352719638E+06,       0.101586575081165560E+06,       0.101605344305898223E+06,
+        0.101611802560867160E+06,       0.101607062825132700E+06,       0.101591492022024759E+06,       0.101565740711957988E+06,       0.101530433274754861E+06,
+        0.101485334233030881E+06,       0.101432291750987933E+06,       0.101377329376169117E+06,       0.101317207789115375E+06,       0.101251671625233779E+06,
+        0.101181417558871472E+06,       0.101107498655681804E+06,       0.101031350521440603E+06,       0.100954821051961742E+06,       0.100889588668171375E+06,
+        0.100831564213864112E+06,       0.100778330447916189E+06,       0.100731315465427993E+06,       0.100686629349019524E+06,       0.100649847468544394E+06,
+        0.100626941602005361E+06,       0.100623247975728824E+06,       0.100634858419738637E+06,       0.100661484011766472E+06,       0.100701891329741135E+06,
+        0.100753800334865009E+06,       0.100807541818709986E+06,       0.100848659308669099E+06,       0.100892548219874385E+06,       0.100938268977634565E+06,
+        0.100984815257879964E+06,       0.101031244555508310E+06,       0.101077229148432787E+06,       0.101120811543651638E+06,       0.101163080762204729E+06,
+        0.101205133328227632E+06,       0.101247555470727515E+06,       0.101295212705033598E+06,       0.101345677435592734E+06,       0.101395414916676789E+06,
+        0.101443142113523310E+06,       0.101487391928729412E+06,       0.101523112860496927E+06,       0.101551091220213115E+06,       0.101571202362138647E+06,
+        0.101582765233024111E+06,       0.101580576420733298E+06,       0.101559006090641735E+06,       0.101532638260340871E+06,       0.101505636854472148E+06,
+        0.101482925905383032E+06,       0.101478221569192814E+06,       0.101483749961331385E+06,       0.101500913638159356E+06,       0.101531272427147036E+06,
+        0.101587537367870260E+06,       0.101657752923680528E+06,       0.101735341257440305E+06,       0.101815392189158199E+06,       0.101883415778570139E+06,
+        0.101946670918334348E+06,       0.102005217869353437E+06,       0.102057696492837160E+06,       0.102103056512906318E+06,       0.102140317424393026E+06,
+        0.102168554530401248E+06,       0.102186118819968382E+06,       0.102192209463688341E+06,       0.102189750578587409E+06,       0.102179864477714669E+06,
+        0.102164622014063440E+06,       0.102144222519251431E+06,       0.102119031801210527E+06,       0.102090001778615697E+06,       0.102058500322085427E+06,
+        0.102024456224525828E+06,       0.101988984142914618E+06,       0.101952414757101811E+06,       0.101915891308398845E+06,       0.101881589770049075E+06,
+        0.101851270386932039E+06,       0.101822396029631869E+06,       0.101797879312661476E+06,       0.101778855518825338E+06,       0.101766764384149530E+06,
+        0.101767117846749301E+06,       0.101765125533417420E+06,       0.101764893632733350E+06,       0.101755791518637372E+06,       0.101738415072208983E+06,
+        0.101717693412627370E+06,       0.101697849566573597E+06,       0.101679653680022544E+06,       0.101666036116405725E+06,       0.101657802915804903E+06,
+        0.101659358381537619E+06,       0.101675042132274451E+06,       0.101690591932105221E+06,       0.101702102691112683E+06,       0.101698890266004499E+06,
+        0.101685170063431069E+06,       0.101664399827034271E+06,       0.101636981850683907E+06,       0.101602430202209493E+06,       0.101562887328751778E+06,
+        0.101519409569218289E+06,       0.101470958313536248E+06,       0.101419317694792786E+06,       0.101368660117972962E+06,       0.101321145110236859E+06,
+        0.101276071087296979E+06,       0.101238240695380387E+06,       0.101211277007847661E+06,       0.101197902530338179E+06,       0.101215581555680212E+06,
+        0.101246094621904544E+06,       0.101284825497456564E+06,       0.101328072813235674E+06,       0.101370225701783012E+06,       0.101411514155655474E+06,
+        0.101449747457354388E+06,       0.101482930506732373E+06,       0.101505336383574511E+06,       0.101520932260299305E+06,       0.101530875621757339E+06,
+        0.101535660531138637E+06,       0.101527586118792417E+06,       0.101509422337400800E+06,       0.101491464951296075E+06,       0.101477501245060659E+06,
+        0.101471117495995146E+06,       0.101486007619632292E+06,       0.101510757134502812E+06,       0.101544449952577212E+06,       0.101586055913800505E+06,
+        0.101635695535260849E+06,       0.101695729268481853E+06,       0.101758721424995805E+06,       0.101822050355179599E+06,       0.101883639102236455E+06,
+        0.101943513401448537E+06,       0.101994845858460889E+06,       0.102039591261445501E+06,       0.102076829661285185E+06,       0.102105964877399136E+06,
+        0.102126794141653125E+06,       0.102139212624906431E+06,       0.102146437567661822E+06,       0.102150500772487969E+06,       0.100529766660700814E+06,
+        0.100584936771645967E+06,       0.100647449978120101E+06,       0.100716367627817162E+06,       0.100790551176116554E+06,       0.100867761991881081E+06,
+        0.100944392016551021E+06,       0.101022283363768598E+06,       0.101100094859150340E+06,       0.101176390860314190E+06,       0.101249683961219664E+06,
+        0.101319429056106397E+06,       0.101383533080313195E+06,       0.101439851116198683E+06,       0.101486953091034593E+06,       0.101514035380600777E+06,
+        0.101530274350960754E+06,       0.101536503930903316E+06,       0.101532791192708028E+06,       0.101519414459226711E+06,       0.101496896545514726E+06,
+        0.101466032997577611E+06,       0.101427914819550628E+06,       0.101386928031759133E+06,       0.101339510051842895E+06,       0.101286534144961479E+06,
+        0.101229073267725224E+06,       0.101167697805292846E+06,       0.101103306882333491E+06,       0.101037149535454111E+06,       0.100976699320003900E+06,
+        0.100924651148493227E+06,       0.100875357695395811E+06,       0.100829790933326149E+06,       0.100789063316662927E+06,       0.100754382631035871E+06,
+        0.100727001544673127E+06,       0.100712812235705482E+06,       0.100707393276471601E+06,       0.100709250582931563E+06,       0.100722573388958059E+06,
+        0.100746645734061545E+06,       0.100779895700786001E+06,       0.100804396943602027E+06,       0.100830073367685545E+06,       0.100859556300720957E+06,
+        0.100892387870409642E+06,       0.100927975633083144E+06,       0.100965551602012056E+06,       0.101004683619487085E+06,       0.101045330597207460E+06,
+        0.101087013008305672E+06,       0.101129446011777312E+06,       0.101173089623770706E+06,       0.101224746709176397E+06,       0.101276086346010212E+06,
+        0.101326149198708168E+06,       0.101374129662616979E+06,       0.101418481717269460E+06,       0.101456308681409500E+06,       0.101487100471046055E+06,
+        0.101509891159304345E+06,       0.101523887972284254E+06,       0.101519085107067789E+06,       0.101499035636973305E+06,       0.101474107212159681E+06,
+        0.101448532598947975E+06,       0.101428087461135481E+06,       0.101420183587270294E+06,       0.101421890388346379E+06,       0.101434924963140438E+06,
+        0.101461175739645623E+06,       0.101512942173575240E+06,       0.101576674737662266E+06,       0.101648311032956131E+06,       0.101723489882150840E+06,
+        0.101787480132178534E+06,       0.101850028038504926E+06,       0.101910282046108841E+06,       0.101967661149882086E+06,       0.102023524732844948E+06,
+        0.102074242265323439E+06,       0.102118210977073832E+06,       0.102152171123111169E+06,       0.102173114540454029E+06,       0.102185669537254769E+06,
+        0.102190716001940251E+06,       0.102189608656019511E+06,       0.102183136999173483E+06,       0.102171644521202223E+06,       0.102155743904811548E+06,
+        0.102135288964191917E+06,       0.102110694874428111E+06,       0.102083194402445937E+06,       0.102053140888443799E+06,       0.102023029614340878E+06,
+        0.101994305634375618E+06,       0.101968130490490352E+06,       0.101944981816832049E+06,       0.101917533305451230E+06,       0.101891792228334729E+06,
+        0.101867962161627947E+06,       0.101846942835226117E+06,       0.101828399128989535E+06,       0.101808349218342468E+06,       0.101783185169399527E+06,
+        0.101752129728330387E+06,       0.101717730687555537E+06,       0.101682415904166002E+06,       0.101651064189548269E+06,       0.101628214835530569E+06,
+        0.101615101470726600E+06,       0.101622078677434256E+06,       0.101640462768905272E+06,       0.101659951220889372E+06,       0.101675418801938606E+06,
+        0.101673225878615136E+06,       0.101661928138148622E+06,       0.101642662123728296E+06,       0.101615888022248750E+06,       0.101582080924031965E+06,
+        0.101543348953446970E+06,       0.101500631267208417E+06,       0.101452586432289259E+06,       0.101401256146737229E+06,       0.101350655526253569E+06,
+        0.101302884790491065E+06,       0.101258041134635379E+06,       0.101219975854280870E+06,       0.101192075948155878E+06,       0.101176911767419486E+06,
+        0.101189137340948175E+06,       0.101215695508690798E+06,       0.101250828629981872E+06,       0.101291224981271953E+06,       0.101331080207125036E+06,
+        0.101370380504028988E+06,       0.101408081153893057E+06,       0.101442820210735677E+06,       0.101470980944890180E+06,       0.101493569638212546E+06,
+        0.101512139169726375E+06,       0.101526611096755121E+06,       0.101532495997983948E+06,       0.101522627542459595E+06,       0.101512420265735462E+06,
+        0.101505304745591246E+06,       0.101504334695817597E+06,       0.101519650872094615E+06,       0.101547899391185740E+06,       0.101583965970937570E+06,
+        0.101627433236286277E+06,       0.101678082609776582E+06,       0.101737298190423375E+06,       0.101799968663717998E+06,       0.101862212637869627E+06,
+        0.101921525254885390E+06,       0.101975615485969174E+06,       0.102022129365600340E+06,       0.102060753757629835E+06,       0.102091435012152549E+06,
+        0.102114037703653419E+06,       0.102128864386004381E+06,       0.102136712377933785E+06,       0.102141341896670521E+06,       0.102142376150148193E+06,
+        0.100523535976660394E+06,       0.100577052820581303E+06,       0.100637236479140498E+06,       0.100703252727134633E+06,       0.100772552025250538E+06,
+        0.100843355148487011E+06,       0.100916200005643404E+06,       0.100989978980367348E+06,       0.101063458978865412E+06,       0.101135313180651341E+06,
+        0.101204158192835064E+06,       0.101268596961150513E+06,       0.101327267803054579E+06,       0.101379219393509498E+06,       0.101411658551840825E+06,
+        0.101435013304419204E+06,       0.101449723991433348E+06,       0.101455671589434161E+06,       0.101452876078218949E+06,       0.101441532989260799E+06,
+        0.101422046210621003E+06,       0.101395056661309005E+06,       0.101365757780455795E+06,       0.101332677387078918E+06,       0.101293673363073496E+06,
+        0.101249457127459696E+06,       0.101201011753970408E+06,       0.101149108558075517E+06,       0.101094587629913221E+06,       0.101040779590145175E+06,
+        0.100995382496306906E+06,       0.100951579695860622E+06,       0.100909850434587090E+06,       0.100870858422985533E+06,       0.100835419863702089E+06,
+        0.100804467614276640E+06,       0.100781685669042199E+06,       0.100767335396187831E+06,       0.100759289879836622E+06,       0.100757866722066232E+06,
+        0.100763078005519506E+06,       0.100774506516805646E+06,       0.100786062954307781E+06,       0.100793269206959361E+06,       0.100804822422906916E+06,
+        0.100820834091496698E+06,       0.100841255618750598E+06,       0.100865889078778535E+06,       0.100894749198775666E+06,       0.100927416956011424E+06,
+        0.100963395796724551E+06,       0.101002315623510774E+06,       0.101043887250100248E+06,       0.101091039191901757E+06,       0.101144066547046401E+06,
+        0.101197932497966991E+06,       0.101251195535936524E+06,       0.101302429885710808E+06,       0.101350642114984890E+06,       0.101394018940216731E+06,
+        0.101430608604817069E+06,       0.101459057570376521E+06,       0.101478044590623220E+06,       0.101475387865733283E+06,       0.101461856537208994E+06,
+        0.101443018892087159E+06,       0.101422586718123261E+06,       0.101406882059484167E+06,       0.101400350668646613E+06,       0.101401136819027641E+06,
+        0.101411047287252732E+06,       0.101432998273655045E+06,       0.101475019664207721E+06,       0.101526976345226532E+06,       0.101585936905203198E+06,
+        0.101648470322235924E+06,       0.101703644183282871E+06,       0.101759331828263079E+06,       0.101814866055730265E+06,       0.101869901220545507E+06,
+        0.101928914084517004E+06,       0.101985712555209233E+06,       0.102038213057230983E+06,       0.102083503006818413E+06,       0.102116318481194263E+06,
+        0.102142478770143352E+06,       0.102162510227578357E+06,       0.102176745632176331E+06,       0.102185382260760132E+06,       0.102189351865029588E+06,
+        0.102188985060908250E+06,       0.102181978502190381E+06,       0.102166343098074416E+06,       0.102144949217122790E+06,       0.102118539343817305E+06,
+        0.102090320241642432E+06,       0.102064949154931208E+06,       0.102041510471142406E+06,       0.102020894051233234E+06,       0.102002076919490239E+06,
+        0.101978687982916701E+06,       0.101949947159686926E+06,       0.101920721729201105E+06,       0.101890840787188339E+06,       0.101858502442174227E+06,
+        0.101821787050020226E+06,       0.101779170614060145E+06,       0.101731633607835785E+06,       0.101683872606227975E+06,       0.101641706250363815E+06,
+        0.101609757163432500E+06,       0.101594408710602715E+06,       0.101599861763739507E+06,       0.101615600568650814E+06,       0.101634792862023707E+06,
+        0.101649560822422354E+06,       0.101653324074520948E+06,       0.101647718645786255E+06,       0.101632892509714380E+06,       0.101607498410070068E+06,
+        0.101573604987650251E+06,       0.101534332171428061E+06,       0.101490882315485491E+06,       0.101441914985506301E+06,       0.101390598505943577E+06,
+        0.101340225499994325E+06,       0.101292893172337470E+06,       0.101249121490931240E+06,       0.101212206615971038E+06,       0.101184803983927792E+06,
+        0.101169090523178049E+06,       0.101177216406820677E+06,       0.101199121436619549E+06,       0.101229487274117826E+06,       0.101265433425285810E+06,
+        0.101301460838134211E+06,       0.101337546551032807E+06,       0.101373572179327981E+06,       0.101408481747705810E+06,       0.101441269413672373E+06,
+        0.101471589979924611E+06,       0.101499094210238720E+06,       0.101523046431578827E+06,       0.101542483002773370E+06,       0.101543831013172356E+06,
+        0.101544064378257113E+06,       0.101546276856648081E+06,       0.101553107004487800E+06,       0.101570758226424994E+06,       0.101603899362922981E+06,
+        0.101643466171828870E+06,       0.101688020902613556E+06,       0.101736066489577410E+06,       0.101788778651382352E+06,       0.101846229772819366E+06,
+        0.101902087545993330E+06,       0.101954243560902876E+06,       0.102000912067655503E+06,       0.102040460468150268E+06,       0.102070397922830496E+06,
+        0.102092123176266672E+06,       0.102106027606901625E+06,       0.102112955537274407E+06,       0.102114233430400913E+06,       0.102110160726652859E+06,
+        0.102103564706523437E+06,       0.100518689604693471E+06,       0.100570188968489383E+06,       0.100627085580226092E+06,       0.100688425846865008E+06,
+        0.100752801664219747E+06,       0.100819711434372482E+06,       0.100888275239485200E+06,       0.100957467842034559E+06,       0.101026141537060103E+06,
+        0.101093053338000958E+06,       0.101156896762082222E+06,       0.101216338486683555E+06,       0.101270050228910055E+06,       0.101303959592322863E+06,
+        0.101331155104026548E+06,       0.101351367252466414E+06,       0.101364631606699608E+06,       0.101370354947362532E+06,       0.101368511938952593E+06,
+        0.101359219879845390E+06,       0.101342770712901329E+06,       0.101323279228074665E+06,       0.101301442257920979E+06,       0.101274216777385765E+06,
+        0.101241963101549714E+06,       0.101205245491941663E+06,       0.101164856326946916E+06,       0.101121839477416492E+06,       0.101077512757932636E+06,
+        0.101040769978266762E+06,       0.101003816768457153E+06,       0.100967482943484662E+06,       0.100932599047362921E+06,       0.100899538621347674E+06,
+        0.100868835073115974E+06,       0.100841822788138859E+06,       0.100822146543393857E+06,       0.100806275342578825E+06,       0.100794425676255967E+06,
+        0.100786746583171247E+06,       0.100783223558698664E+06,       0.100783580356914550E+06,       0.100777240593710594E+06,       0.100772797244677698E+06,
+        0.100771995893256535E+06,       0.100775628518037935E+06,       0.100784330892865575E+06,       0.100798832415402489E+06,       0.100819830174998613E+06,
+        0.100845869940026445E+06,       0.100876821716840641E+06,       0.100912505059014773E+06,       0.100952732377084161E+06,       0.101002888396750073E+06,
+        0.101057716858402928E+06,       0.101114463416698447E+06,       0.101171669964558023E+06,       0.101227895955215106E+06,       0.101283382095900626E+06,
+        0.101334958226825765E+06,       0.101380444142405948E+06,       0.101418245220739525E+06,       0.101446407440058887E+06,       0.101450870781566424E+06,
+        0.101446840525337553E+06,       0.101437171069169228E+06,       0.101424931486162226E+06,       0.101415799787063268E+06,       0.101412071436230064E+06,
+        0.101412950725123417E+06,       0.101420014842418866E+06,       0.101435968083775937E+06,       0.101466352271600088E+06,       0.101503661068658505E+06,
+        0.101546063702057072E+06,       0.101591631627750539E+06,       0.101633780932880036E+06,       0.101677233535571504E+06,       0.101722001382731454E+06,
+        0.101768084603012278E+06,       0.101821697636718192E+06,       0.101876504987276159E+06,       0.101929725277785576E+06,       0.101979436992402916E+06,
+        0.102021048948978249E+06,       0.102058738337406423E+06,       0.102093407361196325E+06,       0.102125483850517805E+06,       0.102150396359340550E+06,
+        0.102169939569479524E+06,       0.102183985952502859E+06,       0.102191376525420768E+06,       0.102185685603385369E+06,       0.102169450367412603E+06,
+        0.102146358644484295E+06,       0.102119842646822071E+06,       0.102094075555721618E+06,       0.102073636097204362E+06,       0.102056299206566269E+06,
+        0.102039605800132485E+06,       0.102021374390271580E+06,       0.101998770599080817E+06,       0.101970853166201807E+06,       0.101937971227922506E+06,
+        0.101900413338984057E+06,       0.101857321774920129E+06,       0.101808436773914334E+06,       0.101755010517902134E+06,       0.101701108954033160E+06,
+        0.101652170013780356E+06,       0.101614009141804403E+06,       0.101594396568573589E+06,       0.101591391668390439E+06,       0.101601222158549106E+06,
+        0.101618244864968845E+06,       0.101635666146591233E+06,       0.101645911116270872E+06,       0.101646699642323045E+06,       0.101636431221179548E+06,
+        0.101609654908569675E+06,       0.101575048385323738E+06,       0.101534330175456344E+06,       0.101489532139668852E+06,       0.101438185377782967E+06,
+        0.101385959560380783E+06,       0.101335194667244825E+06,       0.101287926354806812E+06,       0.101245203663320397E+06,       0.101209646717536321E+06,
+        0.101183113534233489E+06,       0.101167399256673903E+06,       0.101173255047212093E+06,       0.101191266867459737E+06,       0.101217555082850216E+06,
+        0.101249738922742486E+06,       0.101282540292244405E+06,       0.101316175523455371E+06,       0.101351248733287808E+06,       0.101387035478988051E+06,
+        0.101423676548066695E+06,       0.101461316613871037E+06,       0.101497507316982592E+06,       0.101531170814716766E+06,       0.101561263551730270E+06,
+        0.101576206116756410E+06,       0.101586714996634080E+06,       0.101597778963160541E+06,       0.101611464789349586E+06,       0.101630169532632644E+06,
+        0.101664927306783313E+06,       0.101704113353483583E+06,       0.101746416585083251E+06,       0.101790584390523509E+06,       0.101835630759291264E+06,
+        0.101885286326592308E+06,       0.101932452931491775E+06,       0.101975582690834839E+06,       0.102013491689891205E+06,       0.102045391567770363E+06,
+        0.102064776694095723E+06,       0.102074647376751818E+06,       0.102077355461506435E+06,       0.102073009372423272E+06,       0.102062037114194260E+06,
+        0.102045197475351029E+06,       0.102032862053345467E+06,       0.100516203599419721E+06,       0.100565218916304395E+06,       0.100617260891664730E+06,
+        0.100673956912948721E+06,       0.100734470974993252E+06,       0.100796865106346027E+06,       0.100860518975916333E+06,       0.100924514220946570E+06,
+        0.100987769915576093E+06,       0.101049106773664753E+06,       0.101107273840837661E+06,       0.101159905161335395E+06,       0.101194545284544540E+06,
+        0.101223680392232840E+06,       0.101247089234949191E+06,       0.101264590537126525E+06,       0.101276076890375974E+06,       0.101281552099694847E+06,
+        0.101280982310362175E+06,       0.101273943686812767E+06,       0.101262940282394411E+06,       0.101250027136122240E+06,       0.101232503141791327E+06,
+        0.101210483653828545E+06,       0.101184228737493526E+06,       0.101154165002910086E+06,       0.101120906752935975E+06,       0.101085276329601198E+06,
+        0.101055059197187191E+06,       0.101026747435691374E+06,       0.100998039675420368E+06,       0.100969366867174089E+06,       0.100941239345533730E+06,
+        0.100914229378812437E+06,       0.100888324815689179E+06,       0.100866108957016506E+06,       0.100846788167441075E+06,       0.100829635550168416E+06,
+        0.100814589974162533E+06,       0.100801624509251793E+06,       0.100790670060632678E+06,       0.100777235449754880E+06,       0.100759761272309115E+06,
+        0.100744498201414157E+06,       0.100732510380326974E+06,       0.100724806452672536E+06,       0.100722312648745443E+06,       0.100727124797232929E+06,
+        0.100739250727341408E+06,       0.100757924088756554E+06,       0.100783210335334952E+06,       0.100815143464493012E+06,       0.100854893070929611E+06,
+        0.100907659832364327E+06,       0.100964923673006793E+06,       0.101024919613124526E+06,       0.101086575092280807E+06,       0.101148693938726588E+06,
+        0.101212491181683130E+06,       0.101273236178490639E+06,       0.101328963344270000E+06,       0.101377761563192791E+06,       0.101415272026218052E+06,
+        0.101431876200949133E+06,       0.101440210101162083E+06,       0.101442472419936472E+06,       0.101441025799434588E+06,       0.101440273436921474E+06,
+        0.101441412028859413E+06,       0.101444242700126299E+06,       0.101450026358596937E+06,       0.101460476599565445E+06,       0.101479171248484825E+06,
+        0.101501585380914767E+06,       0.101526832551874162E+06,       0.101554045751632453E+06,       0.101581088175181358E+06,       0.101609436210866566E+06,
+        0.101639553558900094E+06,       0.101671699640266219E+06,       0.101712219603055011E+06,       0.101758423241378463E+06,       0.101805738585399682E+06,
+        0.101852962314692355E+06,       0.101899310754771403E+06,       0.101946265190960024E+06,       0.101994211955312698E+06,       0.102041986736160048E+06,
+        0.102085797585756969E+06,       0.102118247218596109E+06,       0.102143944256965377E+06,       0.102160780837746963E+06,       0.102166943569605079E+06,
+        0.102158326056491831E+06,       0.102140886616651740E+06,       0.102119658913957755E+06,       0.102098499930418155E+06,       0.102080904999102844E+06,
+        0.102066516422517074E+06,       0.102054504472527260E+06,       0.102039748545332608E+06,       0.102020600907278713E+06,       0.101995196360471018E+06,
+        0.101963875490564329E+06,       0.101926792596088359E+06,       0.101883686482137069E+06,       0.101834681537134267E+06,       0.101781342698296125E+06,
+        0.101725325815194636E+06,       0.101672635846780700E+06,       0.101631506833831096E+06,       0.101606236395939879E+06,       0.101597475949642787E+06,
+        0.101603731801431582E+06,       0.101625616805930535E+06,       0.101646355193644980E+06,       0.101660903200991379E+06,       0.101665697733909154E+06,
+        0.101654090491919997E+06,       0.101628201204639379E+06,       0.101592718579965003E+06,       0.101550440364196067E+06,       0.101501865690094695E+06,
+        0.101447993110863157E+06,       0.101394085224710812E+06,       0.101342099839650211E+06,       0.101293810362817196E+06,       0.101250946740538144E+06,
+        0.101215426073013630E+06,       0.101188872150540003E+06,       0.101172928312290038E+06,       0.101177855232292422E+06,       0.101192799356549629E+06,
+        0.101215813274799773E+06,       0.101244944643138500E+06,       0.101275131726042877E+06,       0.101307174081444085E+06,       0.101341749283816956E+06,
+        0.101378289914467692E+06,       0.101417332589792815E+06,       0.101459925058367837E+06,       0.101502062670976826E+06,       0.101542401965262659E+06,
+        0.101579707707947498E+06,       0.101605443608385016E+06,       0.101624638835457939E+06,       0.101643143897028465E+06,       0.101662631727210814E+06,
+        0.101684583160134658E+06,       0.101717073342919160E+06,       0.101753756733753267E+06,       0.101791888041425977E+06,       0.101829704004501327E+06,
+        0.101866836453342432E+06,       0.101904943611418348E+06,       0.101941838182645661E+06,       0.101974805182480457E+06,       0.102002312012851093E+06,
+        0.102022951004307251E+06,       0.102034588422611414E+06,       0.102035115083442288E+06,       0.102027670824049870E+06,       0.102012988929236992E+06,
+        0.101992061827493861E+06,       0.101966142466949459E+06,       0.101941390128694227E+06,       0.100514970796833106E+06,       0.100558835077606142E+06,
+        0.100607260398477549E+06,       0.100659655071357542E+06,       0.100715265417817398E+06,       0.100773178786940116E+06,       0.100832331209467477E+06,
+        0.100890717506978282E+06,       0.100947860531606886E+06,       0.101002917974898708E+06,       0.101052195859970219E+06,       0.101086008388641625E+06,
+        0.101115273930014009E+06,       0.101139857117029198E+06,       0.101159622269959131E+06,       0.101174458955507551E+06,       0.101184310219007501E+06,
+        0.101189203551941042E+06,       0.101189284643897758E+06,       0.101186114007991724E+06,       0.101181270068826241E+06,       0.101171908271853448E+06,
+        0.101158297091944536E+06,       0.101141013465808763E+06,       0.101120226925708761E+06,       0.101096239397641839E+06,       0.101069503529764173E+06,
+        0.101044711943530012E+06,       0.101023498931715556E+06,       0.101001656961748697E+06,       0.100979308414565210E+06,       0.100956646567351941E+06,
+        0.100933930245713549E+06,       0.100911474196776457E+06,       0.100891471408871366E+06,       0.100874184642035718E+06,       0.100856582877880370E+06,
+        0.100838800023023141E+06,       0.100821055717833835E+06,       0.100804211342234223E+06,       0.100787393558680691E+06,       0.100761008720101294E+06,
+        0.100734732500141792E+06,       0.100710174312875781E+06,       0.100688451173672947E+06,       0.100670708926784253E+06,       0.100658093134885828E+06,
+        0.100653547542059678E+06,       0.100656000772829168E+06,       0.100665921580032358E+06,       0.100683713857153736E+06,       0.100709718860814537E+06,
+        0.100748801228508208E+06,       0.100801823503565058E+06,       0.100861225414351109E+06,       0.100925234962917515E+06,       0.100992162379509042E+06,
+        0.101061180367843728E+06,       0.101132825200904612E+06,       0.101202551905614309E+06,       0.101268249128093084E+06,       0.101327796560415067E+06,
+        0.101375435871056281E+06,       0.101404641442907785E+06,       0.101425758115715638E+06,       0.101440394650381306E+06,       0.101450217422559756E+06,
+        0.101458727822546076E+06,       0.101466619611513932E+06,       0.101473463661342525E+06,       0.101480183000528341E+06,       0.101487645084924108E+06,
+        0.101498004691627488E+06,       0.101508871394480026E+06,       0.101520205876727661E+06,       0.101532083912951843E+06,       0.101544647478942308E+06,
+        0.101558096380653675E+06,       0.101573050568899664E+06,       0.101590428478391070E+06,       0.101613972514299414E+06,       0.101648920007989669E+06,
+        0.101687381188284504E+06,       0.101728410452743919E+06,       0.101771447499673959E+06,       0.101823102602039115E+06,       0.101880173737650490E+06,
+        0.101939952057504197E+06,       0.101998671132745076E+06,       0.102047778748635392E+06,       0.102081283700837084E+06,       0.102104626314851310E+06,
+        0.102117132803555040E+06,       0.102118423258010647E+06,       0.102110210033883151E+06,       0.102097574911021075E+06,       0.102084451243621195E+06,
+        0.102073635202554215E+06,       0.102064362043080371E+06,       0.102055076068754133E+06,       0.102042482878204013E+06,       0.102025288372749041E+06,
+        0.102001685111197468E+06,       0.101971967159961292E+06,       0.101935955157193923E+06,       0.101893991729276575E+06,       0.101846831752592378E+06,
+        0.101795519670136433E+06,       0.101743547706146055E+06,       0.101695867126943878E+06,       0.101657509946900449E+06,       0.101633507015335563E+06,
+        0.101630312812292759E+06,       0.101646392192630388E+06,       0.101668889131485266E+06,       0.101690704618882228E+06,       0.101706951776862203E+06,
+        0.101710803657395867E+06,       0.101698215938497582E+06,       0.101672792047461742E+06,       0.101636565396570542E+06,       0.101592796399993240E+06,
+        0.101539557371443312E+06,       0.101482505549964961E+06,       0.101424993232468783E+06,       0.101369854642081831E+06,       0.101318588912198626E+06,
+        0.101273234899637857E+06,       0.101235886605930398E+06,       0.101207937266056106E+06,       0.101192654572110885E+06,       0.101195023201913122E+06,
+        0.101207165308628755E+06,       0.101227217799392965E+06,       0.101253372828479289E+06,       0.101281097568006837E+06,       0.101311856149601605E+06,
+        0.101345648585710995E+06,       0.101381904947258168E+06,       0.101421272631944972E+06,       0.101465042995991040E+06,       0.101508835313142772E+06,
+        0.101551196503329018E+06,       0.101590747790927970E+06,       0.101621682377021876E+06,       0.101645776231220763E+06,       0.101668026172758953E+06,
+        0.101689491310640093E+06,       0.101711039834481373E+06,       0.101739312046503386E+06,       0.101772112447843610E+06,       0.101804858575323728E+06,
+        0.101836540790179512E+06,       0.101866167898941654E+06,       0.101895518959796798E+06,       0.101925181845865300E+06,       0.101950074886373186E+06,
+        0.101969061543749413E+06,       0.101981139844382837E+06,       0.101985462621642117E+06,       0.101977051366888656E+06,       0.101959701573010476E+06,
+        0.101935377351789808E+06,       0.101905526341066099E+06,       0.101871781260336036E+06,       0.101835950124052295E+06,       0.100513581366792612E+06,
+        0.100554019513422492E+06,       0.100598330045055409E+06,       0.100645982440550681E+06,       0.100696296648474527E+06,       0.100748444268485124E+06,
+        0.100801453596632928E+06,       0.100854218792530621E+06,       0.100905513420273754E+06,       0.100949903492433834E+06,       0.100981652101286920E+06,
+        0.101009573882022771E+06,       0.101033642379315977E+06,       0.101053802681678295E+06,       0.101069990410599494E+06,       0.101082152783372076E+06,
+        0.101090271780979238E+06,       0.101094389439540580E+06,       0.101095654589873608E+06,       0.101096426446181518E+06,       0.101093666576257223E+06,
+        0.101087429979991794E+06,       0.101077885304853742E+06,       0.101065339866105438E+06,       0.101050264366095507E+06,       0.101032061623940666E+06,
+        0.101012844290179608E+06,       0.100996964302313558E+06,       0.100980770382518007E+06,       0.100964167390490678E+06,       0.100947108284160218E+06,
+        0.100929597010366851E+06,       0.100911688070060860E+06,       0.100893582156858451E+06,       0.100881499094758808E+06,       0.100868335774262508E+06,
+        0.100853829088449522E+06,       0.100837798044627038E+06,       0.100820106254778977E+06,       0.100800619132333683E+06,       0.100775042434612522E+06,
+        0.100741873481754403E+06,       0.100707732498585203E+06,       0.100674198173852987E+06,       0.100642873485934600E+06,       0.100616787946543613E+06,
+        0.100595574493244218E+06,       0.100580853452354946E+06,       0.100573369371954352E+06,       0.100573991194533155E+06,       0.100583507950136642E+06,
+        0.100602650207284896E+06,       0.100640744734742359E+06,       0.100692244893923940E+06,       0.100751760770043053E+06,       0.100817532941637197E+06,
+        0.100887787830291069E+06,       0.100962050144272376E+06,       0.101039744081827113E+06,       0.101116778936214221E+06,       0.101190892544115282E+06,
+        0.101259778024939151E+06,       0.101317175633898092E+06,       0.101357978697233921E+06,       0.101390994520218446E+06,       0.101417406025828648E+06,
+        0.101438439369066997E+06,       0.101456877295130529E+06,       0.101473268310223793E+06,       0.101486701484946811E+06,       0.101497860785624449E+06,
+        0.101507276039524368E+06,       0.101514237723266677E+06,       0.101518949933443597E+06,       0.101522085026395580E+06,       0.101524243387710812E+06,
+        0.101525990459469860E+06,       0.101528194232853784E+06,       0.101531700114421837E+06,       0.101537410817429205E+06,       0.101546492305229593E+06,
+        0.101567903398293696E+06,       0.101597046994887613E+06,       0.101630996885802393E+06,       0.101669578744430226E+06,       0.101714590729228381E+06,
+        0.101773403370424989E+06,       0.101836874445576148E+06,       0.101900881795697991E+06,       0.101960687121667026E+06,       0.102008686461021774E+06,
+        0.102037960319300764E+06,       0.102056196723826288E+06,       0.102065273055902842E+06,       0.102066914347914004E+06,       0.102063547681288721E+06,
+        0.102059509493393372E+06,       0.102055314339710254E+06,       0.102050951292832178E+06,       0.102044111461623615E+06,       0.102032193928193665E+06,
+        0.102014558041099997E+06,       0.101990243188425869E+06,       0.101960364538554975E+06,       0.101925773749474116E+06,       0.101887402236031689E+06,
+        0.101845900309227552E+06,       0.101802685936693102E+06,       0.101760172705529054E+06,       0.101722211673123806E+06,       0.101698120911338105E+06,
+        0.101693242621827798E+06,       0.101701200555816351E+06,       0.101719376001235738E+06,       0.101743123574903206E+06,       0.101765016750218143E+06,
+        0.101780249253377129E+06,       0.101783141086790420E+06,       0.101773015434274668E+06,       0.101749944711398595E+06,       0.101715364981995837E+06,
+        0.101666832632786492E+06,       0.101609705385936162E+06,       0.101549151532732372E+06,       0.101488088183680564E+06,       0.101428826013168145E+06,
+        0.101371975824192647E+06,       0.101321130368394268E+06,       0.101278514950626632E+06,       0.101245823084732416E+06,       0.101229713571326531E+06,
+        0.101228252523962350E+06,       0.101236240082679593E+06,       0.101252202249213733E+06,       0.101274554004038626E+06,       0.101299571284751277E+06,
+        0.101328619250470016E+06,       0.101360846988672172E+06,       0.101395461438518367E+06,       0.101432766703864487E+06,       0.101473307204623023E+06,
+        0.101514010222445781E+06,       0.101553562190150420E+06,       0.101590717887284656E+06,       0.101621853851409600E+06,       0.101647543893485548E+06,
+        0.101671058814602424E+06,       0.101693056210828203E+06,       0.101714129349830531E+06,       0.101738767714405170E+06,       0.101767638107703999E+06,
+        0.101795424880191335E+06,       0.101821375190827370E+06,       0.101844797381800585E+06,       0.101865803928462847E+06,       0.101887241456978605E+06,
+        0.101903742329332832E+06,       0.101914505259923375E+06,       0.101918870822307275E+06,       0.101916337996088478E+06,       0.101901784739594950E+06,
+        0.101874548045828633E+06,       0.101841292001167923E+06,       0.101803678665118787E+06,       0.101762946401782145E+06,       0.101720412831625683E+06,
+        0.100515408142486602E+06,       0.100551771547175376E+06,       0.100591372710722571E+06,       0.100633738189236901E+06,       0.100678255595108407E+06,
+        0.100724173138854574E+06,       0.100770602351690526E+06,       0.100816524184232330E+06,       0.100854077383907817E+06,       0.100882309305546267E+06,
+        0.100908312612091744E+06,       0.100931760805658370E+06,       0.100951200960303162E+06,       0.100967005250871938E+06,       0.100979637398817140E+06,
+        0.100989094128378885E+06,       0.100995390483498064E+06,       0.100999335048962457E+06,       0.101003623776222332E+06,       0.101005037852830981E+06,
+        0.101003566011062838E+06,       0.100999260214490059E+06,       0.100992254677997669E+06,       0.100982785569327156E+06,       0.100971211282625562E+06,
+        0.100958033151982832E+06,       0.100947713227353204E+06,       0.100936845226361344E+06,       0.100925586455398079E+06,       0.100913386427886144E+06,
+        0.100900970885727584E+06,       0.100888200173575184E+06,       0.100874969576689109E+06,       0.100865322504112410E+06,       0.100857431942648880E+06,
+        0.100848190571948653E+06,       0.100837041611588123E+06,       0.100823522652975458E+06,       0.100807245058683751E+06,       0.100787869439158167E+06,
+        0.100757391684316404E+06,       0.100722719302699363E+06,       0.100685949398277124E+06,       0.100648508643416208E+06,       0.100611886678086536E+06,
+        0.100577601709138020E+06,       0.100546746024841152E+06,       0.100520863816718731E+06,       0.100501704292206879E+06,       0.100490795320886566E+06,
+        0.100489573337377500E+06,       0.100499397978964334E+06,       0.100534016438231076E+06,       0.100580634795179663E+06,       0.100636771821988543E+06,
+        0.100700900349775504E+06,       0.100771475161532377E+06,       0.100847971681032548E+06,       0.100928796704597553E+06,       0.101010401416626322E+06,
+        0.101090599925904797E+06,       0.101167170271662733E+06,       0.101233921628300508E+06,       0.101285179817018958E+06,       0.101329796645055787E+06,
+        0.101368459516926756E+06,       0.101402063972120028E+06,       0.101431554233350747E+06,       0.101457605089509292E+06,       0.101479887700559731E+06,
+        0.101498521383338972E+06,       0.101513550784224833E+06,       0.101523174827992611E+06,       0.101527475564510401E+06,       0.101528428909431837E+06,
+        0.101526914423630384E+06,       0.101523962459723334E+06,       0.101520309815973524E+06,       0.101516483972158181E+06,       0.101514002315449485E+06,
+        0.101514722417862809E+06,       0.101522283068780089E+06,       0.101544056083037300E+06,       0.101571190634249404E+06,       0.101603956939872005E+06,
+        0.101642017592925840E+06,       0.101688020789515867E+06,       0.101748771464749283E+06,       0.101810913304749745E+06,       0.101870419614457860E+06,
+        0.101923449267402393E+06,       0.101967012984100948E+06,       0.101994050943781331E+06,       0.102011245751808630E+06,       0.102022174558490107E+06,
+        0.102029125315834375E+06,       0.102033037791472336E+06,       0.102034394101747268E+06,       0.102032647951692605E+06,       0.102026060860393205E+06,
+        0.102014286206869132E+06,       0.101997287902874697E+06,       0.101973908129249903E+06,       0.101945685744995091E+06,       0.101913755487835835E+06,
+        0.101879518050633123E+06,       0.101845462413359521E+06,       0.101814438244852194E+06,       0.101787626131292665E+06,       0.101769079269016060E+06,
+        0.101760662506367516E+06,       0.101763690025728793E+06,       0.101778245812273221E+06,       0.101800769364128020E+06,       0.101825464810029356E+06,
+        0.101849318133198423E+06,       0.101866690516569448E+06,       0.101874423097137915E+06,       0.101868322033511577E+06,       0.101847631400323429E+06,
+        0.101809657617465651E+06,       0.101759023134988529E+06,       0.101701048933469734E+06,       0.101638831844116052E+06,       0.101574555754104877E+06,
+        0.101509980617449197E+06,       0.101449449533488441E+06,       0.101394594035173650E+06,       0.101347377713062888E+06,       0.101309681379202666E+06,
+        0.101289625678805663E+06,       0.101280310168622382E+06,       0.101280601256181355E+06,       0.101289183040688731E+06,       0.101304405647058535E+06,
+        0.101324688438220604E+06,       0.101349563357044477E+06,       0.101377976699525767E+06,       0.101409028339016470E+06,       0.101442179995567261E+06,
+        0.101476777887449236E+06,       0.101511738303380160E+06,       0.101546126683052818E+06,       0.101579196765551533E+06,       0.101607991498285395E+06,
+        0.101632611269017507E+06,       0.101655502605639515E+06,       0.101677080810846644E+06,       0.101697768628730599E+06,       0.101719316740837268E+06,
+        0.101742656846947124E+06,       0.101764837611636452E+06,       0.101785178883928776E+06,       0.101802942432164040E+06,       0.101817351144786313E+06,
+        0.101829733328404807E+06,       0.101837655847121932E+06,       0.101840093420000965E+06,       0.101836302876360205E+06,       0.101825658934804160E+06,
+        0.101806477102295394E+06,       0.101772591154458947E+06,       0.101732979877375386E+06,       0.101689114392674877E+06,       0.101642472350711148E+06,
+        0.101594527408217124E+06,       0.100521483098622790E+06,       0.100553034374379175E+06,       0.100587237837357708E+06,       0.100623674982973011E+06,
+        0.100661797732431733E+06,       0.100700926585977664E+06,       0.100740251364819997E+06,       0.100769102422238415E+06,       0.100792034055430398E+06,
+        0.100813412935669796E+06,       0.100833061354508041E+06,       0.100850766087262135E+06,       0.100866291971468818E+06,       0.100879397215573350E+06,
+        0.100889850447447578E+06,       0.100896874983048474E+06,       0.100901879624732552E+06,       0.100908045012513743E+06,       0.100911845008177756E+06,
+        0.100913263133695262E+06,       0.100912309117336132E+06,       0.100909033352763217E+06,       0.100903541829518552E+06,       0.100896011438153932E+06,
+        0.100886705535507586E+06,       0.100878478741165993E+06,       0.100870518698868997E+06,       0.100862258577488697E+06,       0.100853850267061993E+06,
+        0.100845456536039332E+06,       0.100837262111476593E+06,       0.100829483975533818E+06,       0.100823560640713331E+06,       0.100821677296257287E+06,
+        0.100817550375560750E+06,       0.100812145039498006E+06,       0.100804659355862575E+06,       0.100794378660273913E+06,       0.100780665915676014E+06,
+        0.100760028631593887E+06,       0.100729776405452620E+06,       0.100695664007384359E+06,       0.100658676701707998E+06,       0.100619966898071216E+06,
+        0.100580820672301052E+06,       0.100542567168908456E+06,       0.100504377972890885E+06,       0.100469914337100665E+06,       0.100440979221872039E+06,
+        0.100419342752137061E+06,       0.100406745142411062E+06,       0.100406705150974245E+06,       0.100432011566503701E+06,       0.100468676779983842E+06,
+        0.100515495509657252E+06,       0.100571181275147042E+06,       0.100634390994595859E+06,       0.100706784795550964E+06,       0.100786680087649889E+06,
+        0.100869494529497810E+06,       0.100952905038971541E+06,       0.101034572199124057E+06,       0.101109749894571214E+06,       0.101172314783061069E+06,
+        0.101229755518492922E+06,       0.101282350507230105E+06,       0.101330323821815167E+06,       0.101373763209774886E+06,       0.101412160049147336E+06,
+        0.101445520624250392E+06,       0.101474055469030995E+06,       0.101497872459806793E+06,       0.101516095634979050E+06,       0.101525003393313920E+06,
+        0.101529087732478598E+06,       0.101529555701643461E+06,       0.101527554535439689E+06,       0.101523924716972469E+06,       0.101519184588702949E+06,
+        0.101515359052858228E+06,       0.101513419431477203E+06,       0.101515061119696038E+06,       0.101524365504439338E+06,       0.101545492952323460E+06,
+        0.101572260216870665E+06,       0.101604062662735640E+06,       0.101640454999672467E+06,       0.101681140705924787E+06,       0.101736471342456469E+06,
+        0.101791820815604107E+06,       0.101843025813835338E+06,       0.101888338055426750E+06,       0.101926497388645425E+06,       0.101956523951729410E+06,
+        0.101977389503551763E+06,       0.101992863624521677E+06,       0.102004636055621828E+06,       0.102012873990628723E+06,       0.102016923944167502E+06,
+        0.102015589894533594E+06,       0.102008242524494635E+06,       0.101994805733422399E+06,       0.101975527326879805E+06,       0.101951699623577006E+06,
+        0.101924648595227743E+06,       0.101896134378200717E+06,       0.101868181223228035E+06,       0.101842690796364026E+06,       0.101823518800336897E+06,
+        0.101810966006917995E+06,       0.101810361562174381E+06,       0.101819625326231835E+06,       0.101837655873780983E+06,       0.101862056783833701E+06,
+        0.101890848697784473E+06,       0.101919025148523811E+06,       0.101942604878219718E+06,       0.101953732079914320E+06,       0.101952348959737385E+06,
+        0.101930393928014251E+06,       0.101894531594142769E+06,       0.101847206824460780E+06,       0.101792255748977870E+06,       0.101731720782488774E+06,
+        0.101667410578914118E+06,       0.101601955467176056E+06,       0.101538353512944566E+06,       0.101479206063803722E+06,       0.101426875382686587E+06,
+        0.101386679687780139E+06,       0.101358881267937715E+06,       0.101340978693972764E+06,       0.101332100373616413E+06,       0.101331377677835859E+06,
+        0.101337757250038121E+06,       0.101350176595795769E+06,       0.101367529237839539E+06,       0.101388710034061514E+06,       0.101412656335492444E+06,
+        0.101438146564572395E+06,       0.101465030990242507E+06,       0.101492743759273944E+06,       0.101520528048576030E+06,       0.101547656089289187E+06,
+        0.101573646733203917E+06,       0.101598176409242311E+06,       0.101621015547307805E+06,       0.101642090999262466E+06,       0.101661344187207244E+06,
+        0.101680048117579805E+06,       0.101700060142799775E+06,       0.101717676267340707E+06,       0.101732293239297534E+06,       0.101743299867593101E+06,
+        0.101750084174098316E+06,       0.101754164408332057E+06,       0.101753815772929738E+06,       0.101747787368181351E+06,       0.101735699407228763E+06,
+        0.101717273900884597E+06,       0.101692348035134710E+06,       0.101654861811602153E+06,       0.101610673295375120E+06,       0.101562751614357956E+06,
+        0.101512638519625150E+06,       0.101461813597627668E+06,       0.100533318325900138E+06,       0.100559018706234609E+06,       0.100586667516233734E+06,
+        0.100616430509356855E+06,       0.100647457772304173E+06,       0.100679140607943787E+06,       0.100698527261697847E+06,       0.100715798167830915E+06,
+        0.100731931694921790E+06,       0.100746896633405166E+06,       0.100760616569955790E+06,       0.100772979417731243E+06,       0.100783848302944942E+06,
+        0.100793073809534399E+06,       0.100800507571478287E+06,       0.100806483772806212E+06,       0.100813801762586605E+06,       0.100819127022868051E+06,
+        0.100822124828140237E+06,       0.100822902466370797E+06,       0.100821716855826366E+06,       0.100818621189554789E+06,       0.100813702346186765E+06,
+        0.100807092657524059E+06,       0.100799795563032545E+06,       0.100792638500522866E+06,       0.100785284309503724E+06,       0.100777874398839282E+06,
+        0.100770527259340961E+06,       0.100763347669699418E+06,       0.100756435329570639E+06,       0.100749892793592095E+06,       0.100749373875165576E+06,
+        0.100750222933888348E+06,       0.100750603463785985E+06,       0.100749864242144642E+06,       0.100747320689053289E+06,       0.100742256076426071E+06,
+        0.100733920852957395E+06,       0.100715113795294979E+06,       0.100689064952966379E+06,       0.100657845711542803E+06,       0.100623250918292935E+06,
+        0.100586038000497676E+06,       0.100547134348203457E+06,       0.100506028825088957E+06,       0.100462291432826620E+06,       0.100421048783818245E+06,
+        0.100384122683633468E+06,       0.100353368412380165E+06,       0.100330670880394246E+06,       0.100321776442990944E+06,       0.100334624094787185E+06,
+        0.100358437666044687E+06,       0.100392488442372807E+06,       0.100435977221972600E+06,       0.100488073955800399E+06,       0.100552415559277870E+06,
+        0.100627255810881121E+06,       0.100707092289738357E+06,       0.100789756856378794E+06,       0.100873101113792349E+06,       0.100954216801293107E+06,
+        0.101025863759345229E+06,       0.101094584610272868E+06,       0.101160235498342692E+06,       0.101222606811297053E+06,       0.101281370962640489E+06,
+        0.101332163642811851E+06,       0.101376972618262807E+06,       0.101416728366496085E+06,       0.101451473910749541E+06,       0.101480959555488313E+06,
+        0.101500381551832834E+06,       0.101512210195641775E+06,       0.101519514244373393E+06,       0.101523444803633465E+06,       0.101525155563451161E+06,
+        0.101524617344664759E+06,       0.101522395272590235E+06,       0.101521151212846860E+06,       0.101522340865174643E+06,       0.101527072168721963E+06,
+        0.101537882062393008E+06,       0.101559080181885220E+06,       0.101584526114373686E+06,       0.101614244538571933E+06,       0.101647894372795839E+06,
+        0.101684681982032082E+06,       0.101726895995367770E+06,       0.101774312937747018E+06,       0.101818830342195433E+06,       0.101858335228138851E+06,
+        0.101893176738273338E+06,       0.101922949034176403E+06,       0.101947508183230893E+06,       0.101967684274917294E+06,       0.101983202615811271E+06,
+        0.101993442131563672E+06,       0.101998812147038072E+06,       0.101998613039324773E+06,       0.101992329378160532E+06,       0.101980249760691964E+06,
+        0.101962626054339082E+06,       0.101940465078019130E+06,       0.101915907622174098E+06,       0.101890478407916715E+06,       0.101866977689826570E+06,
+        0.101849754719304707E+06,       0.101837665745559920E+06,       0.101833602586389810E+06,       0.101841599729967784E+06,       0.101859775477370218E+06,
+        0.101886984424902446E+06,       0.101919867690970117E+06,       0.101951746477934430E+06,       0.101978482983373731E+06,       0.101993393892969194E+06,
+        0.101991412250034802E+06,       0.101974123414601141E+06,       0.101945239434022718E+06,       0.101905684392780662E+06,       0.101856949799144815E+06,
+        0.101801731134592686E+06,       0.101742504741481811E+06,       0.101681038790539489E+06,       0.101619356067038418E+06,       0.101559380452289755E+06,
+        0.101505641285490463E+06,       0.101461701752299428E+06,       0.101426005705293821E+06,       0.101398896334048623E+06,       0.101380282180095601E+06,
+        0.101369836995025384E+06,       0.101367277170112575E+06,       0.101370986941406809E+06,       0.101379906423074499E+06,       0.101392831033495459E+06,
+        0.101408554312665205E+06,       0.101424869582900283E+06,       0.101443182567207696E+06,       0.101462968409184250E+06,       0.101483671134433898E+06,
+        0.101504732894123474E+06,       0.101527421913474638E+06,       0.101550095820920280E+06,       0.101571562110317216E+06,       0.101591355780169426E+06,
+        0.101609078015251362E+06,       0.101625097194956237E+06,       0.101640337310256451E+06,       0.101652605117688974E+06,       0.101661397415208048E+06,
+        0.101666225004107662E+06,       0.101666619975683658E+06,       0.101662556408727090E+06,       0.101653580628123964E+06,       0.101639218203126409E+06,
+        0.101619381357809092E+06,       0.101594063768788052E+06,       0.101563351510846944E+06,       0.101523851133020638E+06,       0.101476807405962056E+06,
+        0.101426978369828445E+06,       0.101375797428347505E+06,       0.101324598573980998E+06,       0.100551530203326562E+06,       0.100571727120900570E+06,
+        0.100593051779557791E+06,       0.100614868997312486E+06,       0.100634144763448072E+06,       0.100645833089619511E+06,       0.100657235284227281E+06,
+        0.100667686387769805E+06,       0.100677292913672762E+06,       0.100686112073701530E+06,       0.100694158258119947E+06,       0.100701410586929007E+06,
+        0.100707821531117806E+06,       0.100713326592793543E+06,       0.100718292448464927E+06,       0.100725135313074701E+06,       0.100730736036059810E+06,
+        0.100734776949494801E+06,       0.100736983079004160E+06,       0.100737142689159882E+06,       0.100735125062421313E+06,       0.100730895453973062E+06,
+        0.100724936089312163E+06,       0.100718101716589372E+06,       0.100710128659467940E+06,       0.100701978143640532E+06,       0.100693854728853868E+06,
+        0.100685917546278361E+06,       0.100678288281938949E+06,       0.100671058793584918E+06,       0.100664298277410649E+06,       0.100660712381595760E+06,
+        0.100661723426356752E+06,       0.100663150264819735E+06,       0.100664393149270531E+06,       0.100664799968549007E+06,       0.100663672287188572E+06,
+        0.100660269896986065E+06,       0.100653054372944243E+06,       0.100638919308817800E+06,       0.100620188598009743E+06,       0.100597036492593310E+06,
+        0.100569788712949841E+06,       0.100538901380231502E+06,       0.100504939031211514E+06,       0.100464616545740675E+06,       0.100420082357890147E+06,
+        0.100376069547844643E+06,       0.100334560389268605E+06,       0.100297550195584583E+06,       0.100267038173233668E+06,       0.100249183652606138E+06,
+        0.100248031291493899E+06,       0.100256756900526307E+06,       0.100275250996069168E+06,       0.100303318888992886E+06,       0.100340733860613560E+06,
+        0.100392668457859341E+06,       0.100458197469974984E+06,       0.100530344725997711E+06,       0.100607247564767138E+06,       0.100687079608666914E+06,
+        0.100768076831136714E+06,       0.100845286817167653E+06,       0.100921915425536106E+06,       0.100997896081585553E+06,       0.101072548063258917E+06,
+        0.101144965887108527E+06,       0.101210711249507964E+06,       0.101267759563819229E+06,       0.101319932991058231E+06,       0.101367121820533270E+06,
+        0.101409115377035181E+06,       0.101445063624758288E+06,       0.101467868269852072E+06,       0.101485221941439115E+06,       0.101498187544558168E+06,
+        0.101507881316604296E+06,       0.101515310949875333E+06,       0.101519599975213365E+06,       0.101522106701145909E+06,       0.101524851878856789E+06,
+        0.101529230085351330E+06,       0.101536191323789782E+06,       0.101546697524065807E+06,       0.101566224388216360E+06,       0.101589918902257763E+06,
+        0.101616845515287452E+06,       0.101647215589828833E+06,       0.101680341115790361E+06,       0.101715366089036543E+06,       0.101752316168779886E+06,
+        0.101791176678952732E+06,       0.101827052748008107E+06,       0.101859044996505589E+06,       0.101887670526199319E+06,       0.101913122414070647E+06,
+        0.101934463666524054E+06,       0.101952632860506710E+06,       0.101966700037415663E+06,       0.101975525710702976E+06,       0.101978461989723088E+06,
+        0.101975173899271627E+06,       0.101964823473388897E+06,       0.101947665044748559E+06,       0.101926227690128857E+06,       0.101900561072349257E+06,
+        0.101874251008341424E+06,       0.101851830347918643E+06,       0.101836189738381829E+06,       0.101828888260193082E+06,       0.101835000054969831E+06,
+        0.101851733006117443E+06,       0.101877232568018531E+06,       0.101909510086827300E+06,       0.101940989073697696E+06,       0.101965528537313672E+06,
+        0.101979608526400712E+06,       0.101982970036656799E+06,       0.101975240583827399E+06,       0.101955388827734365E+06,       0.101924654892196661E+06,
+        0.101887578699447098E+06,       0.101842186561714494E+06,       0.101789317463778367E+06,       0.101732832688802417E+06,       0.101675288481823532E+06,
+        0.101619263688587671E+06,       0.101568048094496247E+06,       0.101521062700628769E+06,       0.101479654154784279E+06,       0.101445221739311222E+06,
+        0.101418076416901371E+06,       0.101399045923829544E+06,       0.101387018859001342E+06,       0.101381135963448469E+06,       0.101380650007871780E+06,
+        0.101384722424981679E+06,       0.101391720295262028E+06,       0.101400396876228624E+06,       0.101411346068523795E+06,       0.101424155121034681E+06,
+        0.101438457710905030E+06,       0.101453929199892154E+06,       0.101472913422971527E+06,       0.101492074099173711E+06,       0.101510560767898467E+06,
+        0.101527744434993336E+06,       0.101543054611759319E+06,       0.101555675557276962E+06,       0.101564929191696821E+06,       0.101571016898623420E+06,
+        0.101573544015567939E+06,       0.101572121672385867E+06,       0.101566370463087485E+06,       0.101554662308102721E+06,       0.101536629786898047E+06,
+        0.101513803810128695E+06,       0.101486361735486105E+06,       0.101454563654390658E+06,       0.101418767627698660E+06,       0.101378013088347099E+06,
+        0.101330707820646552E+06,       0.101282264555356756E+06,       0.101234028760920090E+06,       0.101187294700704195E+06,       0.100576965529563255E+06,
+        0.100591678218711211E+06,       0.100607008383076420E+06,       0.100616323103987481E+06,       0.100620258552074985E+06,       0.100623651287353903E+06,
+        0.100626463751429124E+06,       0.100628648078344573E+06,       0.100631378331016531E+06,       0.100634129163284262E+06,       0.100636562070289394E+06,
+        0.100638738873227092E+06,       0.100640693964837556E+06,       0.100643049230926015E+06,       0.100648185229669587E+06,       0.100652678597624064E+06,
+        0.100656261255894686E+06,       0.100658660860211399E+06,       0.100659622834889029E+06,       0.100658930196984991E+06,       0.100656421096238220E+06,
+        0.100652004015325234E+06,       0.100645400203396595E+06,       0.100634943591599571E+06,       0.100623790772243461E+06,       0.100612166299320219E+06,
+        0.100600323220825783E+06,       0.100589367539107639E+06,       0.100580442279124138E+06,       0.100572243324848969E+06,       0.100564857703730217E+06,
+        0.100563322531964557E+06,       0.100563065402201857E+06,       0.100563607762748041E+06,       0.100564433779967017E+06,       0.100564965723689515E+06,
+        0.100564572517680892E+06,       0.100562577288210698E+06,       0.100558128795487573E+06,       0.100550306656448985E+06,       0.100538784205606309E+06,
+        0.100523395229331582E+06,       0.100504107960399502E+06,       0.100481009310527326E+06,       0.100454286649172413E+06,       0.100417998848613410E+06,
+        0.100377654481256992E+06,       0.100336323265197076E+06,       0.100295695643989733E+06,       0.100257502669341542E+06,       0.100223497751048752E+06,
+        0.100198365893325012E+06,       0.100183895883056030E+06,       0.100176748173119719E+06,       0.100177409781642637E+06,       0.100186348863375271E+06,
+        0.100204071706916817E+06,       0.100236974921233719E+06,       0.100288202283773542E+06,       0.100347584962604393E+06,       0.100413567810885099E+06,
+        0.100484685800612540E+06,       0.100559609376774941E+06,       0.100637786676389092E+06,       0.100719143709254829E+06,       0.100802573207076450E+06,
+        0.100886953694736978E+06,       0.100970981281993736E+06,       0.101053137277853224E+06,       0.101122114850514685E+06,       0.101186021991939982E+06,
+        0.101244880734986247E+06,       0.101298842483030225E+06,       0.101347976726965513E+06,       0.101388865316328054E+06,       0.101417494561782441E+06,
+        0.101441011237599363E+06,       0.101460308434203442E+06,       0.101476142058636950E+06,       0.101489111828680267E+06,       0.101498177707129027E+06,
+        0.101504275218907074E+06,       0.101509888353816961E+06,       0.101516205429889771E+06,       0.101524373025953057E+06,       0.101535544403108914E+06,
+        0.101550771587497264E+06,       0.101572228401773711E+06,       0.101596922610232752E+06,       0.101624267341491490E+06,       0.101653892197854148E+06,
+        0.101685371964174541E+06,       0.101717744368668005E+06,       0.101749825128001146E+06,       0.101781782699506482E+06,       0.101812709382600748E+06,
+        0.101841353313321029E+06,       0.101867900490832937E+06,       0.101893188014203624E+06,       0.101915193984979924E+06,       0.101933169418903170E+06,
+        0.101945970442238802E+06,       0.101952233644425200E+06,       0.101949989638197949E+06,       0.101938812116678397E+06,       0.101921309771955755E+06,
+        0.101897306204910492E+06,       0.101870511994013577E+06,       0.101845727987357284E+06,       0.101827162893394896E+06,       0.101815741469126820E+06,
+        0.101815347936997394E+06,       0.101829035456973521E+06,       0.101849227052658054E+06,       0.101873947210599901E+06,       0.101900166979187969E+06,
+        0.101922501433547208E+06,       0.101938537730062933E+06,       0.101945622505927895E+06,       0.101943220759731354E+06,       0.101933233593028053E+06,
+        0.101913480508279812E+06,       0.101884226864883196E+06,       0.101847880125950556E+06,       0.101805028700279145E+06,       0.101757073613196655E+06,
+        0.101706590973509752E+06,       0.101656335498895467E+06,       0.101607292592687139E+06,       0.101560626743744360E+06,       0.101517500638364392E+06,
+        0.101478925847553910E+06,       0.101446343700160927E+06,       0.101419879250754559E+06,       0.101398958955256283E+06,       0.101383710029623602E+06,
+        0.101374588904196891E+06,       0.101370168865842439E+06,       0.101369105684779628E+06,       0.101370929669406774E+06,       0.101375271898136503E+06,
+        0.101381760968333765E+06,       0.101390061699633865E+06,       0.101400585700279218E+06,       0.101414338736935577E+06,       0.101428328122293344E+06,
+        0.101441772517097343E+06,       0.101453941211612226E+06,       0.101464150240094372E+06,       0.101470694861331591E+06,       0.101472993001670693E+06,
+        0.101472098749250043E+06,       0.101467692245319617E+06,       0.101459459863983502E+06,       0.101447099986294808E+06,       0.101428337148487699E+06,
+        0.101402273058774066E+06,       0.101372210423711062E+06,       0.101338601145403256E+06,       0.101301942982120236E+06,       0.101262793506100817E+06,
+        0.101221677786233748E+06,       0.101176731503889008E+06,       0.101131973913656722E+06,       0.101088479543089110E+06,       0.101047269615024925E+06,
+        0.100610222449967056E+06,       0.100619368346169198E+06,       0.100619051340248508E+06,       0.100617580194349401E+06,       0.100615500249746110E+06,
+        0.100612844510783863E+06,       0.100609637715591729E+06,       0.100605899629696811E+06,       0.100601648181252385E+06,       0.100596902436962919E+06,
+        0.100591685422206356E+06,       0.100587098052459361E+06,       0.100585436102778738E+06,       0.100587603438895458E+06,       0.100589520780671664E+06,
+        0.100591027689952418E+06,       0.100591916118502122E+06,       0.100591952568608729E+06,       0.100590898493088505E+06,       0.100588528847269830E+06,
+        0.100584648718839380E+06,       0.100579107975368854E+06,       0.100568181408087505E+06,       0.100556028233350124E+06,       0.100543329111321902E+06,
+        0.100530292741429832E+06,       0.100517138305172819E+06,       0.100504104046550317E+06,       0.100491454262540399E+06,       0.100479484740824249E+06,
+        0.100470155044772182E+06,       0.100463687256117119E+06,       0.100458896797118272E+06,       0.100455620879032227E+06,       0.100454260984570079E+06,
+        0.100454114005490293E+06,       0.100453954401208190E+06,       0.100453246548017763E+06,       0.100453544534649671E+06,       0.100451784335522374E+06,
+        0.100447402272511725E+06,       0.100439945313556469E+06,       0.100429058870933281E+06,       0.100414474145118424E+06,       0.100395971880822995E+06,
+        0.100364627363950829E+06,       0.100330069619100730E+06,       0.100293517928604648E+06,       0.100256250274621154E+06,       0.100219578502905337E+06,
+        0.100184821369736295E+06,       0.100153602788173128E+06,       0.100126759271301082E+06,       0.100104736505522000E+06,       0.100088530813236051E+06,
+        0.100079174170628597E+06,       0.100077782208942881E+06,       0.100089384583247156E+06,       0.100124675759422840E+06,       0.100169171328412835E+06,
+        0.100221720050477204E+06,       0.100281293603445694E+06,       0.100347032197583365E+06,       0.100419381954596480E+06,       0.100501100689285435E+06,
+        0.100587123759395632E+06,       0.100676265830202465E+06,       0.100767041531711700E+06,       0.100857717751965523E+06,       0.100942425402787208E+06,
+        0.101015252626361835E+06,       0.101084506455799405E+06,       0.101149930187516162E+06,       0.101211031351648766E+06,       0.101267093811678642E+06,
+        0.101313485842090842E+06,       0.101347864445685816E+06,       0.101377348186801406E+06,       0.101401563075397265E+06,       0.101421152746379506E+06,
+        0.101436703379514453E+06,       0.101448418323353719E+06,       0.101455739244278491E+06,       0.101461288984514365E+06,       0.101466634842994637E+06,
+        0.101474204912937290E+06,       0.101485236375258624E+06,       0.101500599693197641E+06,       0.101519974341673922E+06,       0.101542425947491516E+06,
+        0.101567705013514729E+06,       0.101595287754062447E+06,       0.101623559085342917E+06,       0.101653300863473152E+06,       0.101684268370484802E+06,
+        0.101715396578327011E+06,       0.101746648790418796E+06,       0.101778157009654227E+06,       0.101810294427225992E+06,       0.101840186138904261E+06,
+        0.101866664724512098E+06,       0.101888829801923304E+06,       0.101904365840783910E+06,       0.101910875981687976E+06,       0.101907623411986046E+06,
+        0.101897747215346535E+06,       0.101880196785050444E+06,       0.101858268156208374E+06,       0.101836776997478300E+06,       0.101819952813389187E+06,
+        0.101808320250000223E+06,       0.101803197426602317E+06,       0.101808609816872282E+06,       0.101820932164050100E+06,       0.101835981686293468E+06,
+        0.101853975694054869E+06,       0.101871402202830723E+06,       0.101884750589340591E+06,       0.101893763845945417E+06,       0.101896316342375110E+06,
+        0.101891679490974697E+06,       0.101879011465031377E+06,       0.101858040507289596E+06,       0.101829415896828315E+06,       0.101794099063775866E+06,
+        0.101754870334758903E+06,       0.101712830221134776E+06,       0.101668524343052632E+06,       0.101623305627111258E+06,       0.101578731565899987E+06,
+        0.101536822594720084E+06,       0.101498255706646247E+06,       0.101464056159653454E+06,       0.101434228357694403E+06,       0.101408947230003760E+06,
+        0.101388258426133107E+06,       0.101372054750796451E+06,       0.101360489212098575E+06,       0.101352621134682369E+06,       0.101347535522944934E+06,
+        0.101344862604306050E+06,       0.101344225484927229E+06,       0.101345820651379589E+06,       0.101351700849621455E+06,       0.101359530806993411E+06,
+        0.101367464680662029E+06,       0.101374791985950258E+06,       0.101380818284913359E+06,       0.101384869714943547E+06,       0.101384236152984289E+06,
+        0.101379411934677875E+06,       0.101371434785651902E+06,       0.101360085004396402E+06,       0.101345137105284986E+06,       0.101326366500254488E+06,
+        0.101300808610161446E+06,       0.101267227431123814E+06,       0.101230448890002648E+06,       0.101191134568648122E+06,       0.101149957676138991E+06,
+        0.101107616865909265E+06,       0.101064847159165423E+06,       0.101022580301005539E+06,       0.100981724783641272E+06,       0.100943032631428388E+06,
+        0.100907229742725089E+06,       0.100647986354424997E+06,       0.100642715659511494E+06,       0.100636609969385099E+06,       0.100629766959429631E+06,
+        0.100622273153360293E+06,       0.100614207409999959E+06,       0.100605644320867577E+06,       0.100596657511128040E+06,       0.100587322839384142E+06,
+        0.100577721494929676E+06,       0.100567942994422949E+06,       0.100559032457675799E+06,       0.100552977775159990E+06,       0.100548029023239913E+06,
+        0.100543925649759869E+06,       0.100540775676255420E+06,       0.100537926202230563E+06,       0.100534526225857189E+06,       0.100530349204130558E+06,
+        0.100525160024924175E+06,       0.100518730289664294E+06,       0.100507262057308282E+06,       0.100493351445575739E+06,       0.100478812420309798E+06,
+        0.100463863563753723E+06,       0.100448706735957079E+06,       0.100433537133342616E+06,       0.100418551953121700E+06,       0.100403957667064577E+06,
+        0.100390113818734360E+06,       0.100378283224859435E+06,       0.100368019408275955E+06,       0.100359348113145898E+06,       0.100352231413445901E+06,
+        0.100346572462762793E+06,       0.100342221388570266E+06,       0.100338982151060118E+06,       0.100338392782828159E+06,       0.100341188152017450E+06,
+        0.100343374795880460E+06,       0.100344284175602748E+06,       0.100343279804720136E+06,       0.100339754195549598E+06,       0.100333123950383713E+06,
+        0.100321286971674039E+06,       0.100297287465905509E+06,       0.100269835508128133E+06,       0.100239714419667638E+06,       0.100207741409672206E+06,
+        0.100174751447097195E+06,       0.100141579771693956E+06,       0.100106755441371904E+06,       0.100069912900784475E+06,       0.100035704844720982E+06,
+        0.100005528642180579E+06,       0.999808555037528422E+05,       0.999632723451110069E+05,       0.999545236439836153E+05,       0.999736658577992639E+05,
+        0.100003353333015431E+06,       0.100042064117430200E+06,       0.100089071041598727E+06,       0.100143778848621456E+06,       0.100205754250853075E+06,
+        0.100280664932831889E+06,       0.100364704219084786E+06,       0.100454126970714191E+06,       0.100547163719590288E+06,       0.100641885410501171E+06,
+        0.100736224731986324E+06,       0.100821668363604142E+06,       0.100899090295081827E+06,       0.100973330050358534E+06,       0.101044570047650093E+06,
+        0.101111101684352281E+06,       0.101171922832138123E+06,       0.101223284014747289E+06,       0.101260000146915598E+06,       0.101290169362142216E+06,
+        0.101314373328620830E+06,       0.101333177003506280E+06,       0.101345070024148474E+06,       0.101353392220116293E+06,       0.101359052838648713E+06,
+        0.101363820978951000E+06,       0.101369812488926094E+06,       0.101377607762478350E+06,       0.101388432240829963E+06,       0.101403721097234418E+06,
+        0.101423686495689355E+06,       0.101447911692908267E+06,       0.101474956233570803E+06,       0.101501708578459278E+06,       0.101530416403443902E+06,
+        0.101560731988182699E+06,       0.101592331907465996E+06,       0.101625384375889567E+06,       0.101660463766652349E+06,       0.101696287937694025E+06,
+        0.101731505165402195E+06,       0.101765373671168942E+06,       0.101795889760683582E+06,       0.101821575901139222E+06,       0.101839426770240534E+06,
+        0.101848304582011391E+06,       0.101850674932157766E+06,       0.101845563338820590E+06,       0.101833662450669886E+06,       0.101819729736987734E+06,
+        0.101806525676924168E+06,       0.101796235624030873E+06,       0.101788878921415002E+06,       0.101786474628160606E+06,       0.101791411418041462E+06,
+        0.101799155363379643E+06,       0.101808395203049906E+06,       0.101819645577764153E+06,       0.101830409662230682E+06,       0.101837554446248556E+06,
+        0.101839744105951162E+06,       0.101836170755967585E+06,       0.101826399135349377E+06,       0.101810169058729633E+06,       0.101787697095879019E+06,
+        0.101760376393189144E+06,       0.101728853043894385E+06,       0.101693851935638726E+06,       0.101656211520082943E+06,       0.101616790158213262E+06,
+        0.101576704560053928E+06,       0.101537500986694940E+06,       0.101500335696260430E+06,       0.101465878362827381E+06,       0.101434840756723977E+06,
+        0.101408292472182264E+06,       0.101385653681886775E+06,       0.101367773762272278E+06,       0.101355060936308873E+06,       0.101344865614149967E+06,
+        0.101336866601978196E+06,       0.101330803221953858E+06,       0.101326445157375012E+06,       0.101323705025865274E+06,       0.101323151766299212E+06,
+        0.101323317919074820E+06,       0.101323609309034800E+06,       0.101323383998279736E+06,       0.101321968519799790E+06,       0.101318674829698095E+06,
+        0.101309557473271183E+06,       0.101297255318789845E+06,       0.101282004506700381E+06,       0.101263593826286131E+06,       0.101241822534985287E+06,
+        0.101216505434514431E+06,       0.101183763113335532E+06,       0.101143062284304673E+06,       0.101099958082106066E+06,       0.101055260378077917E+06,
+        0.101009770107324861E+06,       0.100964289722992879E+06,       0.100919631222605836E+06,       0.100878395229792455E+06,       0.100840230418695966E+06,
+        0.100804814065610379E+06,       0.100772660269162792E+06,       0.100687581879727732E+06,       0.100677327145079587E+06,       0.100666160693170401E+06,
+        0.100654207341057889E+06,       0.100641583937123549E+06,       0.100628402623918475E+06,       0.100614774045043421E+06,       0.100600810488184259E+06,
+        0.100586628958508634E+06,       0.100572354178803900E+06,       0.100558377265734845E+06,       0.100545518784321612E+06,       0.100533722529582723E+06,
+        0.100522910171807918E+06,       0.100512931196078469E+06,       0.100503576020145658E+06,       0.100494590303307457E+06,       0.100485690264560879E+06,
+        0.100476578798775605E+06,       0.100466962148914608E+06,       0.100453831814755409E+06,       0.100437250927331042E+06,       0.100419883924672962E+06,
+        0.100402010894887906E+06,       0.100383869790613491E+06,       0.100365667294769126E+06,       0.100347588515499185E+06,       0.100329805497802925E+06,
+        0.100312484547517117E+06,       0.100295677938969020E+06,       0.100279971482571520E+06,       0.100265646792895117E+06,       0.100252835911466231E+06,
+        0.100241624480511469E+06,       0.100232054881627162E+06,       0.100224130808306480E+06,       0.100217823206996967E+06,       0.100218259667894425E+06,
+        0.100221888558547784E+06,       0.100225662634090608E+06,       0.100228894178654795E+06,       0.100230909476646018E+06,       0.100231046622607246E+06,
+        0.100228652435841679E+06,       0.100220736457496634E+06,       0.100203006988572233E+06,       0.100182026084597936E+06,       0.100158298000477531E+06,
+        0.100132350369893451E+06,       0.100104715520267695E+06,       0.100075909358704739E+06,       0.100043124770855982E+06,       0.100002028989072438E+06,
+        0.999616642547620577E+05,       0.999236877809293510E+05,       0.998898266920593742E+05,       0.998618945050216280E+05,       0.998418030619178171E+05,
+        0.998423833568641858E+05,       0.998594396345241257E+05,       0.998857662121956964E+05,       0.999209046169008070E+05,       0.999644862724064005E+05,
+        0.100016242187354641E+06,       0.100077317810256820E+06,       0.100156061627195784E+06,       0.100241897409154641E+06,       0.100332874470688155E+06,
+        0.100428637026128985E+06,       0.100526117084385623E+06,       0.100622332108951261E+06,       0.100709061724389190E+06,       0.100788527255290071E+06,
+        0.100863969991383987E+06,       0.100934619610214693E+06,       0.100999507530848088E+06,       0.101057589879684849E+06,       0.101107912118639942E+06,
+        0.101140898046464674E+06,       0.101165194334426677E+06,       0.101183324487668549E+06,       0.101196455912974372E+06,       0.101205787756098696E+06,
+        0.101212555660780359E+06,       0.101217307428240179E+06,       0.101221221076374510E+06,       0.101226815969850082E+06,       0.101235775469520071E+06,
+        0.101249089517923203E+06,       0.101267499119154090E+06,       0.101290114155802439E+06,       0.101316108973235343E+06,       0.101344864351232871E+06,
+        0.101376027068939133E+06,       0.101409318557868275E+06,       0.101444185441017980E+06,       0.101479505555003896E+06,       0.101516882009007721E+06,
+        0.101555258888103534E+06,       0.101593997928136538E+06,       0.101632899844262269E+06,       0.101670115604274892E+06,       0.101703897209036979E+06,
+        0.101731821696663668E+06,       0.101752696747597220E+06,       0.101767805557897402E+06,       0.101776451771069726E+06,       0.101776669469582252E+06,
+        0.101773409436917937E+06,       0.101768516316242836E+06,       0.101762622025664066E+06,       0.101757375988241824E+06,       0.101753826825127559E+06,
+        0.101753403149395934E+06,       0.101756975828023817E+06,       0.101760728893977721E+06,       0.101764213695991348E+06,       0.101767251659026326E+06,
+        0.101770663081707637E+06,       0.101770424123169345E+06,       0.101766072271416459E+06,       0.101755995409002455E+06,       0.101740345666592038E+06,
+        0.101721298174118318E+06,       0.101699043646416510E+06,       0.101673714396835901E+06,       0.101645709970302123E+06,       0.101615709217670097E+06,
+        0.101584438818864903E+06,       0.101549071157331651E+06,       0.101514367930820241E+06,       0.101481015481659371E+06,       0.101449616141240651E+06,
+        0.101420749509000205E+06,       0.101394921878986992E+06,       0.101373676775729036E+06,       0.101359486676981818E+06,       0.101347304837422518E+06,
+        0.101336841360518913E+06,       0.101328023341265842E+06,       0.101320386045212057E+06,       0.101313764510643596E+06,       0.101308434768293082E+06,
+        0.101303621069785135E+06,       0.101298777855350723E+06,       0.101293531204510582E+06,       0.101287470834921696E+06,       0.101280152845400124E+06,
+        0.101270201669037211E+06,       0.101254701725787949E+06,       0.101236553755882080E+06,       0.101215630660361639E+06,       0.101191802985207483E+06,
+        0.101164939977834394E+06,       0.101134911067020425E+06,       0.101095221983884170E+06,       0.101047509096163092E+06,       0.100998010357585692E+06,
+        0.100947641730482603E+06,       0.100897282218335793E+06,       0.100847785377602457E+06,       0.100799988650482410E+06,       0.100756067172860465E+06,
+        0.100716404949108095E+06,       0.100680394601797932E+06,       0.100648426393021538E+06,       0.100745881471474568E+06,       0.100728142553068014E+06,
+        0.100709625290291020E+06,       0.100690810595279676E+06,       0.100673015913888710E+06,       0.100654662696282932E+06,       0.100635883098483231E+06,
+        0.100616812156066226E+06,       0.100597590570947941E+06,       0.100577923093225269E+06,       0.100558481382763435E+06,       0.100539763749561054E+06,
+        0.100521848971490384E+06,       0.100504736841997088E+06,       0.100488356281683067E+06,       0.100472574428834167E+06,       0.100457206575664590E+06,
+        0.100442026795809623E+06,       0.100426779086875598E+06,       0.100408173847290411E+06,       0.100384737995668649E+06,       0.100361938241868149E+06,
+        0.100339809752568588E+06,       0.100318341944825661E+06,       0.100297490120403570E+06,       0.100277187624826533E+06,       0.100256847285368276E+06,
+        0.100235365725066120E+06,       0.100214436988323068E+06,       0.100194015395758135E+06,       0.100174603679756343E+06,       0.100156451770575964E+06,
+        0.100139783864459299E+06,       0.100124799136242582E+06,       0.100111674036540222E+06,       0.100100566149749706E+06,       0.100091646133474802E+06,
+        0.100094268080595342E+06,       0.100098360646490051E+06,       0.100103245417476035E+06,       0.100108251398645036E+06,       0.100112713737688697E+06,
+        0.100115972074298101E+06,       0.100117368468727698E+06,       0.100113713047268437E+06,       0.100102264314479005E+06,       0.100088001440509222E+06,
+        0.100071163974188516E+06,       0.100051996036882978E+06,       0.100030726477270320E+06,       0.100007546295320470E+06,       0.999807647979038738E+05,
+        0.999391989552558807E+05,       0.998969708781520749E+05,       0.998557810370234511E+05,       0.998173700956349639E+05,       0.997835138413437380E+05,
+        0.997560107381300622E+05,       0.997399269866001996E+05,       0.997470920864752261E+05,       0.997634292598558095E+05,       0.997888964555621351E+05,
+        0.998253139512354246E+05,       0.998703081483062851E+05,       0.999237330223304161E+05,       0.999900673422841937E+05,       0.100071098592214898E+06,
+        0.100157786095159157E+06,       0.100248141148947368E+06,       0.100340095617225234E+06,       0.100431568456538211E+06,       0.100520552982271765E+06,
+        0.100601957172444119E+06,       0.100676277857242458E+06,       0.100746000837763233E+06,       0.100808736668317229E+06,       0.100864485886548777E+06,
+        0.100912656357667453E+06,       0.100952804425252194E+06,       0.100983458937089512E+06,       0.101002905816960556E+06,       0.101017076739301760E+06,
+        0.101025919304932366E+06,       0.101031319629252597E+06,       0.101035629307633033E+06,       0.101040244934609727E+06,       0.101046393155694794E+06,
+        0.101055516125687020E+06,       0.101070906234944094E+06,       0.101089614225348079E+06,       0.101111577432790844E+06,       0.101136727145279292E+06,
+        0.101164845396941935E+06,       0.101195505773623969E+06,       0.101228307857940395E+06,       0.101262885478130513E+06,       0.101298695011647855E+06,
+        0.101336323186784808E+06,       0.101375617863355365E+06,       0.101416132308550543E+06,       0.101458486694783467E+06,       0.101500186893265898E+06,
+        0.101539835500673144E+06,       0.101576113752189529E+06,       0.101608148989054069E+06,       0.101635731083729115E+06,       0.101658502412969741E+06,
+        0.101672883340000117E+06,       0.101682956248776158E+06,       0.101690136156231834E+06,       0.101694729692935623E+06,       0.101695555850151519E+06,
+        0.101694985210699713E+06,       0.101693812129123311E+06,       0.101693039728607808E+06,       0.101693715283905956E+06,       0.101692868849250488E+06,
+        0.101690508890417783E+06,       0.101685212790082718E+06,       0.101676311144040446E+06,       0.101666676329463662E+06,       0.101655232931092047E+06,
+        0.101641717109236590E+06,       0.101625993005500495E+06,       0.101608164735537764E+06,       0.101588188219044227E+06,       0.101565919017002117E+06,
+        0.101541334705616158E+06,       0.101515224870468810E+06,       0.101488328834034881E+06,       0.101461275807381404E+06,       0.101434883687913665E+06,
+        0.101409484965064941E+06,       0.101385820779280519E+06,       0.101366650582102375E+06,       0.101354446840173172E+06,       0.101343919272935833E+06,
+        0.101334580534699839E+06,       0.101326051033725802E+06,       0.101318025772555571E+06,       0.101310244905231491E+06,       0.101303240884958926E+06,
+        0.101296508440228543E+06,       0.101288703571071324E+06,       0.101279586340018883E+06,       0.101269869694777401E+06,       0.101258981910571456E+06,
+        0.101246361574452327E+06,       0.101230052909366845E+06,       0.101210205538298207E+06,       0.101187520180750522E+06,       0.101161911206820834E+06,
+        0.101133290201435040E+06,       0.101101563145659631E+06,       0.101066628653128937E+06,       0.101019252959455625E+06,       0.100965746706630394E+06,
+        0.100910740992734136E+06,       0.100855238817428384E+06,       0.100800186778776610E+06,       0.100746485895287333E+06,       0.100695000750680716E+06,
+        0.100647864656014091E+06,       0.100605793755290593E+06,       0.100567897173808713E+06,       0.100534547818198989E+06,       0.100814127595255733E+06,
+        0.100792022069682134E+06,       0.100768906676945466E+06,       0.100744859019167008E+06,       0.100719947172904969E+06,       0.100694229203288138E+06,
+        0.100667752842392147E+06,       0.100641747076966523E+06,       0.100616187623394333E+06,       0.100590421603492592E+06,       0.100564843816162116E+06,
+        0.100539661442132914E+06,       0.100515003622905657E+06,       0.100490925990557327E+06,       0.100467416019604236E+06,       0.100444399107853926E+06,
+        0.100421745278230635E+06,       0.100399276378565366E+06,       0.100374479059296529E+06,       0.100342341387721070E+06,       0.100310819294281551E+06,
+        0.100280122297496389E+06,       0.100250406051737154E+06,       0.100221779328347242E+06,       0.100194311780137796E+06,       0.100168042299398876E+06,
+        0.100142987772136228E+06,       0.100119152028053810E+06,       0.100096071569344102E+06,       0.100074127372371906E+06,       0.100053458844250679E+06,
+        0.100034145590099070E+06,       0.100016303683140140E+06,       0.100000086204841966E+06,       0.999856841527353536E+05,       0.999733278135488799E+05,
+        0.999663531822283549E+05,       0.999693777575280983E+05,       0.999741959503276157E+05,       0.999802590538802469E+05,       0.999870378916889313E+05,
+        0.999938949144795042E+05,       0.100000191518739506E+06,       0.100005286991947069E+06,       0.100006317487418550E+06,       0.100001195017387858E+06,
+        0.999937624881289375E+05,       0.999840228227615153E+05,       0.999719630030743720E+05,       0.999577541117163637E+05,       0.999414190489595931E+05,
+        0.999227353126357775E+05,       0.998873066933161899E+05,       0.998482442672230973E+05,       0.998092392179712187E+05,       0.997720171343442780E+05,
+        0.997383602763239178E+05,       0.997100954593149654E+05,       0.996890738866330212E+05,       0.996865348971301573E+05,       0.996979284283922898E+05,
+        0.997178025858917244E+05,       0.997459381653020537E+05,       0.997821174181933602E+05,       0.998261113921440992E+05,       0.998776597193271737E+05,
+        0.999420283421857603E+05,       0.100017917957394646E+06,       0.100097878242084247E+06,       0.100179897231054711E+06,       0.100262024118021669E+06,
+        0.100342632647495484E+06,       0.100419763744213284E+06,       0.100491241165072570E+06,       0.100554990596539108E+06,       0.100613108372608185E+06,
+        0.100664964935558615E+06,       0.100710050488669251E+06,       0.100748062257432917E+06,       0.100778981129089982E+06,       0.100801136588479072E+06,
+        0.100816775933362136E+06,       0.100825979191023362E+06,       0.100833035761093313E+06,       0.100839384072879693E+06,       0.100846373089390050E+06,
+        0.100857951736503237E+06,       0.100872302980121356E+06,       0.100888680627202251E+06,       0.100907092306334001E+06,       0.100927501559027049E+06,
+        0.100950662310288419E+06,       0.100977294658870305E+06,       0.101006277386327682E+06,       0.101036971461367139E+06,       0.101068254496147259E+06,
+        0.101099848827670517E+06,       0.101133511540723193E+06,       0.101169399010245761E+06,       0.101207870174907031E+06,       0.101248846664781042E+06,
+        0.101290872607848010E+06,       0.101333141189654139E+06,       0.101375246051365641E+06,       0.101416446476650075E+06,       0.101455302158143284E+06,
+        0.101490839830927347E+06,       0.101520107656443550E+06,       0.101543517742126453E+06,       0.101563037513223637E+06,       0.101578855351202437E+06,
+        0.101589294440855650E+06,       0.101594084692158984E+06,       0.101595811485579121E+06,       0.101594522898840631E+06,       0.101587783852875349E+06,
+        0.101580434348492054E+06,       0.101571251185715577E+06,       0.101560523496472335E+06,       0.101548552694418337E+06,       0.101535867827232971E+06,
+        0.101525413599061823E+06,       0.101514059084604145E+06,       0.101501599931887249E+06,       0.101487982453526070E+06,       0.101472687979190014E+06,
+        0.101455256212675624E+06,       0.101436599458446668E+06,       0.101417421871714148E+06,       0.101397941747779230E+06,       0.101378563636379375E+06,
+        0.101359842874464084E+06,       0.101342462840995518E+06,       0.101332246224379633E+06,       0.101325840252083945E+06,       0.101320103689658979E+06,
+        0.101314877253089740E+06,       0.101310111834561045E+06,       0.101305378666758857E+06,       0.101300345803243748E+06,       0.101295776170531011E+06,
+        0.101292199871251156E+06,       0.101287082936946317E+06,       0.101280060941132921E+06,       0.101270852280511215E+06,       0.101259228389922413E+06,
+        0.101244988802512118E+06,       0.101227740446083306E+06,       0.101206586899449845E+06,       0.101182271497207475E+06,       0.101154765725986566E+06,
+        0.101124017218970926E+06,       0.101089948851124151E+06,       0.101052459983455323E+06,       0.101011429271982197E+06,       0.100955245737388075E+06,
+        0.100896292883737755E+06,       0.100836289133349041E+06,       0.100776402552628671E+06,       0.100717117782225978E+06,       0.100659365283430379E+06,
+        0.100604025319315682E+06,       0.100553449734939946E+06,       0.100508407522918642E+06,       0.100467703215460322E+06,       0.100431774319843782E+06,
+        0.100887777028820332E+06,       0.100861720047367722E+06,       0.100834436753951144E+06,       0.100806009321876336E+06,       0.100776515387351727E+06,
+        0.100746027719175327E+06,       0.100714128174464058E+06,       0.100678835400336873E+06,       0.100643940658424166E+06,       0.100609599439615049E+06,
+        0.100575890439937211E+06,       0.100542814645689868E+06,       0.100510647118237335E+06,       0.100478852228419142E+06,       0.100447427441828680E+06,
+        0.100416345678542421E+06,       0.100385524391706378E+06,       0.100353710114660586E+06,       0.100313330006065604E+06,       0.100273215809488320E+06,
+        0.100233726851702537E+06,       0.100195172710990315E+06,       0.100157816918484707E+06,       0.100121881575408392E+06,       0.100087552777137244E+06,
+        0.100054986731522251E+06,       0.100024316458513829E+06,       0.999958188555688102E+05,       0.999694587498323526E+05,       0.999449162204764725E+05,
+        0.999222572991156194E+05,       0.999015841003048117E+05,       0.998830358793447813E+05,       0.998667901084829064E+05,       0.998530636160492868E+05,
+        0.998421138196279935E+05,       0.998399548826702376E+05,       0.998456341634458367E+05,       0.998536660057044792E+05,       0.998634438903502014E+05,
+        0.998743637363783346E+05,       0.998858203733583359E+05,       0.998972031892049272E+05,       0.999078909209750127E+05,       0.999149362451545312E+05,
+        0.999155853988857416E+05,       0.999144713123037072E+05,       0.999115094947106991E+05,       0.999066084422268032E+05,       0.998996635379296931E+05,
+        0.998905505086211051E+05,       0.998791187039132201E+05,       0.998553009292081260E+05,       0.998211706427201134E+05,       0.997864909210314072E+05,
+        0.997528267554746853E+05,       0.997217498141473916E+05,       0.996948180668799905E+05,       0.996735491411857802E+05,       0.996593866015884996E+05,
+        0.996655234255323448E+05,       0.996793806269131601E+05,       0.997006480667150026E+05,       0.997291101032920706E+05,       0.997645101820020791E+05,
+        0.998065302642879251E+05,       0.998547900089741306E+05,       0.999134103376733110E+05,       0.999816545378570445E+05,       0.100052123784172887E+06,
+        0.100122995502983205E+06,       0.100192554793170464E+06,       0.100259253657548237E+06,       0.100321770579711141E+06,       0.100379066111299660E+06,
+        0.100430565790236928E+06,       0.100476507405646029E+06,       0.100515199549242738E+06,       0.100547257296906639E+06,       0.100573671260601302E+06,
+        0.100594920234367688E+06,       0.100611741953639648E+06,       0.100625093360959523E+06,       0.100636085854106641E+06,       0.100648539226327353E+06,
+        0.100663110344216606E+06,       0.100678485576473686E+06,       0.100694991774415132E+06,       0.100712835683178113E+06,       0.100732147548005290E+06,
+        0.100753127553809449E+06,       0.100775525773403977E+06,       0.100799178062266757E+06,       0.100823896465442915E+06,       0.100848973735924432E+06,
+        0.100871627589741343E+06,       0.100896325593451635E+06,       0.100923508440905760E+06,       0.100953444968081341E+06,       0.100987803936626107E+06,
+        0.101025452874861629E+06,       0.101064958354120550E+06,       0.101105934719207362E+06,       0.101149656229281260E+06,       0.101195955740066449E+06,
+        0.101241312234646321E+06,       0.101284295970940017E+06,       0.101322838039260794E+06,       0.101354503959834561E+06,       0.101381602347716602E+06,
+        0.101404011754918669E+06,       0.101421551762267889E+06,       0.101430360992792368E+06,       0.101432922117767157E+06,       0.101431497700586173E+06,
+        0.101426925441668209E+06,       0.101419967655507149E+06,       0.101411983040633873E+06,       0.101402716970667971E+06,       0.101392421375849139E+06,
+        0.101381472260780953E+06,       0.101370274940234522E+06,       0.101359740662010270E+06,       0.101350634658367329E+06,       0.101341143517682387E+06,
+        0.101330923240958698E+06,       0.101319823874219393E+06,       0.101307931163203728E+06,       0.101295590108053555E+06,       0.101283554840952769E+06,
+        0.101272503805782646E+06,       0.101264230996134676E+06,       0.101263165987784392E+06,       0.101263248071743699E+06,       0.101263968423840182E+06,
+        0.101264949849351571E+06,       0.101265950281725454E+06,       0.101266859267559164E+06,       0.101267688820318188E+06,       0.101269586773692979E+06,
+        0.101271200254654817E+06,       0.101270843870590616E+06,       0.101268468005190778E+06,       0.101263583383249803E+06,       0.101255809203046563E+06,
+        0.101244849341628564E+06,       0.101230469880693592E+06,       0.101211897835992699E+06,       0.101189677118595791E+06,       0.101163874725058151E+06,
+        0.101134452948665217E+06,       0.101101374466219480E+06,       0.101064596222306151E+06,       0.101024065194136114E+06,       0.100976094439065258E+06,
+        0.100916143828112647E+06,       0.100853769181501484E+06,       0.100790071236260570E+06,       0.100726087398982490E+06,       0.100662794662010128E+06,
+        0.100601113224382003E+06,       0.100541910367744073E+06,       0.100487274737311833E+06,       0.100437683864829785E+06,       0.100392394095480457E+06,
+        0.100351867577605750E+06,       0.100962168045125494E+06,       0.100932365352918903E+06,       0.100901110935450168E+06,       0.100868480358099798E+06,
+        0.100834547574790442E+06,       0.100796703363587934E+06,       0.100755267960995203E+06,       0.100713570472402876E+06,       0.100671854726096004E+06,
+        0.100630308500112806E+06,       0.100589060133053688E+06,       0.100548176434007823E+06,       0.100507661857319457E+06,       0.100467458892467330E+06,
+        0.100427449603971385E+06,       0.100387458241177985E+06,       0.100347067293918182E+06,       0.100298654635154177E+06,       0.100250789888946878E+06,
+        0.100203094461237808E+06,       0.100156000274838036E+06,       0.100109901773151054E+06,       0.100065158238268661E+06,       0.100022096993949221E+06,
+        0.999810174333996401E+05,       0.999421958115488960E+05,       0.999058907435752189E+05,       0.998749313841952826E+05,       0.998464722705311870E+05,
+        0.998203417981312523E+05,       0.997966268545406929E+05,       0.997754458911707188E+05,       0.997569500594004494E+05,       0.997413241542494943E+05,
+        0.997287873670089612E+05,       0.997195938347852207E+05,       0.997219848697613779E+05,       0.997302647271703609E+05,       0.997413201843605202E+05,
+        0.997545532545877795E+05,       0.997693575270145375E+05,       0.997851155398511037E+05,       0.998011953959217790E+05,       0.998169466903843859E+05,
+        0.998299082101016102E+05,       0.998356142670790869E+05,       0.998398422284621047E+05,       0.998424522644160897E+05,       0.998432923817324918E+05,
+        0.998421955048720556E+05,       0.998389770375031076E+05,       0.998334333807975636E+05,       0.998233671652358898E+05,       0.997961670290865004E+05,
+        0.997678973047597101E+05,       0.997399010170866677E+05,       0.997134966342892585E+05,       0.996899556689095043E+05,       0.996704759993049811E+05,
+        0.996561506699569145E+05,       0.996500136858785991E+05,       0.996586427100675064E+05,       0.996741311696416087E+05,       0.996962994894855947E+05,
+        0.997249142503650510E+05,       0.997596639024193428E+05,       0.998001312580039958E+05,       0.998457643772705051E+05,       0.998968741052847909E+05,
+        0.999554058789066621E+05,       0.100014421175045645E+06,       0.100072433938662172E+06,       0.100128122411163247E+06,       0.100180369857232887E+06,
+        0.100226565707743983E+06,       0.100267364450542242E+06,       0.100303437234851634E+06,       0.100335667091963755E+06,       0.100364067822408935E+06,
+        0.100388352892750874E+06,       0.100408979571248361E+06,       0.100426614584295938E+06,       0.100443740449263758E+06,       0.100461134998395326E+06,
+        0.100478174321635088E+06,       0.100495256991003844E+06,       0.100512619944850769E+06,       0.100530318011748270E+06,       0.100548816195507636E+06,
+        0.100568537852548383E+06,       0.100588688433695279E+06,       0.100609168368209503E+06,       0.100629814904332350E+06,       0.100650416237038749E+06,
+        0.100665634418575515E+06,       0.100681296503981284E+06,       0.100698501345687095E+06,       0.100717920340627403E+06,       0.100740215249176472E+06,
+        0.100766890514599916E+06,       0.100796657224606606E+06,       0.100829306693609207E+06,       0.100864641226465828E+06,       0.100904494038338991E+06,
+        0.100948883593760926E+06,       0.100993670283464584E+06,       0.101037518284592399E+06,       0.101079215492193092E+06,       0.101115268009655614E+06,
+        0.101146790223207165E+06,       0.101174201341284715E+06,       0.101197180680782549E+06,       0.101215405063571248E+06,       0.101223672236876388E+06,
+        0.101227039458753206E+06,       0.101226892310118274E+06,       0.101223972224575875E+06,       0.101218953111666357E+06,       0.101212937481870860E+06,
+        0.101205841402347578E+06,       0.101198438153766576E+06,       0.101191337677150907E+06,       0.101184775501605473E+06,       0.101178859738651910E+06,
+        0.101173861836438504E+06,       0.101169688625135837E+06,       0.101165295165053874E+06,       0.101160720689472480E+06,       0.101156205118519152E+06,
+        0.101153904081471745E+06,       0.101157778313312563E+06,       0.101162376363148098E+06,       0.101167695990116554E+06,       0.101174407609201837E+06,
+        0.101181289698729292E+06,       0.101187910343826748E+06,       0.101193938755009076E+06,       0.101199145593254492E+06,       0.101206932922006279E+06,
+        0.101215167455344184E+06,       0.101221538641997948E+06,       0.101225600948191553E+06,       0.101227025345643400E+06,       0.101225591909201801E+06,
+        0.101221179118605258E+06,       0.101213750568578733E+06,       0.101199646966405868E+06,       0.101180697627794187E+06,       0.101158105995225807E+06,
+        0.101131732247750042E+06,       0.101101468150223940E+06,       0.101067227518597691E+06,       0.101028937999906033E+06,       0.100986534229694924E+06,
+        0.100931637537634888E+06,       0.100870116212888723E+06,       0.100806172230221506E+06,       0.100740814221331588E+06,       0.100675010844437245E+06,
+        0.100609686876287946E+06,       0.100545721239012084E+06,       0.100483946382944894E+06,       0.100426130298766730E+06,       0.100372432821891009E+06,
+        0.100322757504134090E+06,       0.100277638455664739E+06,       0.101031760825673671E+06,       0.100998271623218010E+06,       0.100963081981794705E+06,
+        0.100926251398063658E+06,       0.100882116391194853E+06,       0.100836110949086375E+06,       0.100789196010976768E+06,       0.100741656022242169E+06,
+        0.100693739602509639E+06,       0.100645654807320738E+06,       0.100597565425804190E+06,       0.100549588305930272E+06,       0.100501791687992096E+06,
+        0.100454194516198477E+06,       0.100406766687836353E+06,       0.100359430189551465E+06,       0.100303106797204193E+06,       0.100246577208372706E+06,
+        0.100190531822652643E+06,       0.100135266216653603E+06,       0.100081062875707968E+06,       0.100028192493603376E+06,       0.999769161960119818E+05,
+        0.999274886616365693E+05,       0.998801621121565840E+05,       0.998351911400472018E+05,       0.997962094163349393E+05,       0.997640534483473457E+05,
+        0.997345240177219384E+05,       0.997076990988948673E+05,       0.996836794307263772E+05,       0.996625896600271371E+05,       0.996445791479565378E+05,
+        0.996298224252568762E+05,       0.996185192726470996E+05,       0.996108943913202529E+05,       0.996171044733596500E+05,       0.996274341933858086E+05,
+        0.996407368485686020E+05,       0.996564433077199938E+05,       0.996739662819337100E+05,       0.996926995456860750E+05,       0.997120167510192841E+05,
+        0.997312700110226870E+05,       0.997492720049924683E+05,       0.997589945357419347E+05,       0.997672950870170171E+05,       0.997740082631510304E+05,
+        0.997789569418504107E+05,       0.997819534179343900E+05,       0.997828018434580008E+05,       0.997813025467889238E+05,       0.997761547542830958E+05,
+        0.997606903751367063E+05,       0.997380039112137747E+05,       0.997148807783809316E+05,       0.996925793721139198E+05,       0.996723316187614837E+05,
+        0.996553186696160265E+05,       0.996426434711866459E+05,       0.996353006212308683E+05,       0.996360089851673401E+05,       0.996493081867637520E+05,
+        0.996683800195190997E+05,       0.996929780547397386E+05,       0.997227658669395460E+05,       0.997573001543519495E+05,       0.997960150791931374E+05,
+        0.998382096557535260E+05,       0.998830404070649238E+05,       0.999298323121304275E+05,       0.999742523604048474E+05,       0.100016965326181715E+06,
+        0.100057253131543956E+06,       0.100094584675305145E+06,       0.100128612542877818E+06,       0.100159162106115866E+06,       0.100186212494174571E+06,
+        0.100209869217876141E+06,       0.100230664541801205E+06,       0.100252215827535721E+06,       0.100272507526162837E+06,       0.100291578842935764E+06,
+        0.100309849731348106E+06,       0.100327689967233746E+06,       0.100345394170965068E+06,       0.100363163535270942E+06,       0.100381092592034052E+06,
+        0.100399259031973241E+06,       0.100417513798931104E+06,       0.100435580822035801E+06,       0.100453091252954211E+06,       0.100469603339999827E+06,
+        0.100480151507121773E+06,       0.100489254638568047E+06,       0.100498595808049067E+06,       0.100508951548301586E+06,       0.100521040443233302E+06,
+        0.100536087694824993E+06,       0.100554481106296153E+06,       0.100575842199618433E+06,       0.100600284600435130E+06,       0.100627894363922838E+06,
+        0.100660998742818352E+06,       0.100699900685942383E+06,       0.100740240979155365E+06,       0.100780773089326132E+06,       0.100820325888548046E+06,
+        0.100857002425394050E+06,       0.100889306549680012E+06,       0.100918410465244044E+06,       0.100943855527829830E+06,       0.100965216993375041E+06,
+        0.100982104369596826E+06,       0.100988787448417890E+06,       0.100992039290643908E+06,       0.100992851817592629E+06,       0.100992148367721486E+06,
+        0.100990754377491627E+06,       0.100989328864528783E+06,       0.100987939282731590E+06,       0.100987019598780156E+06,       0.100986810224360001E+06,
+        0.100987461015865600E+06,       0.100989052975663959E+06,       0.100991630597561802E+06,       0.100995163025901697E+06,       0.101001875722349461E+06,
+        0.101011088720900429E+06,       0.101021084899088091E+06,       0.101031663037972830E+06,       0.101042638294081626E+06,       0.101053858103835970E+06,
+        0.101065218626100279E+06,       0.101076680586933391E+06,       0.101088283485301858E+06,       0.101099874970037970E+06,       0.101113089326713816E+06,
+        0.101125428039884195E+06,       0.101136196176455385E+06,       0.101144782354753406E+06,       0.101150661981462021E+06,       0.101153397040916956E+06,
+        0.101152632849470392E+06,       0.101148092219151222E+06,       0.101138825885236918E+06,       0.101125297346996245E+06,       0.101107998631323659E+06,
+        0.101086896343469081E+06,       0.101061954484055474E+06,       0.101033133620494526E+06,       0.101000389988487950E+06,       0.100963674428856495E+06,
+        0.100920035249967157E+06,       0.100864002050084426E+06,       0.100802954127500183E+06,       0.100739491656333426E+06,       0.100674607806506479E+06,
+        0.100609142818467881E+06,       0.100543918229119721E+06,       0.100479729438758746E+06,       0.100417340423775575E+06,       0.100357818911458060E+06,
+        0.100301549120910859E+06,       0.100249027161521051E+06,       0.100200821670612902E+06,       0.101087517829558172E+06,       0.101052015003826687E+06,
+        0.101011788745108162E+06,       0.100964536778963855E+06,       0.100915488137692053E+06,       0.100864943012846241E+06,       0.100813190048196135E+06,
+        0.100760500256302723E+06,       0.100707121731364154E+06,       0.100653275174801398E+06,       0.100599150242222226E+06,       0.100544902712618306E+06,
+        0.100490652473024573E+06,       0.100436482304513964E+06,       0.100382437448442113E+06,       0.100320280351299210E+06,       0.100257427382579408E+06,
+        0.100194846079550756E+06,       0.100132891655021755E+06,       0.100071918796184837E+06,       0.100012281557507449E+06,       0.999543340473443968E+05,
+        0.998984318951125897E+05,       0.998449344820776314E+05,       0.997942079153267550E+05,       0.997466460297804297E+05,       0.997094928681285237E+05,
+        0.996756279012622545E+05,       0.996450218538222252E+05,       0.996176735384205385E+05,       0.995936103776563396E+05,       0.995728884174646664E+05,
+        0.995555917894421727E+05,       0.995418315732738702E+05,       0.995317440033937164E+05,       0.995262628136555868E+05,       0.995329410864949314E+05,
+        0.995433141117427585E+05,       0.995568197318211314E+05,       0.995728823939344729E+05,       0.995909116272487881E+05,       0.996102999545491039E+05,
+        0.996304204174830811E+05,       0.996506239397997124E+05,       0.996702368021630245E+05,       0.996815718025470851E+05,       0.996899469928969920E+05,
+        0.996967323341972806E+05,       0.997018093255459680E+05,       0.997050766826754843E+05,       0.997064543685055542E+05,       0.997058891541211779E+05,
+        0.997033620388164272E+05,       0.996988978495463380E+05,       0.996831868676393642E+05,       0.996664226445127570E+05,       0.996504367351514375E+05,
+        0.996361908772876632E+05,       0.996245860820844246E+05,       0.996164411729444837E+05,       0.996124708057612588E+05,       0.996132638091558620E+05,
+        0.996196649575229239E+05,       0.996367110923675500E+05,       0.996583825556631200E+05,       0.996843326520396949E+05,       0.997128691088688356E+05,
+        0.997429147876210773E+05,       0.997758051592909760E+05,       0.998110107603276119E+05,       0.998478942000829556E+05,       0.998857114279977977E+05,
+        0.999214491155317955E+05,       0.999550948845939129E+05,       0.999866837454055931E+05,       0.100015951080814193E+06,       0.100042763152220112E+06,
+        0.100066833155271277E+06,       0.100088158247781059E+06,       0.100108078185884762E+06,       0.100126927297932227E+06,       0.100144951073682430E+06,
+        0.100162306504082269E+06,       0.100179972902585811E+06,       0.100197255514410528E+06,       0.100214513504718459E+06,       0.100231716678680328E+06,
+        0.100248516891677820E+06,       0.100264879167597144E+06,       0.100280677931150029E+06,       0.100295703143529230E+06,       0.100309668678237373E+06,
+        0.100317822458752169E+06,       0.100323698725186405E+06,       0.100328766123466703E+06,       0.100333617686529382E+06,       0.100338870421945830E+06,
+        0.100345146510504768E+06,       0.100353505811859010E+06,       0.100364091412822730E+06,       0.100377219192028511E+06,       0.100393145224109379E+06,
+        0.100412076822805961E+06,       0.100436536362016341E+06,       0.100466993027333549E+06,       0.100499128955239808E+06,       0.100531867585847620E+06,
+        0.100564210070354224E+06,       0.100595268938737849E+06,       0.100623389505981249E+06,       0.100648875381678285E+06,       0.100671545265182722E+06,
+        0.100691215991390258E+06,       0.100707855569253967E+06,       0.100721531568851729E+06,       0.100729765774870320E+06,       0.100736382308921660E+06,
+        0.100742049357786149E+06,       0.100747338931632839E+06,       0.100752699996680560E+06,       0.100758437644766876E+06,       0.100764492369211905E+06,
+        0.100771174162651805E+06,       0.100778897781122723E+06,       0.100791202238176033E+06,       0.100805304746492911E+06,       0.100820453141876555E+06,
+        0.100836553977341420E+06,       0.100853433691068960E+06,       0.100869804352758074E+06,       0.100885565873248357E+06,       0.100901263434718436E+06,
+        0.100916755649211860E+06,       0.100931925490762223E+06,       0.100946862129343805E+06,       0.100964994999554750E+06,       0.100982379998277524E+06,
+        0.100998599729598267E+06,       0.101013259118967748E+06,       0.101025997621651855E+06,       0.101036183051793079E+06,       0.101042991775159331E+06,
+        0.101046219174794693E+06,       0.101045436783694371E+06,       0.101037979396283830E+06,       0.101026389136987622E+06,       0.101011353849770458E+06,
+        0.100992765156084381E+06,       0.100970520839387638E+06,       0.100944522980413691E+06,       0.100914676733503889E+06,       0.100880889510173438E+06,
+        0.100843070409204898E+06,       0.100794195318855112E+06,       0.100740849916230014E+06,       0.100684368608276331E+06,       0.100625515617689191E+06,
+        0.100565057571482292E+06,       0.100503753672499588E+06,       0.100442348146381337E+06,       0.100381564680888332E+06,       0.100322120082476831E+06,
+        0.100265427081164002E+06,       0.100211108587006820E+06,       0.100159852906932778E+06,       0.100112309293580329E+06,       0.101124201328911135E+06,
+        0.101079108320663814E+06,       0.101031809144729792E+06,       0.100982479818601947E+06,       0.100931296727433786E+06,       0.100878431465452362E+06,
+        0.100824045759680885E+06,       0.100768286540631874E+06,       0.100710530566360118E+06,       0.100651851143405918E+06,       0.100592641779612633E+06,
+        0.100533088300546049E+06,       0.100473351995987294E+06,       0.100413568226339557E+06,       0.100347374189164038E+06,       0.100280419558277266E+06,
+        0.100213466642138825E+06,       0.100146884874704396E+06,       0.100081054126754942E+06,       0.100016363564741026E+06,       0.999532111494706915E+05,
+        0.998920037667682045E+05,       0.998331579776468134E+05,       0.997771013708717801E+05,       0.997242744959584961E+05,       0.996794911425569007E+05,
+        0.996421673866169731E+05,       0.996083624063458992E+05,       0.995780558571076108E+05,       0.995512438908386830E+05,       0.995279390599935141E+05,
+        0.995081697090995876E+05,       0.994919788171798573E+05,       0.994794222509916144E+05,       0.994705663858296175E+05,       0.994666304399983201E+05,
+        0.994716729317709396E+05,       0.994803098980725772E+05,       0.994920284915772354E+05,       0.995062941002977459E+05,       0.995225510997954116E+05,
+        0.995402235083560226E+05,       0.995587157137078175E+05,       0.995774134724761680E+05,       0.995956854178548674E+05,       0.996082099438724399E+05,
+        0.996146714115503564E+05,       0.996198917096476653E+05,       0.996237772972328385E+05,       0.996262556600006501E+05,       0.996272811679797160E+05,
+        0.996268420791924145E+05,       0.996249688472863927E+05,       0.996217438673883153E+05,       0.996165665480622556E+05,       0.996053672464558331E+05,
+        0.995949919441781822E+05,       0.995861528017038072E+05,       0.995795026742108748E+05,       0.995756196555683418E+05,       0.995749923295157205E+05,
+        0.995764918417123117E+05,       0.995811371618628909E+05,       0.995900021812679042E+05,       0.996053443416097725E+05,       0.996253126869847765E+05,
+        0.996485392863536254E+05,       0.996747275639752770E+05,       0.997034975235640304E+05,       0.997343816924544808E+05,       0.997668244608898967E+05,
+        0.998001857951137499E+05,       0.998337502953590738E+05,       0.998667425003782409E+05,       0.998964382191309269E+05,       0.999219732315580331E+05,
+        0.999453769704884326E+05,       0.999669632680838986E+05,       0.999870458961453260E+05,       0.100005916456012012E+06,       0.100023824889774987E+06,
+        0.100040963571971195E+06,       0.100057455775243085E+06,       0.100073413986486979E+06,       0.100089335775104671E+06,       0.100104815244426631E+06,
+        0.100119703191363587E+06,       0.100134379227022902E+06,       0.100148369375800728E+06,       0.100161370783191393E+06,       0.100173213642796953E+06,
+        0.100180378799944810E+06,       0.100185526497069281E+06,       0.100189324284954535E+06,       0.100192153267272603E+06,       0.100194434190503976E+06,
+        0.100196610662858875E+06,       0.100198905421094794E+06,       0.100201850991823914E+06,       0.100206163107215340E+06,       0.100212230663632377E+06,
+        0.100220378132198122E+06,       0.100230869811071767E+06,       0.100245444302250398E+06,       0.100264473811748554E+06,       0.100285188354245533E+06,
+        0.100306907645131752E+06,       0.100328990026887506E+06,       0.100350863943610893E+06,       0.100371839758985952E+06,       0.100391444833452260E+06,
+        0.100409831169643890E+06,       0.100426823791286341E+06,       0.100442350551841242E+06,       0.100456434485740057E+06,       0.100469179887128601E+06,
+        0.100480095078871280E+06,       0.100490844862516460E+06,       0.100501773469729742E+06,       0.100513473090107072E+06,       0.100529036405637875E+06,
+        0.100544944618372494E+06,       0.100561407314039185E+06,       0.100578441255079553E+06,       0.100596158161423402E+06,       0.100614688506316757E+06,
+        0.100634037456854698E+06,       0.100654132781311564E+06,       0.100674831301503669E+06,       0.100695930204477670E+06,       0.100717182634869590E+06,
+        0.100738316734543623E+06,       0.100757949561458212E+06,       0.100778269263575014E+06,       0.100798138776316147E+06,       0.100817212656416305E+06,
+        0.100835135245772617E+06,       0.100851545416907000E+06,       0.100866083297882986E+06,       0.100878398135237148E+06,       0.100888156496614407E+06,
+        0.100895050095971907E+06,       0.100897946875170004E+06,       0.100893038607802475E+06,       0.100884438418173842E+06,       0.100872056807847897E+06,
+        0.100855733686039923E+06,       0.100836196267254127E+06,       0.100813309503127763E+06,       0.100786948600525633E+06,       0.100756997497101227E+06,
+        0.100723347939641535E+06,       0.100681497385685245E+06,       0.100634489632593322E+06,       0.100584469640955329E+06,       0.100531975070484972E+06,
+        0.100477580490852386E+06,       0.100421885399875624E+06,       0.100365503956835804E+06,       0.100309056337240749E+06,       0.100253161585176160E+06,
+        0.100199112753698049E+06,       0.100147837599931416E+06,       0.100098570404209735E+06,       0.100051904767761502E+06,       0.100008417383464068E+06,
+        0.101133829804470908E+06,       0.101086063734912168E+06,       0.101036163378778583E+06,       0.100984272823056410E+06,       0.100930541473297533E+06,
+        0.100875120408097937E+06,       0.100818158832696005E+06,       0.100759800682388610E+06,       0.100700181428799915E+06,       0.100639425144117529E+06,
+        0.100577641880169904E+06,       0.100514925420599073E+06,       0.100451351465310479E+06,       0.100382775391041228E+06,       0.100313407558045423E+06,
+        0.100244124043691409E+06,       0.100175160300200252E+06,       0.100106643005048623E+06,       0.100038955227867787E+06,       0.999724957502307661E+05,
+        0.999076781431158888E+05,       0.998449303055831406E+05,       0.997846944474534976E+05,       0.997274274929867825E+05,       0.996741803525597352E+05,
+        0.996341923290063423E+05,       0.995977652427823923E+05,       0.995648719529626542E+05,       0.995354913787664409E+05,       0.995096084222995123E+05,
+        0.994872134460891248E+05,       0.994683012796486000E+05,       0.994528697284307418E+05,       0.994409175579627627E+05,       0.994324419258456037E+05,
+        0.994284685420939932E+05,       0.994314645232595940E+05,       0.994376508028579119E+05,       0.994465880324430618E+05,       0.994578122019961011E+05,
+        0.994708370980191394E+05,       0.994851569440643361E+05,       0.995002493657292362E+05,       0.995155788435459253E+05,       0.995306008387735346E+05,
+        0.995442855494334071E+05,       0.995482724169068970E+05,       0.995511559961705934E+05,       0.995528872179506288E+05,       0.995534386606523331E+05,
+        0.995528106454166118E+05,       0.995510380683528929E+05,       0.995481980155677447E+05,       0.995444181794313772E+05,       0.995389426918443642E+05,
+        0.995326299748121528E+05,       0.995248068651720969E+05,       0.995181203502452699E+05,       0.995131485287031392E+05,       0.995104093839186244E+05,
+        0.995103487778951967E+05,       0.995133292577804386E+05,       0.995196200330811116E+05,       0.995293885226779821E+05,       0.995426939068978973E+05,
+        0.995594831481808505E+05,       0.995804466354603064E+05,       0.996042013257502404E+05,       0.996303970501146687E+05,       0.996586123005633417E+05,
+        0.996883528051014437E+05,       0.997188265847352159E+05,       0.997490367113701504E+05,       0.997788526495865081E+05,       0.998078707819837873E+05,
+        0.998356993938613014E+05,       0.998619800562695164E+05,       0.998837326032437413E+05,       0.999030588156207523E+05,       0.999213959026974480E+05,
+        0.999389528776631778E+05,       0.999559737390779337E+05,       0.999728528505193826E+05,       0.999889548460716323E+05,       0.100004292017804837E+06,
+        0.100018822423468373E+06,       0.100032457501698547E+06,       0.100045070251751036E+06,       0.100056503593779649E+06,       0.100066444229329674E+06,
+        0.100073267298309525E+06,       0.100078208907556284E+06,       0.100081428306994378E+06,       0.100083145646425299E+06,       0.100084490398295631E+06,
+        0.100085214798590619E+06,       0.100085235536889129E+06,       0.100083644141418641E+06,       0.100082296767241191E+06,       0.100081573165770096E+06,
+        0.100081814208376789E+06,       0.100083316094140551E+06,       0.100086326553815597E+06,       0.100092077248113128E+06,       0.100100913993150592E+06,
+        0.100111107468981296E+06,       0.100122323217253404E+06,       0.100134231875447673E+06,       0.100146529461883110E+06,       0.100158953738958458E+06,
+        0.100172103739167927E+06,       0.100185442550333013E+06,       0.100198870033114930E+06,       0.100214743046030431E+06,       0.100230501702414200E+06,
+        0.100246186063517438E+06,       0.100261900880765723E+06,       0.100278280962620207E+06,       0.100294975745097370E+06,       0.100311878419328103E+06,
+        0.100329065054564679E+06,       0.100346610730169734E+06,       0.100364576981339662E+06,       0.100382997190169379E+06,       0.100401860048637522E+06,
+        0.100421460558640218E+06,       0.100441987614432976E+06,       0.100463274519939529E+06,       0.100485156332498926E+06,       0.100507667562079601E+06,
+        0.100531755712309474E+06,       0.100555537683995659E+06,       0.100578784151641899E+06,       0.100601239956125326E+06,       0.100622628756313949E+06,
+        0.100641873088256354E+06,       0.100658680264014634E+06,       0.100673598187900920E+06,       0.100686312726101605E+06,       0.100696503456104270E+06,
+        0.100703849613094353E+06,       0.100704152415214849E+06,       0.100700762505721214E+06,       0.100694332357036590E+06,       0.100684801738842943E+06,
+        0.100672137064367969E+06,       0.100656329651135165E+06,       0.100637393206196401E+06,       0.100615360755861184E+06,       0.100590281222544916E+06,
+        0.100562215831141861E+06,       0.100526781016220033E+06,       0.100486348156266336E+06,       0.100442798181998849E+06,       0.100397163429546563E+06,
+        0.100349807344903311E+06,       0.100301139976506107E+06,       0.100251607747954069E+06,       0.100201684250218939E+06,       0.100151862062679153E+06,
+        0.100102645581508201E+06,       0.100056044918004729E+06,       0.100011301942910883E+06,       0.999684520456376777E+05,       0.999279531311431929E+05,
+        0.998902646792392770E+05,       0.101126663346454399E+06,       0.101077325354608969E+06,       0.101025975734916894E+06,       0.100972737972671399E+06,
+        0.100917744423974829E+06,       0.100861133803490855E+06,       0.100803048766821448E+06,       0.100743633625432005E+06,       0.100683032233185906E+06,
+        0.100621386084403202E+06,       0.100558832663878042E+06,       0.100495211427552291E+06,       0.100428081646754872E+06,       0.100360053702616802E+06,
+        0.100291421804985934E+06,       0.100222501857581025E+06,       0.100153629396011398E+06,       0.100085157752426705E+06,       0.100017456492403435E+06,
+        0.999509101650603116E+05,       0.998859174013813172E+05,       0.998228903882164013E+05,       0.997622547363343474E+05,       0.997044497501409787E+05,
+        0.996565808532324445E+05,       0.996171954030033376E+05,       0.995813735590216529E+05,       0.995490780595074320E+05,       0.995202664706442010E+05,
+        0.994948916653312772E+05,       0.994731497863732366E+05,       0.994547373765991215E+05,       0.994395024448596523E+05,       0.994273918334258487E+05,
+        0.994183417080185318E+05,       0.994131115873192466E+05,       0.994138210062121798E+05,       0.994170868554473127E+05,       0.994225572846895811E+05,
+        0.994298923767942179E+05,       0.994385978253560606E+05,       0.994482495116238133E+05,       0.994584440096453618E+05,       0.994687785322086420E+05,
+        0.994788546658055129E+05,       0.994882828035313869E+05,       0.994927040708071727E+05,       0.994917547439376503E+05,       0.994895539007886109E+05,
+        0.994862075166797877E+05,       0.994818501581585733E+05,       0.994766470759525691E+05,       0.994707963627129502E+05,       0.994645310337857954E+05,
+        0.994581208250226337E+05,       0.994518734280974313E+05,       0.994461348017268174E+05,       0.994415182672292285E+05,       0.994388346879257297E+05,
+        0.994384357346413162E+05,       0.994406125032009149E+05,       0.994455917032776051E+05,       0.994535286747415666E+05,       0.994645016916688619E+05,
+        0.994785078337676387E+05,       0.994954607091662765E+05,       0.995151903074341826E+05,       0.995379744989390892E+05,       0.995645762978403654E+05,
+        0.995919660907828365E+05,       0.996199268533732247E+05,       0.996482101418556267E+05,       0.996765332991438627E+05,       0.997045938426658686E+05,
+        0.997320840835444978E+05,       0.997587053657859215E+05,       0.997841813092843222E+05,       0.998082694645679585E+05,       0.998307708426059398E+05,
+        0.998521847777656949E+05,       0.998731316336951131E+05,       0.998915223579208832E+05,       0.999088069900928822E+05,       0.999250655468217301E+05,
+        0.999403321942196199E+05,       0.999545992766920099E+05,       0.999678219791941956E+05,       0.999799234377201792E+05,       0.999908557408674824E+05,
+        0.100000288315772239E+06,       0.100007974659642932E+06,       0.100013912274213857E+06,       0.100018152445268570E+06,       0.100020792433534516E+06,
+        0.100021965384116600E+06,       0.100021828600707202E+06,       0.100018978825766098E+06,       0.100014638020503815E+06,       0.100010038309740252E+06,
+        0.100005576575099418E+06,       0.100001604858675491E+06,       0.999984320892866672E+05,       0.999963266886948113E+05,       0.999958737477183749E+05,
+        0.999972975927051302E+05,       0.100000048030566773E+06,       0.100004042344745598E+06,       0.100009194673973179E+06,       0.100015426118827090E+06,
+        0.100022673026545686E+06,       0.100031009563329135E+06,       0.100040766570146734E+06,       0.100051217540583049E+06,       0.100062248668533124E+06,
+        0.100073786795171531E+06,       0.100085797503990121E+06,       0.100098280610450573E+06,       0.100111262656178049E+06,       0.100125001802413579E+06,
+        0.100139645695878644E+06,       0.100154900063508263E+06,       0.100170710309353148E+06,       0.100187004814548171E+06,       0.100203682971120987E+06,
+        0.100220602392753455E+06,       0.100237565502663623E+06,       0.100256278549938754E+06,       0.100276900404893633E+06,       0.100298794291387065E+06,
+        0.100320557514765664E+06,       0.100342058165774986E+06,       0.100363130678741916E+06,       0.100383577435456726E+06,       0.100403171366828377E+06,
+        0.100421659429775435E+06,       0.100438766794516225E+06,       0.100454201546808938E+06,       0.100467659691497232E+06,       0.100478830237807808E+06,
+        0.100481024801078907E+06,       0.100479810484167552E+06,       0.100476403382797740E+06,       0.100470673041393165E+06,       0.100462504496619513E+06,
+        0.100451800234604845E+06,       0.100438481209722173E+06,       0.100422487058078696E+06,       0.100403775642287073E+06,       0.100382322062990715E+06,
+        0.100358117267813446E+06,       0.100327534199358997E+06,       0.100293850879764213E+06,       0.100257806725219358E+06,       0.100219741686727677E+06,
+        0.100180023194298759E+06,       0.100139040711945461E+06,       0.100097200477411025E+06,       0.100054920551059535E+06,       0.100012626265403043E+06,
+        0.999707461374165723E+05,       0.999303503014407033E+05,       0.998922229704366764E+05,       0.998554721656402544E+05,       0.998204850080980395E+05,
+        0.997876409225251264E+05,       0.997573084048583696E+05,       0.101103863341862932E+06,       0.101054198041262367E+06,       0.101002678396138304E+06,
+        0.100949414469850730E+06,       0.100894527371675096E+06,       0.100838147558637153E+06,       0.100780413214267071E+06,       0.100721468731159111E+06,
+        0.100661463324523051E+06,       0.100600549803942500E+06,       0.100538495641508489E+06,       0.100474499779926511E+06,       0.100409614880186520E+06,
+        0.100344074690081019E+06,       0.100278137807477731E+06,       0.100212086086552372E+06,       0.100146223109295490E+06,       0.100080872747272268E+06,
+        0.100016377835126099E+06,       0.999530989729176799E+05,       0.998914134690468200E+05,       0.998317144291724107E+05,       0.997744099892116501E+05,
+        0.997208338934957865E+05,       0.996799309689324291E+05,       0.996422327801534993E+05,       0.996077247089604498E+05,       0.995763830833266111E+05,
+        0.995481752007196337E+05,       0.995230592311468208E+05,       0.995009839760444302E+05,       0.994818884619951277E+05,       0.994657013515687577E+05,
+        0.994523401572802686E+05,       0.994417102486785589E+05,       0.994338127166474005E+05,       0.994291184813256987E+05,       0.994266081659517949E+05,
+        0.994259833524572168E+05,       0.994269351914163999E+05,       0.994291475057475909E+05,       0.994323001129119220E+05,       0.994360724062380032E+05,
+        0.994401472289394151E+05,       0.994442150616938598E+05,       0.994479785254193557E+05,       0.994511571742526139E+05,       0.994472284598653205E+05,
+        0.994408965796853736E+05,       0.994339336034472362E+05,       0.994264710020695638E+05,       0.994186660048548511E+05,       0.994107025256855122E+05,
+        0.994027916086733312E+05,       0.993951711926945572E+05,       0.993881049497915083E+05,       0.993818799057818542E+05,       0.993768025040628709E+05,
+        0.993745371453054540E+05,       0.993758273945832625E+05,       0.993797480709728989E+05,       0.993864179439653672E+05,       0.993959015946626314E+05,
+        0.994106666848780587E+05,       0.994280957797027659E+05,       0.994479062249146809E+05,       0.994699024606817256E+05,       0.994938326370272989E+05,
+        0.995193970618178137E+05,       0.995462575961586117E+05,       0.995732238058578514E+05,       0.995996836683722795E+05,       0.996264076540508540E+05,
+        0.996531520384603791E+05,       0.996796729134591151E+05,       0.997057352581914602E+05,       0.997311214531925361E+05,       0.997565307292698708E+05,
+        0.997809628500159452E+05,       0.998041926037547237E+05,       0.998260922842872533E+05,       0.998465616497438023E+05,       0.998655323213428928E+05,
+        0.998829702013785281E+05,       0.998988759405013552E+05,       0.999132835855504527E+05,       0.999267531384376343E+05,       0.999401187534305645E+05,
+        0.999522829859957856E+05,       0.999629705900948175E+05,       0.999720750719777716E+05,       0.999795225775888684E+05,       0.999852704402040836E+05,
+        0.999893033756584045E+05,       0.999916276698245056E+05,       0.999912215328864258E+05,       0.999874978505536856E+05,       0.999827294697511534E+05,
+        0.999772668831095216E+05,       0.999714403004270425E+05,       0.999655543840146129E+05,       0.999598844544293243E+05,       0.999546738384171913E+05,
+        0.999501503361758805E+05,       0.999464612795733119E+05,       0.999436472754112765E+05,       0.999417478240415512E+05,       0.999407845190346270E+05,
+        0.999407674168311496E+05,       0.999417003681598144E+05,       0.999435850419050112E+05,       0.999466778359479795E+05,       0.999509741170870548E+05,
+        0.999561184478715149E+05,       0.999620266396879451E+05,       0.999686260435519798E+05,       0.999758509523019893E+05,       0.999836356497705565E+05,
+        0.999919049957114039E+05,       0.100000562486864073E+06,       0.100011784952549118E+06,       0.100025750768122278E+06,       0.100039950549839836E+06,
+        0.100054145017178846E+06,       0.100068316891848794E+06,       0.100082450146767165E+06,       0.100096523400557431E+06,       0.100110501610887819E+06,
+        0.100124326095454249E+06,       0.100137903024072584E+06,       0.100153035210029513E+06,       0.100168028234449826E+06,       0.100182528489386037E+06,
+        0.100196311615898419E+06,       0.100209129758123207E+06,       0.100220714305906484E+06,       0.100227674075086179E+06,       0.100228582862959636E+06,
+        0.100228182141282334E+06,       0.100226441566948473E+06,       0.100223301716988630E+06,       0.100218680617939594E+06,       0.100212480375930187E+06,
+        0.100204593660852275E+06,       0.100193237399701000E+06,       0.100179608999797390E+06,       0.100163806561057383E+06,       0.100145763706322687E+06,
+        0.100124166108882637E+06,       0.100097853920290698E+06,       0.100069603397772837E+06,       0.100039598196173276E+06,       0.100008052525304520E+06,
+        0.999752085984543955E+05,       0.999413336779185047E+05,       0.999067168729345140E+05,       0.998716658233869821E+05,       0.998365033809807937E+05,
+        0.998015643788216548E+05,       0.997673503212209471E+05,       0.997368095318123815E+05,       0.997072417009385681E+05,       0.996789372306682053E+05,
+        0.996521942416031088E+05,       0.996273141486202512E+05,       0.996045978845247591E+05,       0.101067589111213412E+06,       0.101018770688517165E+06,
+        0.100968154311929655E+06,       0.100916004392167699E+06,       0.100862587963118029E+06,       0.100807829042751429E+06,       0.100751860689524168E+06,
+        0.100694824678955032E+06,       0.100636870575220571E+06,       0.100578085861079686E+06,       0.100518387120511878E+06,       0.100457910498338359E+06,
+        0.100396827710058526E+06,       0.100335334776766380E+06,       0.100273650785659062E+06,       0.100212016619918053E+06,       0.100150693670614579E+06,
+        0.100089962540906286E+06,       0.100030121749858867E+06,       0.999714864397286292E+05,       0.999143870864777564E+05,       0.998591682086720684E+05,
+        0.998061870647466858E+05,       0.997614041189860436E+05,       0.997232133410041570E+05,       0.996877601571912237E+05,       0.996550329117300425E+05,
+        0.996250097998356068E+05,       0.995976585142769036E+05,       0.995729358349222894E+05,       0.995507871467952355E+05,       0.995311458738776855E+05,
+        0.995139328178480646E+05,       0.994990553930397000E+05,       0.994864067510919558E+05,       0.994758647909620777E+05,       0.994662936172032933E+05,
+        0.994584116138104437E+05,       0.994520440064580325E+05,       0.994469670430250553E+05,       0.994429511205758317E+05,       0.994397638951787376E+05,
+        0.994371735196124209E+05,       0.994349519828108314E+05,       0.994328785098660155E+05,       0.994307429622300406E+05,       0.994283491541375697E+05,
+        0.994255179730021191E+05,       0.994164893114872393E+05,       0.994067289084808290E+05,       0.993968888922061742E+05,       0.993871232560968492E+05,
+        0.993776052903232921E+05,       0.993685268314349669E+05,       0.993600967438642401E+05,       0.993525384531912714E+05,       0.993461969112091901E+05,
+        0.993435709722199681E+05,       0.993430289823759958E+05,       0.993448240458555374E+05,       0.993518125064813066E+05,       0.993620332314667612E+05,
+        0.993746322170980275E+05,       0.993895541802843509E+05,       0.994066995366652700E+05,       0.994259271220238734E+05,       0.994470579336317896E+05,
+        0.994698797554098419E+05,       0.994941524985713913E+05,       0.995196140617028141E+05,       0.995459864926176379E+05,       0.995729822203312797E+05,
+        0.996003101205446874E+05,       0.996273070851956145E+05,       0.996547798040555062E+05,       0.996819738131592894E+05,       0.997085378998868837E+05,
+        0.997343278080748278E+05,       0.997592022275180498E+05,       0.997830289890008135E+05,       0.998056904289906088E+05,       0.998270877683784638E+05,
+        0.998471443932554248E+05,       0.998658079734391795E+05,       0.998830514038870024E+05,       0.998996025676379795E+05,       0.999153229697452334E+05,
+        0.999295566639472963E+05,       0.999422722019988432E+05,       0.999534500054842792E+05,       0.999630795823789667E+05,       0.999711562553596450E+05,
+        0.999776774721563124E+05,       0.999826387612595136E+05,       0.999854644320731022E+05,       0.999828794177739328E+05,       0.999789847225893318E+05,
+        0.999739838414557307E+05,       0.999680998532223457E+05,       0.999615553821963986E+05,       0.999545658866950980E+05,       0.999473341203756863E+05,
+        0.999400456392968772E+05,       0.999327953721481608E+05,       0.999256989141568774E+05,       0.999189700236989156E+05,       0.999127048128768074E+05,
+        0.999069798769329791E+05,       0.999018544683639047E+05,       0.998973722234758170E+05,       0.998935621850836178E+05,       0.998904388907014218E+05,
+        0.998896448727687675E+05,       0.998900344972452294E+05,       0.998911970826382749E+05,       0.998931396187662176E+05,       0.998958769268335309E+05,
+        0.998994275255013781E+05,       0.999038084460577520E+05,       0.999090289824781794E+05,       0.999150833667861443E+05,       0.999217240524284571E+05,
+        0.999282473433497362E+05,       0.999348833579850179E+05,       0.999415375242985901E+05,       0.999481154404054105E+05,       0.999545171017064131E+05,
+        0.999606302661866066E+05,       0.999663230149861483E+05,       0.999714356178636663E+05,       0.999757718627941504E+05,       0.999790900530105428E+05,
+        0.999810939111108019E+05,       0.999819561511524662E+05,       0.999789948862129386E+05,       0.999752827398946683E+05,       0.999708888630344300E+05,
+        0.999658466886194801E+05,       0.999601566475907457E+05,       0.999537895884533064E+05,       0.999466907368066168E+05,       0.999387840276392963E+05,
+        0.999299766462147236E+05,       0.999201636218782805E+05,       0.999092323322767916E+05,       0.998970667923400615E+05,       0.998831789013588714E+05,
+        0.998636939941647142E+05,       0.998431119746374316E+05,       0.998214963412640354E+05,       0.997970862666926550E+05,       0.997712444170942908E+05,
+        0.997445906917362154E+05,       0.997173029439411330E+05,       0.996895795051780588E+05,       0.996616375682111830E+05,       0.996337113354519679E+05,
+        0.996060500180081726E+05,       0.995789157595469587E+05,       0.995557562522905791E+05,       0.995337048495515774E+05,       0.995126888312002120E+05,
+        0.994929130817774712E+05,       0.994745951235418033E+05,       0.994579612022724759E+05,       0.994432427594338078E+05,       0.101021034351216382E+06,
+        0.100974523158164724E+06,       0.100926407272977900E+06,       0.100876804093661282E+06,       0.100825841471867636E+06,       0.100773656698396328E+06,
+        0.100720395485641522E+06,       0.100666210969990992E+06,       0.100612099345619077E+06,       0.100557249279083626E+06,       0.100501677971650905E+06,
+        0.100445572670880414E+06,       0.100389253853780203E+06,       0.100332968905338319E+06,       0.100276665148379936E+06,       0.100220537893264976E+06,
+        0.100164799821054621E+06,       0.100109679736971462E+06,       0.100055421257730064E+06,       0.100002281430952105E+06,       0.999505292822571937E+05,
+        0.999004442827473104E+05,       0.998530843548639095E+05,       0.998156761219489854E+05,       0.997805278523404413E+05,       0.997476323427424795E+05,
+        0.997169731242686539E+05,       0.996885239311042969E+05,       0.996622481616842706E+05,       0.996380983225617529E+05,       0.996160154459489713E+05,
+        0.995959284728124476E+05,       0.995777535943772964E+05,       0.995613935458951310E+05,       0.995467368475156691E+05,       0.995336569880241732E+05,
+        0.995208266243795515E+05,       0.995087482639954542E+05,       0.994977965334250039E+05,       0.994878249241337762E+05,       0.994786826211323350E+05,
+        0.994702168427006691E+05,       0.994622751834644587E+05,       0.994547079083998542E+05,       0.994473701327138842E+05,       0.994401238077413873E+05,
+        0.994328394160198222E+05,       0.994254188335577346E+05,       0.994184404922492249E+05,       0.994087127432848210E+05,       0.993987930235803360E+05,
+        0.993894574291334138E+05,       0.993808966627234331E+05,       0.993733080854502186E+05,       0.993668924009867187E+05,       0.993618498078672274E+05,
+        0.993583756460734730E+05,       0.993566555807828554E+05,       0.993568603838800627E+05,       0.993591403923829785E+05,       0.993636197419046657E+05,
+        0.993703904921866488E+05,       0.993811197203903430E+05,       0.993950856599565304E+05,       0.994111457979586703E+05,       0.994291602554974379E+05,
+        0.994489675444759632E+05,       0.994703876196585625E+05,       0.994932253351752443E+05,       0.995172741944998997E+05,       0.995426559018634871E+05,
+        0.995694776827033347E+05,       0.995970389008766942E+05,       0.996251091056232981E+05,       0.996534496905636333E+05,       0.996818187512539298E+05,
+        0.997099760279327893E+05,       0.997374141751707793E+05,       0.997622618739524623E+05,       0.997862435467323085E+05,       0.998092414887019404E+05,
+        0.998311505958143825E+05,       0.998518805596518214E+05,       0.998718102890837035E+05,       0.998910750046514877E+05,       0.999090219912788452E+05,
+        0.999255559670365765E+05,       0.999405919139345788E+05,       0.999540538378546335E+05,       0.999658730563341524E+05,       0.999759860512857849E+05,
+        0.999843319314751134E+05,       0.999908495555851987E+05,       0.999954743712658383E+05,       0.999944404784162907E+05,       0.999915968456238916E+05,
+        0.999872439634975599E+05,       0.999816171531630534E+05,       0.999749362615833961E+05,       0.999674042229870247E+05,       0.999592064518093102E+05,
+        0.999505109123499715E+05,       0.999414687118180882E+05,       0.999323665105546679E+05,       0.999233975283402833E+05,       0.999144981369005836E+05,
+        0.999058003303556034E+05,       0.998974241845954093E+05,       0.998894782591478870E+05,       0.998820595750179200E+05,       0.998752530846157169E+05,
+        0.998691305778080132E+05,       0.998637489957377547E+05,       0.998586746844062873E+05,       0.998541772928227729E+05,       0.998502966627068381E+05,
+        0.998469966131329420E+05,       0.998442320106148400E+05,       0.998419453691209637E+05,       0.998400626589490130E+05,       0.998384883490106731E+05,
+        0.998370997211475333E+05,       0.998357405118142487E+05,       0.998339247931384743E+05,       0.998316580178510631E+05,       0.998293639855545480E+05,
+        0.998269017565975373E+05,       0.998241201967542729E+05,       0.998208528853709577E+05,       0.998098081032783375E+05,       0.997954370825381193E+05,
+        0.997808296869748592E+05,       0.997662255405725009E+05,       0.997518145513712225E+05,       0.997377288090598740E+05,       0.997240360167264153E+05,
+        0.997115902471897134E+05,       0.997002807779587602E+05,       0.996889928911353927E+05,       0.996776906921413611E+05,       0.996663184120892256E+05,
+        0.996548031405013462E+05,       0.996430577981460665E+05,       0.996309842516777717E+05,       0.996172720856796950E+05,       0.995989960463366879E+05,
+        0.995803026148819772E+05,       0.995612677891255880E+05,       0.995419614978694444E+05,       0.995224517021402135E+05,       0.995028080337064894E+05,
+        0.994831049415358284E+05,       0.994634243322594411E+05,       0.994438577049017331E+05,       0.994245077928505052E+05,       0.994054897371244297E+05,
+        0.993869318243143207E+05,       0.993690043020055746E+05,       0.993554308490509575E+05,       0.993412332136938494E+05,       0.993276308539287711E+05,
+        0.993151162456799066E+05,       0.993038276851009432E+05,       0.992939167429839872E+05,       0.992855451787946949E+05,       0.992788820449725754E+05,
+        0.100964847544612581E+06,       0.100921528597807934E+06,       0.100876819617514033E+06,       0.100830819119977881E+06,       0.100783635790840315E+06,
+        0.100735387872604493E+06,       0.100686849362626730E+06,       0.100638850722815405E+06,       0.100589987206303587E+06,       0.100540391690949080E+06,
+        0.100490207838124057E+06,       0.100439589213655403E+06,       0.100388698427470110E+06,       0.100337706295036201E+06,       0.100286791022897989E+06,
+        0.100236137419730803E+06,       0.100185936133379830E+06,       0.100136382913311769E+06,       0.100087677896791603E+06,       0.100040024915916016E+06,
+        0.999936308213850425E+05,       0.999487048175969685E+05,       0.999098959263045108E+05,       0.998760905821691704E+05,       0.998440744381323602E+05,
+        0.998138388707919803E+05,       0.997853639904371375E+05,       0.997586190608742472E+05,       0.997335630315415328E+05,       0.997101451748205582E+05,
+        0.996883058208672010E+05,       0.996679771815481945E+05,       0.996490842541338643E+05,       0.996315457942174835E+05,       0.996152753458579973E+05,
+        0.996001823151213321E+05,       0.995855679555827810E+05,       0.995705558364965109E+05,       0.995563634129148850E+05,       0.995429286082849721E+05,
+        0.995301928975228802E+05,       0.995181034121451230E+05,       0.995066149374921079E+05,       0.994956917495421949E+05,       0.994853092368055950E+05,
+        0.994754552514231473E+05,       0.994661311329740856E+05,       0.994573523487461207E+05,       0.994491486954472930E+05,       0.994415640096655407E+05,
+        0.994332401191460376E+05,       0.994242851325149240E+05,       0.994162875697421550E+05,       0.994093942955236271E+05,       0.994037502528714977E+05,
+        0.993994957235938200E+05,       0.993967633485402912E+05,       0.993956749460767023E+05,       0.993963381773120200E+05,       0.993988431167032832E+05,
+        0.994032587965396087E+05,       0.994096298031491460E+05,       0.994179730111528625E+05,       0.994282745493404218E+05,       0.994404870973938814E+05,
+        0.994568186139204772E+05,       0.994754658271223161E+05,       0.994958964449326450E+05,       0.995177045414582390E+05,       0.995407458140571835E+05,
+        0.995648609237595665E+05,       0.995898777201360062E+05,       0.996156137473152776E+05,       0.996418789751202567E+05,       0.996684786927591776E+05,
+        0.996952164972683240E+05,       0.997218973051197536E+05,       0.997483303132390720E+05,       0.997743318352098577E+05,       0.997997279397391831E+05,
+        0.998243568215117266E+05,       0.998484029817739647E+05,       0.998715185643880104E+05,       0.998929709407826740E+05,       0.999121391071011894E+05,
+        0.999300598538423073E+05,       0.999466118827012979E+05,       0.999616803026846756E+05,       0.999751558213879034E+05,       0.999869336418048333E+05,
+        0.999969120922718139E+05,       0.100004991024896648E+06,       0.100011070025070803E+06,       0.100011361902027944E+06,       0.100009689874259901E+06,
+        0.100006354866167210E+06,       0.100001521961853068E+06,       0.999953569047140481E+05,       0.999880229251482233E+05,       0.999796782529097254E+05,
+        0.999704742484093149E+05,       0.999605540801449097E+05,       0.999500518713602651E+05,       0.999395620634615480E+05,       0.999293797224061564E+05,
+        0.999189780037119199E+05,       0.999084634603603772E+05,       0.998979305732036155E+05,       0.998874607924644370E+05,       0.998771215026191203E+05,
+        0.998669648551638238E+05,       0.998570264274643996E+05,       0.998473236800365266E+05,       0.998378541987464268E+05,       0.998280094515223464E+05,
+        0.998183015118441253E+05,       0.998087584599398106E+05,       0.997993088922536845E+05,       0.997898632369703118E+05,       0.997803110261358233E+05,
+        0.997705176970055909E+05,       0.997603209573400527E+05,       0.997495267616314668E+05,       0.997338504371996823E+05,       0.997144148866953765E+05,
+        0.996946194589021616E+05,       0.996748889962201501E+05,       0.996543973099300492E+05,       0.996333799061114987E+05,       0.996120632551793096E+05,
+        0.995906575155593600E+05,       0.995693496108486434E+05,       0.995482968337894126E+05,       0.995276211300861032E+05,       0.995074041910853848E+05,
+        0.994876834578204434E+05,       0.994684491110481467E+05,       0.994496420937635121E+05,       0.994311531852242333E+05,       0.994128231195840344E+05,
+        0.993950629246981553E+05,       0.993796705843183881E+05,       0.993609699415756186E+05,       0.993418055421917088E+05,       0.993226794637357671E+05,
+        0.993037059687493893E+05,       0.992849845648908376E+05,       0.992666033190360467E+05,       0.992486420429716236E+05,       0.992311752996093419E+05,
+        0.992142751883332967E+05,       0.991980138777397078E+05,       0.991824658634138323E+05,       0.991677099373037345E+05,       0.991538308635238063E+05,
+        0.991409207629147422E+05,       0.991303845164175582E+05,       0.991233478553789610E+05,       0.991173123854586884E+05,       0.991122941300806997E+05,
+        0.991083274217430298E+05,       0.991054636978437338E+05,       0.991037699911700765E+05,       0.991033272031231463E+05,       0.991042282352598704E+05,
+        0.991065760427079076E+05,       0.100899327711180042E+06,       0.100860014589195416E+06,       0.100819531202107522E+06,       0.100777959510744709E+06,
+        0.100735390607726556E+06,       0.100694036465613695E+06,       0.100652089405901919E+06,       0.100609367247066592E+06,       0.100565963600471325E+06,
+        0.100521982301190656E+06,       0.100477536683349797E+06,       0.100432748853070138E+06,       0.100387748961175384E+06,       0.100342674477306704E+06,
+        0.100297669466538631E+06,       0.100252883868987425E+06,       0.100208472782261073E+06,       0.100164595745919316E+06,       0.100121416026401625E+06,
+        0.100079099900142377E+06,       0.100037815931840771E+06,       0.999981416469988617E+05,       0.999662389876496309E+05,       0.999356748708466621E+05,
+        0.999064575822306797E+05,       0.998785877324428584E+05,       0.998520583580002858E+05,       0.998268551135048328E+05,       0.998029565487271466E+05,
+        0.997803344633126544E+05,       0.997589543309666333E+05,       0.997387757839643018E+05,       0.997197531476882141E+05,       0.997018360135869007E+05,
+        0.996849698374662257E+05,       0.996690965483438340E+05,       0.996541551512074802E+05,       0.996382689559327409E+05,       0.996225861026435014E+05,
+        0.996075569737299666E+05,       0.995931690202676109E+05,       0.995794128974490304E+05,       0.995662834351470083E+05,       0.995537804808199580E+05,
+        0.995419095816340414E+05,       0.995306824727639178E+05,       0.995201173394836951E+05,       0.995102388219246932E+05,       0.995010777333177539E+05,
+        0.994926704652096669E+05,       0.994850580565927958E+05,       0.994782849081547320E+05,       0.994712945317966660E+05,       0.994652135801002441E+05,
+        0.994603804881314572E+05,       0.994568932856863394E+05,       0.994548423780885496E+05,       0.994543085284921108E+05,       0.994553608083860745E+05,
+        0.994580545552721160E+05,       0.994624293810699601E+05,       0.994689205148530309E+05,       0.994771599445407046E+05,       0.994871232315969537E+05,
+        0.994987933987223369E+05,       0.995121358180468815E+05,       0.995270974554495333E+05,       0.995436065119199775E+05,       0.995623452046183083E+05,
+        0.995829609157189843E+05,       0.996045871363499173E+05,       0.996270734208106005E+05,       0.996502628846515872E+05,       0.996739938804089179E+05,
+        0.996981017517049913E+05,       0.997224206254554738E+05,       0.997467852001343563E+05,       0.997710324871725461E+05,       0.997951466602976434E+05,
+        0.998195365345201863E+05,       0.998432686447168817E+05,       0.998661797675172566E+05,       0.998881192989034753E+05,       0.999089497794278432E+05,
+        0.999285470134942298E+05,       0.999467997752335650E+05,       0.999636091025751084E+05,       0.999788871899545629E+05,       0.999925558984901872E+05,
+        0.100004544910230834E+06,       0.100014789560105870E+06,       0.100022807416958167E+06,       0.100024265952704969E+06,       0.100023783498597622E+06,
+        0.100021339437537274E+06,       0.100017269778783608E+06,       0.100011871918673860E+06,       0.100005243624383627E+06,       0.999974886843563872E+05,
+        0.999887143337349553E+05,       0.999790290942598513E+05,       0.999685409989449690E+05,       0.999573561671147618E+05,       0.999457665900857537E+05,
+        0.999339297350767738E+05,       0.999216537925987359E+05,       0.999089986755408318E+05,       0.998960156700364460E+05,       0.998827458376240684E+05,
+        0.998692184851955972E+05,       0.998554496711306274E+05,       0.998414407220986322E+05,       0.998266607131311466E+05,       0.998100194463602238E+05,
+        0.997926225952954846E+05,       0.997741943883323111E+05,       0.997546758201429911E+05,       0.997340957313024119E+05,       0.997124527623238246E+05,
+        0.996897658681415196E+05,       0.996660748766462057E+05,       0.996414402768971777E+05,       0.996159421531026164E+05,       0.995896781945527619E+05,
+        0.995627607309631567E+05,       0.995353127665240754E+05,       0.995074630135256157E+05,       0.994793399566985754E+05,       0.994514054125879338E+05,
+        0.994238487412724935E+05,       0.993966902679466439E+05,       0.993700475395201356E+05,       0.993440177799105440E+05,       0.993186743649216805E+05,
+        0.992940638036397431E+05,       0.992702032829608506E+05,       0.992470788181921816E+05,       0.992246440384727030E+05,       0.992011645870204229E+05,
+        0.991746701100545615E+05,       0.991489545634662645E+05,       0.991241218039765226E+05,       0.991002500071589602E+05,       0.990773923979805404E+05,
+        0.990555784783537238E+05,       0.990348157029355934E+05,       0.990159736965085758E+05,       0.989981835313982592E+05,       0.989814199610305950E+05,
+        0.989657585620708269E+05,       0.989512713805230014E+05,       0.989380287548638735E+05,       0.989261010103145527E+05,       0.989155600070171640E+05,
+        0.989065271083586849E+05,       0.989035472935256403E+05,       0.989017382893972535E+05,       0.989010885106625501E+05,       0.989015950018414442E+05,
+        0.989032643180148880E+05,       0.989061129372854630E+05,       0.989101672753579624E+05,       0.989154633681022387E+05,       0.989220462827519368E+05,
+        0.989299693127524224E+05,       0.989392930054068274E+05,       0.100824204136130124E+06,       0.100789629875414903E+06,       0.100754101269738283E+06,
+        0.100718965766187423E+06,       0.100683784943369043E+06,       0.100647901733698469E+06,       0.100611367338035154E+06,       0.100574242617115160E+06,
+        0.100536597536512694E+06,       0.100498510595931759E+06,       0.100460068244709808E+06,       0.100421364285146075E+06,       0.100382499264969942E+06,
+        0.100343579859943900E+06,       0.100304718247249199E+06,       0.100266031469940950E+06,       0.100227640792377366E+06,       0.100189671046138596E+06,
+        0.100152249965554060E+06,       0.100115507511560325E+06,       0.100079575182221481E+06,       0.100047602801154819E+06,       0.100019322376832803E+06,
+        0.999920409995853261E+05,       0.999657674355637573E+05,       0.999405058915761474E+05,       0.999162559646318405E+05,       0.998930126550737332E+05,
+        0.998707664374257292E+05,       0.998495033822863334E+05,       0.998292053217475768E+05,       0.998098500498988724E+05,       0.997914115489896358E+05,
+        0.997738602307620895E+05,       0.997571631813267886E+05,       0.997412843967411318E+05,       0.997261849951640761E+05,       0.997116241750995250E+05,
+        0.996956516613714484E+05,       0.996802443385057850E+05,       0.996654141346137912E+05,       0.996511746410201595E+05,       0.996375414807133056E+05,
+        0.996245325880948803E+05,       0.996121683814974822E+05,       0.996004718105865177E+05,       0.995894682617738144E+05,       0.995791853061816655E+05,
+        0.995696522765213740E+05,       0.995608996615122596E+05,       0.995529583091799286E+05,       0.995458584335334599E+05,       0.995396284227406868E+05,
+        0.995343367855710967E+05,       0.995305561580702051E+05,       0.995281233336275036E+05,       0.995270277929425938E+05,       0.995273063084702299E+05,
+        0.995289897428417025E+05,       0.995321019769720151E+05,       0.995366588694784150E+05,       0.995426672761023801E+05,       0.995501241589093697E+05,
+        0.995590158153962548E+05,       0.995693172571642208E+05,       0.995809917664462992E+05,       0.995939906564428093E+05,       0.996082532580851985E+05,
+        0.996237071514999261E+05,       0.996402686551040679E+05,       0.996578435789826035E+05,       0.996763282420650648E+05,       0.996956299728876329E+05,
+        0.997162410862197139E+05,       0.997372387307632453E+05,       0.997586353656998253E+05,       0.997808433601890720E+05,       0.998030187608370179E+05,
+        0.998249872889569233E+05,       0.998465794208683947E+05,       0.998676313277232548E+05,       0.998879856224390824E+05,       0.999074918951320724E+05,
+        0.999260070231147402E+05,       0.999433952465451439E+05,       0.999595280060564692E+05,       0.999742835440646595E+05,       0.999875462768208236E+05,
+        0.999992059495608264E+05,       0.100009156592205647E+06,       0.100016063172606460E+06,       0.100019024917317467E+06,       0.100020084175617667E+06,
+        0.100019327613303438E+06,       0.100016848817808917E+06,       0.100012745044390162E+06,       0.100007114161981110E+06,       0.100000051820447916E+06,
+        0.999916488518789411E+05,       0.999819889104085451E+05,       0.999711463483044645E+05,       0.999591843210265215E+05,       0.999461531109617499E+05,
+        0.999321525809828890E+05,       0.999172469778668019E+05,       0.999013989306642325E+05,       0.998846455567706289E+05,       0.998670119376398798E+05,
+        0.998485130268999492E+05,       0.998291555936072982E+05,       0.998089401641651202E+05,       0.997878629283593327E+05,       0.997659175757975609E+05,
+        0.997430970289848337E+05,       0.997193950386116485E+05,       0.996948076057053986E+05,       0.996688019987970183E+05,       0.996412728663371527E+05,
+        0.996128531282160839E+05,       0.995835822131826571E+05,       0.995535100083936413E+05,       0.995226963046177698E+05,       0.994912096890770918E+05,
+        0.994591258685886423E+05,       0.994265254172218556E+05,       0.993934909557864739E+05,       0.993601037847762636E+05,       0.993264400074980804E+05,
+        0.992925661955399555E+05,       0.992585346639741329E+05,       0.992243784382298763E+05,       0.991926785386021656E+05,       0.991631423960881948E+05,
+        0.991346701590620942E+05,       0.991043957205902552E+05,       0.990738404866020282E+05,       0.990437385072277393E+05,       0.990142493709584378E+05,
+        0.989855195191612147E+05,       0.989576810877346288E+05,       0.989308511084253696E+05,       0.989051310684979690E+05,       0.988806068206827622E+05,
+        0.988573488291608082E+05,       0.988354127318868268E+05,       0.988148401948802202E+05,       0.987956600302788138E+05,       0.987778895469693816E+05,
+        0.987615361004738952E+05,       0.987465988074585912E+05,       0.987330703896907362E+05,       0.987209391124356771E+05,       0.987108234055703360E+05,
+        0.987097019913824042E+05,       0.987103429529451387E+05,       0.987122111650228762E+05,       0.987153073516145814E+05,       0.987196321217762743E+05,
+        0.987251875827369804E+05,       0.987319785667343094E+05,       0.987400135082831985E+05,       0.987493050090511242E+05,       0.987598701271371101E+05,
+        0.987717304264797713E+05,       0.987849118205066625E+05,       0.987994442421061685E+05,       0.100725315299336173E+06,       0.100698574995327697E+06,
+        0.100671977068823689E+06,       0.100644595052366465E+06,       0.100616468093977863E+06,       0.100587642901921921E+06,       0.100558173361375360E+06,
+        0.100528120104899528E+06,       0.100497550042423565E+06,       0.100466272904751735E+06,       0.100434015096099785E+06,       0.100401562459773442E+06,
+        0.100368989820934105E+06,       0.100336376879503077E+06,       0.100303807689072302E+06,       0.100271370122519947E+06,       0.100239155324566673E+06,
+        0.100207257151323618E+06,       0.100175771596705425E+06,       0.100144796205413048E+06,       0.100114429472040734E+06,       0.100088940515445298E+06,
+        0.100064277849083956E+06,       0.100040376776062651E+06,       0.100017243413296688E+06,       0.999948816446533019E+05,       0.999732929686431889E+05,
+        0.999524763863759727E+05,       0.999324283249947912E+05,       0.999131425911760016E+05,       0.998946103486297798E+05,       0.998768201128693472E+05,
+        0.998597577558295598E+05,       0.998434065122163738E+05,       0.998277469787591108E+05,       0.998127570968272776E+05,       0.997984121081719059E+05,
+        0.997846844728672440E+05,       0.997711641937448148E+05,       0.997562547182444541E+05,       0.997418715469619347E+05,       0.997280378138771339E+05,
+        0.997149197421024874E+05,       0.997024870178837737E+05,       0.996907061322415975E+05,       0.996795848806745926E+05,       0.996691347733205621E+05,
+        0.996593714260480774E+05,       0.996503148183509184E+05,       0.996419894088608416E+05,       0.996344241017298482E+05,       0.996276520598402276E+05,
+        0.996217103637612599E+05,       0.996166395185360743E+05,       0.996124828137155564E+05,       0.996092855454927922E+05,       0.996072490608482622E+05,
+        0.996076113749229989E+05,       0.996091697144805221E+05,       0.996119324075692421E+05,       0.996159015340781625E+05,       0.996210724174448842E+05,
+        0.996274331797853811E+05,       0.996349643746027868E+05,       0.996436387104583700E+05,       0.996534208777727908E+05,       0.996642674892599607E+05,
+        0.996761271423777071E+05,       0.996889406096304010E+05,       0.997026411596077960E+05,       0.997171550083373149E+05,       0.997324018969322351E+05,
+        0.997493713951271493E+05,       0.997669298086039198E+05,       0.997847561118552549E+05,       0.998027246306509041E+05,       0.998207116516734968E+05,
+        0.998385964503245486E+05,       0.998562622533936083E+05,       0.998740649961419404E+05,       0.998916906165886030E+05,       0.999087089343172702E+05,
+        0.999249770553750277E+05,       0.999403560696216737E+05,       0.999547111717594089E+05,       0.999679116588610341E+05,       0.999798308071318752E+05,
+        0.999903456338236865E+05,       0.999993365533926699E+05,       0.100004220125714884E+06,       0.100007207317976179E+06,       0.100008572293640507E+06,
+        0.100008322094038289E+06,       0.100006474067698131E+06,       0.100003053654514384E+06,       0.999980922203631635E+05,       0.999916249686873634E+05,
+        0.999836889524048456E+05,       0.999743212064066029E+05,       0.999635570180646901E+05,       0.999514283507113723E+05,       0.999379624331032392E+05,
+        0.999231805265346338E+05,       0.999068710521996836E+05,       0.998889830637409177E+05,       0.998698844492443604E+05,       0.998496268247692351E+05,
+        0.998282550606056902E+05,       0.998058081407207792E+05,       0.997823201056188700E+05,       0.997578210428315797E+05,       0.997323380908236431E+05,
+        0.997058964236216998E+05,       0.996785201849737350E+05,       0.996502333423933014E+05,       0.996210604331023060E+05,       0.995910271757503942E+05,
+        0.995601609239409008E+05,       0.995275572850741737E+05,       0.994942010526460217E+05,       0.994602086162104097E+05,       0.994256424562004540E+05,
+        0.993905674250224547E+05,       0.993550495610398939E+05,       0.993191545857771562E+05,       0.992829460972773086E+05,       0.992464834802344849E+05,
+        0.992093627746182028E+05,       0.991704192318807618E+05,       0.991313574404489191E+05,       0.990923405318182195E+05,       0.990535358095906413E+05,
+        0.990151121756168286E+05,       0.989772373919561505E+05,       0.989400752255912812E+05,       0.989077617710938066E+05,       0.988763612273478793E+05,
+        0.988459508623079601E+05,       0.988166439660097676E+05,       0.987885464355162840E+05,       0.987617561295779306E+05,       0.987363624383705755E+05,
+        0.987124460655073344E+05,       0.986900790161369223E+05,       0.986693247818405216E+05,       0.986502387102765642E+05,       0.986328685451310157E+05,
+        0.986172551199377485E+05,       0.986034331877511868E+05,       0.985914323674813641E+05,       0.985849022212989948E+05,       0.985815381689221977E+05,
+        0.985799833097597439E+05,       0.985801745721993211E+05,       0.985820463347552868E+05,       0.985855324877461535E+05,       0.985905682465279388E+05,
+        0.985970917144189152E+05,       0.986050451971537113E+05,       0.986143762739106751E+05,       0.986250386326789885E+05,       0.986369926800004905E+05,
+        0.986502059369656636E+05,       0.986646532347960892E+05,       0.986803686823803437E+05,       0.986978893846687570E+05,       0.100614832696455240E+06,
+        0.100593867821148029E+06,       0.100572316446986515E+06,       0.100550197550235505E+06,       0.100527535703133908E+06,       0.100504360904461792E+06,
+        0.100480708372667563E+06,       0.100456618304392017E+06,       0.100432135601374786E+06,       0.100407309568833982E+06,       0.100382193588466369E+06,
+        0.100356844769226343E+06,       0.100331323579001226E+06,       0.100305693460217895E+06,       0.100280020432285120E+06,       0.100254372683605921E+06,
+        0.100228820155686772E+06,       0.100203434121630358E+06,       0.100178286761032883E+06,       0.100153450733022924E+06,       0.100130475669895299E+06,
+        0.100109956889046269E+06,       0.100089889070985242E+06,       0.100070296914338702E+06,       0.100051202164876013E+06,       0.100032623579079911E+06,
+        0.100014576934231576E+06,       0.999970750815462088E+05,       0.999801280379814852E+05,       0.999637431114950741E+05,       0.999479250537698827E+05,
+        0.999326762337752152E+05,       0.999179968250171223E+05,       0.999038849989644077E+05,       0.998903371169458405E+05,       0.998773479128125327E+05,
+        0.998649106588674185E+05,       0.998530173079915839E+05,       0.998416586055586959E+05,       0.998308241656294995E+05,       0.998183931314519723E+05,
+        0.998063026544255990E+05,       0.997946768033270637E+05,       0.997835353574148758E+05,       0.997728988116216497E+05,       0.997627886474906263E+05,
+        0.997532275467060972E+05,       0.997442395412217011E+05,       0.997358500950898597E+05,       0.997280861143391958E+05,       0.997209758826208854E+05,
+        0.997145489218259900E+05,       0.997088357784521941E+05,       0.997038677381365414E+05,       0.996996764724488748E+05,       0.996962936237215035E+05,
+        0.996937503353465436E+05,       0.996920767365576030E+05,       0.996913013921977254E+05,       0.996914507293131610E+05,       0.996938892044791864E+05,
+        0.996979235599974199E+05,       0.997029058021154924E+05,       0.997088141832942201E+05,       0.997156214047231770E+05,       0.997232945456081070E+05,
+        0.997317950535919081E+05,       0.997416867970129533E+05,       0.997530959050235106E+05,       0.997652059203542885E+05,       0.997779192013086576E+05,
+        0.997911354948921798E+05,       0.998047524629107502E+05,       0.998186662279794255E+05,       0.998327719289349043E+05,       0.998469642740837880E+05,
+        0.998611380798811879E+05,       0.998751887820599950E+05,       0.998890129059611209E+05,       0.999025084828911640E+05,       0.999155753997843713E+05,
+        0.999281156702924636E+05,       0.999400336166881025E+05,       0.999512359536410950E+05,       0.999616317670096760E+05,       0.999711323832548660E+05,
+        0.999796511279028782E+05,       0.999849269357346784E+05,       0.999879656837563089E+05,       0.999896251175745128E+05,       0.999900253003605030E+05,
+        0.999893361854775139E+05,       0.999873542140159407E+05,       0.999840556297011499E+05,       0.999794245840091753E+05,       0.999734518744631496E+05,
+        0.999661337157758971E+05,       0.999574705623641785E+05,       0.999474659997932467E+05,       0.999361257217314414E+05,       0.999234566080410732E+05,
+        0.999094659187412326E+05,       0.998941606177814683E+05,       0.998764809352623415E+05,       0.998560560817922524E+05,       0.998343967946635821E+05,
+        0.998115510889874568E+05,       0.997875653304692096E+05,       0.997624843255732849E+05,       0.997363514996802405E+05,       0.997092091386610118E+05,
+        0.996810986700549984E+05,       0.996520609610099054E+05,       0.996221366113048280E+05,       0.995913662211383053E+05,       0.995597906149207993E+05,
+        0.995273916799414146E+05,       0.994941482859833632E+05,       0.994601365478679945E+05,       0.994253058448178053E+05,       0.993891469979643734E+05,
+        0.993522589965478983E+05,       0.993147135957212886E+05,       0.992765913082987827E+05,       0.992379812368316198E+05,       0.991989807125657680E+05,
+        0.991596947441791563E+05,       0.991202352822574612E+05,       0.990807203086648369E+05,       0.990412727632243623E+05,       0.990020193233719183E+05,
+        0.989630890556004597E+05,       0.989246119604841224E+05,       0.988867174357804033E+05,       0.988495326844704396E+05,       0.988131810965392942E+05,
+        0.987777806347563455E+05,       0.987434422556348145E+05,       0.987102683970903163E+05,       0.986800386904530314E+05,       0.986539370199152036E+05,
+        0.986295226205249346E+05,       0.986068636404624995E+05,       0.985860239517589507E+05,       0.985670631337701197E+05,       0.985500365691113984E+05,
+        0.985358556718200416E+05,       0.985278808654735767E+05,       0.985216145256253949E+05,       0.985170549437755544E+05,       0.985141907191163773E+05,
+        0.985130023621957516E+05,       0.985134638334888878E+05,       0.985155439987927239E+05,       0.985192079865073320E+05,       0.985244184348827694E+05,
+        0.985311366201568162E+05,       0.985393234591571963E+05,       0.985489403823850007E+05,       0.985599500758101349E+05,       0.985723170916025701E+05,
+        0.985860083297847013E+05,       0.986009933943283249E+05,       0.986172448285415594E+05,       0.986347382357068564E+05,       0.986534522918489238E+05,
+        0.100501068864754794E+06,       0.100484535396120875E+06,       0.100467601980879481E+06,       0.100450280398188552E+06,       0.100432586236747622E+06,
+        0.100414538813697291E+06,       0.100396161067221547E+06,       0.100377479424244724E+06,       0.100358523644725865E+06,       0.100339326644139262E+06,
+        0.100319924295798162E+06,       0.100300355214719486E+06,       0.100280660524754756E+06,       0.100260883610713514E+06,       0.100241069857193317E+06,
+        0.100221266375801104E+06,       0.100201521722408346E+06,       0.100181885606032156E+06,       0.100162408590875246E+06,       0.100143141793000657E+06,
+        0.100126731204709198E+06,       0.100111095964644017E+06,       0.100095755686584438E+06,       0.100080729264227775E+06,       0.100066034373636823E+06,
+        0.100051687390123538E+06,       0.100037703324969872E+06,       0.100024095780550211E+06,       0.100010876922054129E+06,       0.999980574636844394E+05,
+        0.999856466669404908E+05,       0.999736523483940109E+05,       0.999620808942374570E+05,       0.999509372788386972E+05,       0.999402250845782837E+05,
+        0.999299465203828877E+05,       0.999201024366045604E+05,       0.999106923342315858E+05,       0.999017143668564822E+05,       0.998931653343625367E+05,
+        0.998850406679233711E+05,       0.998765024783978733E+05,       0.998667989571770595E+05,       0.998574263414941233E+05,       0.998484104846885893E+05,
+        0.998397772139483568E+05,       0.998315523922983994E+05,       0.998237619509676297E+05,       0.998164318901620281E+05,       0.998095882469221542E+05,
+        0.998032570294378238E+05,       0.997974641179290484E+05,       0.997922351329589583E+05,       0.997875952728177945E+05,       0.997835691223818721E+05,
+        0.997801804366022552E+05,       0.997774519024890033E+05,       0.997754048841174226E+05,       0.997740591557720181E+05,       0.997734326288465818E+05,
+        0.997735410785172280E+05,       0.997747073495277582E+05,       0.997769755457649590E+05,       0.997800038461367949E+05,       0.997839110555756342E+05,
+        0.997903666077980015E+05,       0.997975557260811329E+05,       0.998054075409305369E+05,       0.998138481350147340E+05,       0.998228007968337915E+05,
+        0.998321862933507946E+05,       0.998419231581400672E+05,       0.998519279910743644E+05,       0.998621157651026879E+05,       0.998724001352771593E+05,
+        0.998826937448957033E+05,       0.998929085234460072E+05,       0.999029559709882014E+05,       0.999127474237070273E+05,       0.999221942956127314E+05,
+        0.999312082917789958E+05,       0.999397015890797338E+05,       0.999475869811254670E+05,       0.999547779849950166E+05,       0.999611889084034483E+05,
+        0.999655508333875332E+05,       0.999687521058104176E+05,       0.999708756209590647E+05,       0.999718892905484245E+05,       0.999717672485314106E+05,
+        0.999704891389138356E+05,       0.999680393573227484E+05,       0.999644062616458687E+05,       0.999595813666838658E+05,       0.999535585371076886E+05,
+        0.999463331921408535E+05,       0.999379015343325445E+05,       0.999282598136142769E+05,       0.999174036365871580E+05,       0.999053273297332198E+05,
+        0.998920233640268561E+05,       0.998774818472951010E+05,       0.998616900896773586E+05,       0.998432094200693391E+05,       0.998215258930813725E+05,
+        0.997986442532860819E+05,       0.997746159978670912E+05,       0.997494898657428857E+05,       0.997233122677003994E+05,       0.996961277569055965E+05,
+        0.996679795269207534E+05,       0.996389099249155406E+05,       0.996089609684258903E+05,       0.995781748547828611E+05,       0.995465944531801651E+05,
+        0.995142637702681968E+05,       0.994812283811399975E+05,       0.994475358185973892E+05,       0.994132359146495874E+05,       0.993783810892878100E+05,
+        0.993430265826917603E+05,       0.993072306281462952E+05,       0.992699361805924273E+05,       0.992322369590151648E+05,       0.991942880496349680E+05,
+        0.991561790488717525E+05,       0.991180035697510175E+05,       0.990798588542613288E+05,       0.990418452912010980E+05,       0.990040658471643255E+05,
+        0.989666254199359537E+05,       0.989296301250896213E+05,       0.988931865279689664E+05,       0.988574008344593603E+05,       0.988223780549877847E+05,
+        0.987882211569994834E+05,       0.987550302217251592E+05,       0.987229016213559953E+05,       0.986919272327695508E+05,       0.986621937036891904E+05,
+        0.986337817866148835E+05,       0.986067657550310105E+05,       0.985855251179539773E+05,       0.985675277620845591E+05,       0.985515831726142933E+05,
+        0.985391751050558669E+05,       0.985310659201639937E+05,       0.985245080408891663E+05,       0.985195088048070465E+05,       0.985160685473306512E+05,
+        0.985141813574870466E+05,       0.985138358391387155E+05,       0.985150158641151211E+05,       0.985177013051926042E+05,       0.985218687383599317E+05,
+        0.985274921053063881E+05,       0.985345433285448526E+05,       0.985429928730166866E+05,       0.985528102493964543E+05,       0.985639644556170097E+05,
+        0.985764243543491611E+05,       0.985901589852987236E+05,       0.986051378122090100E+05,       0.986213309053895937E+05,       0.986387090614195185E+05,
+        0.986574141307979880E+05
+};
+
+#define NLON  81
+#define NLAT 166
+
+static void encode_decode (double * zval, const char * packingType, const int bitsPerValue, const int ioptimizeScaleFactor)
+{
+    size_t len, slen;
+    grib_handle * h;
+
+    GRIB_CHECK (((h = grib_handle_new_from_samples (NULL, "regular_ll_pl_grib2")) == NULL), 0);
+    GRIB_CHECK (grib_set_long (h, "Ni", NLON), 0);
+    GRIB_CHECK (grib_set_long (h, "Nj", NLAT), 0);
+    slen = strlen (packingType);
+    GRIB_CHECK (grib_set_string (h, "packingType", packingType, &slen), 0);
+    GRIB_CHECK (grib_set_long (h, "bitsPerValue", bitsPerValue), 0);
+    GRIB_CHECK (grib_set_long (h, "optimizeScaleFactor", ioptimizeScaleFactor), 0);
+
+    len = NLON * NLAT;
+    GRIB_CHECK (grib_set_double_array (h, "values", values, len), 0);
+    GRIB_CHECK (grib_get_double_array (h, "values", zval, &len), 0);
+
+    GRIB_CHECK (grib_handle_delete (h), 0);
+}
+
+static double calc_error (double * zval1, double * zval2)
+{
+    int i;
+    double zerr = 0;
+
+    for (i = 0; i < NLON * NLAT; i++)
+        zerr += (zval2[i] - zval1[i]) * (zval2[i] - zval1[i]);
+
+    return sqrt (zerr);
+}
+
+int main (int argc, char * argv[])
+{
+    int bitsPerValue[11] = {8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18};
+    int ipackingType, ibitsPerValue, ioptimizeScaleFactor;
+
+
+    for (ibitsPerValue = 0; ibitsPerValue < 11; ibitsPerValue++)
+        for (ipackingType = 0; ipackingType < 2; ipackingType++)
+        {
+            double zval_simple[NLAT * NLON];
+            double zval_second[NLAT * NLON];
+            double zerr;
+
+            encode_decode (zval_simple, "grid_simple",       bitsPerValue[ibitsPerValue], 1);
+            encode_decode (zval_second, "grid_second_order", bitsPerValue[ibitsPerValue], 1);
+
+            zerr = calc_error (zval_simple, zval_second);
+
+            if (zerr > 0.)
+            {
+                printf ("Second order packing does not reproduce simple packing with optimizeScaleFactor=1\n");
+                return 1;
+            }
+
+        }
+
+    printf (" %30s %30s %30s\n", "bitsPerValue", "error(optimizeScaleFactor=0)", "error(optimizeScaleFactor=1)");
+    for (ibitsPerValue = 0; ibitsPerValue < 11; ibitsPerValue++)
+    {
+        double zerr[2];
+        for (ioptimizeScaleFactor = 0; ioptimizeScaleFactor < 2; ioptimizeScaleFactor++)
+        {
+            double zval[NLAT * NLON];
+            encode_decode (zval, "grid_simple", bitsPerValue[ibitsPerValue], ioptimizeScaleFactor);
+            zerr[ioptimizeScaleFactor] = calc_error (zval, values);
+        }
+
+        printf (" %30d %30.6e %30.6e\n", bitsPerValue[ibitsPerValue], zerr[0], zerr[1]);
+
+        if ((zerr[0]/zerr[1] < 1.90) || (zerr[0]/zerr[1] > 2.00))
+        {
+            printf ("Packing error too big: optimizeScaleFactor appears to be broken\n");
+            return 1;
+        }
+
+    }
+
+    return 0;
+}
diff --git a/tests/optimize_scaling.sh b/tests/optimize_scaling.sh
new file mode 100755
index 0000000..17bd5b6
--- /dev/null
+++ b/tests/optimize_scaling.sh
@@ -0,0 +1,13 @@
+#!/bin/sh
+# Copyright 2005-2015 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+#
+# In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
+# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
+#
+
+. ./include.sh
+
+exec $test_dir/optimize_scaling
diff --git a/tests/optimize_scaling_sh.c b/tests/optimize_scaling_sh.c
new file mode 100644
index 0000000..b0eff4d
--- /dev/null
+++ b/tests/optimize_scaling_sh.c
@@ -0,0 +1,306 @@
+/*
+ * Copyright 2005-2017 ECMWF.
+ *
+ * This software is licensed under the terms of the Apache Licence Version 2.0
+ * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+ *
+ * In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
+ * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
+ */
+
+#include <assert.h>
+
+#include "grib_api.h"
+
+/*
+ * Check that optimizeScaleFactor=1 reduces the error on spherical harmonics encoding. Check that sub-truncation is preserved in IEEE-32 precision.
+ * philippe.marguinaud at meteo.fr, 2016/02
+ */
+
+static double values[] = {
+        2.78565217180879301395e+02,      0.00000000000000000000e+00,      8.38367712240454920902e-01,      0.00000000000000000000e+00,     -7.22151022768738215518e-01,
+        0.00000000000000000000e+00,      1.54447137639483056404e+00,      0.00000000000000000000e+00,     -8.10351659720698336287e-01,      0.00000000000000000000e+00,
+        6.45930713064333694717e-01,      0.00000000000000000000e+00,     -1.73417955255619204991e-01,      0.00000000000000000000e+00,     -9.09351867483918913093e-02,
+        0.00000000000000000000e+00,     -3.00845517613623769648e-02,      0.00000000000000000000e+00,     -1.97522108657794209785e-01,      0.00000000000000000000e+00,
+        1.45006392199800160370e-01,      0.00000000000000000000e+00,     -6.92319525648382033678e-02,      0.00000000000000000000e+00,     -3.37495245995370396486e-01,
+        0.00000000000000000000e+00,      2.93969252845082296144e-01,      0.00000000000000000000e+00,      5.22791676917648828748e-02,      0.00000000000000000000e+00,
+        -4.31020055899014042922e-02,      0.00000000000000000000e+00,     -5.34277055570271386387e-02,      0.00000000000000000000e+00,      1.57725778753141337996e-01,
+        0.00000000000000000000e+00,     -1.38048966071163903280e-01,      0.00000000000000000000e+00,      7.95936533884674390915e-02,      0.00000000000000000000e+00,
+        -5.08988096408558021722e-03,      0.00000000000000000000e+00,     -3.17356690459940984916e-02,      0.00000000000000000000e+00,     -7.97854100625838141836e-02,
+        0.00000000000000000000e+00,     -1.25759522048120825355e-01,      0.00000000000000000000e+00,      1.41095505007377608475e-01,      0.00000000000000000000e+00,
+        -2.90041709701537933630e-02,      0.00000000000000000000e+00,      1.16118748810570035501e-01,      0.00000000000000000000e+00,     -1.42650207377574778089e-01,
+        0.00000000000000000000e+00,      6.63859656709936268859e-02,      0.00000000000000000000e+00,     -8.43008351127146754456e-02,      0.00000000000000000000e+00,
+        8.11805506119530340126e-02,      0.00000000000000000000e+00,     -2.92579106275835476580e+00,     -2.73257362252726822283e-02,     -2.31503061096297768628e+00,
+        2.98481883110496337697e-01,      2.32422954464165210098e+00,     -9.36624989809203695179e-02,     -1.13647173814196378316e+00,     -4.24970312443540054748e-01,
+        1.26754821773852066613e+00,     -7.20859094680278700285e-02,     -9.51306475614490221204e-01,      6.14867632012408793507e-01,     -9.85091038732955892598e-02,
+        -6.34523215803268758606e-02,     -6.78708060411115782218e-02,     -1.35311523427619539994e-01,     -9.04935301775932621204e-02,     -9.78101007785831533248e-02,
+        -9.81097374871810895547e-04,      1.80616098092357818539e-02,     -2.64791786212412172397e-02,     -4.76558495508507054539e-02,     -1.96341419265033012564e-01,
+        3.40906457596743608929e-02,     -7.81262194523913988675e-02,     -1.90201799489863598858e-01,      2.25178750048809411810e-01,      2.86704542482240504198e-03,
+        -1.19805102746233238520e-02,      1.68969022321052431135e-02,      5.64738950483129331648e-02,     -1.39757566954298140249e-01,     -7.44084433787887133960e-02,
+        -1.79448737058076172868e-02,      6.14333363921325120716e-02,      4.42090839521651901567e-02,     -1.59177621940344016238e-02,     -2.45259140787589882682e-02,
+        4.14722887926062475095e-02,     -9.08467249754976585718e-02,      7.32634132869659504550e-02,      3.98083190502361433660e-02,     -6.23330309466623433412e-02,
+        3.23061735747387016038e-02,      5.24308078374175548508e-02,     -6.52853670335678676340e-02,     -4.74582205706168894221e-02,     -2.57646217050176394581e-02,
+        4.85326601320503064896e-02,      4.57836316487753580695e-02,     -1.61395013977115135695e-02,     -4.31399408593192076888e-02,     -1.72982609465274252136e-02,
+        2.05141743795376405024e-02,      5.13479785723864323721e-02,      2.02753965345298277356e-02,     -9.62325942856205422682e-03,     -1.21013000039295196344e-03,
+        4.61377663687331032727e-02,     -6.90153405245983028390e-04,     -1.66104804699747843344e+00,      1.79666906865138087390e-01,      7.23133875761683864170e-01,
+        4.15103729262486009777e-01,     -3.04359433047895144853e-01,     -1.33601223735748869670e-01,      1.11896993727331572899e+00,     -5.97930191729183602156e-01,
+        -3.21482407719980045613e-01,     -6.44440729482515239912e-02,     -1.39643167588630684461e-01,     -7.87344252201049310536e-02,     -2.74194962741515224636e-01,
+        3.16014987883590156570e-02,      2.61916687188788577245e-01,     -2.29041295889389484586e-01,      1.37413993896893793512e-02,      1.02848928276271345261e-01,
+        -8.45943398257167356036e-02,     -8.55836430183285895579e-02,     -2.14692485939022847941e-02,     -5.00660400534810728912e-02,      4.10286932308298671335e-02,
+        5.98356967342531728682e-02,     -6.87268417209678655899e-02,     -1.00834342061879356223e-01,      2.89946855441678558174e-02,      6.84096422422015987275e-02,
+        7.90905646811665974383e-02,      1.22761627402924594632e-02,     -7.19296897992387496146e-02,     -1.19563518571031840443e-01,      3.53949764125303933948e-02,
+        3.49389806984224948749e-02,     -1.34556768717593006057e-01,      1.30036738800839157815e-01,      1.47453022488737178763e-01,     -1.75187106897877128975e-02,
+        -5.71655857598896560701e-02,     -2.22513683371899778640e-02,      5.11984135243400070858e-02,      4.32198440146361120839e-02,     -3.79006811678369512353e-02,
+        -1.61948869817943215399e-02,      5.87864730303968852088e-02,      7.56143666040565154418e-03,      3.79735451815043784096e-02,      4.88357571184367539319e-03,
+        -3.44600211423619568266e-03,      8.45175251030964858057e-03,      2.06501052974025246789e-02,     -2.27945980601942863042e-02,      7.52792623890808781928e-02,
+        -4.07335076464383702421e-02,     -1.22373247319515162691e-03,      7.12818582736400585542e-03,     -2.08797409246280901707e-02,      2.35344435031375059930e-02,
+        5.38553837448995376125e-02,      2.29385900837120154661e-01,     -3.60512186055045147359e-01,      4.09262094434219958483e-01,     -1.43204915316633707434e-01,
+        1.76661646314910159017e-01,      1.59424540157772631765e-01,      1.19996653025061628117e-01,      9.74032138671445946176e-02,      8.01756516767066496065e-02,
+        -4.22092435868048232450e-01,      3.42598707334977881089e-01,      7.26427774784764446192e-02,     -1.92869792680440410582e-04,     -9.14800737566894561770e-02,
+        1.86904852575672325576e-01,      9.03785536307215725538e-02,     -8.70628859333670845899e-02,     -1.20357023393743836626e-01,      1.30276821268167974921e-01,
+        -5.50418496727855255379e-02,     -1.39930929689677463479e-01,     -4.10997318303747902202e-02,      1.66027061444833590187e-01,     -3.31025873454900559922e-02,
+        5.45967001368218574076e-02,     -1.86051192758042188702e-01,      3.57669212138109621213e-02,      1.96823682403928168494e-01,      1.12736638944959083330e-01,
+        -1.18563060708320622272e-01,     -7.11264215849067293895e-02,     -3.33098969956449747487e-02,      4.88100702343404121986e-02,      2.04094083090545080905e-02,
+        7.78285563663724117012e-02,     -4.14113893806803898268e-02,      1.26375672481289953730e-02,      1.38745116741378599068e-01,     -8.57558938152793923115e-03,
+        -9.29289689333271246019e-02,     -8.27276771926104548260e-02,      5.84956615429012907748e-02,      2.29399633044502938156e-03,     -2.09824524198216422546e-03,
+        -2.30538708704958079931e-02,      3.77132043821169771203e-02,      6.53337758882697045015e-02,     -3.06667712165429387494e-02,     -1.14650515581519504144e-02,
+        1.46194883433694872849e-02,      3.46636747707448856712e-03,     -4.35546278336838635359e-02,      6.29051255528407793349e-02,      6.12210568933847180256e-03,
+        2.07571937975545607602e-02,      3.35768305063385619214e-01,      7.46266949448459948613e-01,     -6.72463631746016698987e-02,     -1.94536700956528363360e-01,
+        -2.75088750614828209118e-02,      1.42328699967799371384e-01,      3.35288125725375085739e-01,      1.29661987766008346412e-01,      2.90956042046801172107e-02,
+        -2.05442280573112395770e-01,     -9.57252926974513779212e-02,     -9.10355774240597659386e-02,     -1.25784172798783761005e-01,      1.12460127036075691054e-01,
+        9.44013754824246931197e-02,     -6.05135930061245497225e-02,      9.42673278665148578481e-02,      2.00615512602382500829e-01,     -5.92185875904504069323e-02,
+        -2.28592246943101873313e-01,     -1.07412950490968162054e-01,      2.20172956055192214908e-01,      3.33294698669218958376e-01,     -4.44283179185198731642e-02,
+        -1.01766394690480529994e-01,      1.17472184755037761805e-01,      1.04892483649878465179e-01,     -6.62468314716531808672e-02,     -2.45565086356498013531e-03,
+        4.79072727765457034854e-02,     -7.97766729243851169251e-04,     -2.33714338875874692858e-02,     -2.56642787088907850523e-02,     -9.62514763421860042314e-02,
+        3.99383399281938444858e-02,      2.88865653017884548015e-02,     -5.15182520475396393822e-02,      8.26498791523299636275e-02,     -2.98742841129583554249e-02,
+        -8.28182978045203938011e-02,      3.14455026979475749105e-02,     -1.53345808562610789669e-03,     -3.62400610998830294274e-02,     -2.51728077975302867719e-02,
+        -3.02379015962623703961e-02,      2.68910770206758423240e-02,     -8.22634968902352312070e-03,      3.66544933660152699728e-02,      1.32356634436242674713e-02,
+        3.21880247207419244518e-03,     -1.97571016662111687001e-02,      5.93796945717029508310e-03,     -4.31413602924163308572e-02,     -2.72339719264069676785e-02,
+        -1.87274725743593273286e-01,      1.39283127485721136551e-01,      4.74963034217010249272e-01,     -3.42073553333540392174e-01,      4.83885077044606606855e-02,
+        -2.59068005795831224347e-01,     -2.13264680765766156956e-01,     -7.36008484860203593403e-02,     -8.13152420843461926081e-02,     -1.21927665578479005326e-02,
+        1.79904544651649317411e-01,     -1.09959740517953624694e-01,     -2.22065490779929819443e-01,      7.14015849729179447047e-02,     -5.85031872787839662964e-03,
+        9.72943249874637094976e-02,      1.58464145663301525513e-01,     -6.23660570620122936547e-02,     -2.05086286960385583145e-01,     -5.07929431274403847540e-02,
+        4.21897204870116185327e-02,     -6.99935466206487028051e-02,     -6.71348953496629374804e-02,      1.65743074443523596972e-01,      8.56850642116062655163e-02,
+        -1.19953810412321809631e-01,     -7.40173516101229334030e-02,      1.18865945768013535344e-02,     -7.71584669380707965924e-02,     -6.31283399388396088137e-02,
+        -1.45882854372074655114e-01,      6.29307315713034526317e-02,      1.48912624660626508738e-02,     -6.72819324032104260080e-02,      3.22547499735358483841e-02,
+        4.97387743825052491831e-02,     -5.43073271907661761504e-02,      1.52590958854153246893e-02,      2.92721489192738311066e-03,     -1.87663839736718872364e-02,
+        -3.80050872053503069684e-03,      5.91273447672226934446e-02,     -2.83684585809016896404e-03,      1.70512827209476636181e-02,     -1.44259815516434488497e-02,
+        -8.06597987912826830392e-02,      5.19954562777717940736e-02,      1.09504480128524081528e-02,      1.26439885486616093030e-02,     -2.34593647937779382559e-03,
+        2.47413111762442641806e-02,     -6.13559850860111253429e-03,     -6.05626633742831349538e-02,     -1.98467175793774985859e-01,      3.18979113074946862838e-01,
+        6.23356771079433893967e-02,      1.30138108749532965813e-01,     -1.05230501466137910116e-01,     -6.87754575227078057686e-02,     -4.22436887367944324811e-02,
+        7.57926459563205562331e-02,      4.78504387573109452036e-02,     -2.22681497547184761854e-02,      8.46951897073950493722e-02,     -7.44317622658197293462e-03,
+        -1.89157622212636281067e-02,     -6.19719693803440774271e-02,     -8.37644347918033160827e-03,      1.32514981682897603488e-01,     -1.09126775888557903116e-01,
+        -6.47849222903969929055e-03,      4.65591560634076861991e-02,     -2.24234845462696341656e-01,      7.29582023256248463072e-02,      2.23965783883813690514e-03,
+        -5.19349169152241198211e-03,      2.25395864383192284786e-02,      9.10694488527918760701e-02,      7.36945737152017443794e-02,     -2.16337158651918673447e-02,
+        -5.35436418307164291308e-02,      2.40342905027485786995e-02,      4.81946656785084762142e-02,     -3.06521617296798450092e-02,     -4.07904977042986977009e-02,
+        6.32948267919029999851e-02,      4.53192474361057834331e-02,     -2.29008122631283589365e-02,      1.62576382380966721897e-02,      3.82842631619570161750e-02,
+        3.52346794652655739832e-02,     -3.95023093184828782976e-02,     -3.15659719925446974331e-02,      4.02431236080928178556e-02,      2.45684617558553607120e-02,
+        -1.93194945947791144047e-02,     -2.48322169406506726430e-02,     -1.13621415403786386183e-02,     -3.31487361399904478798e-02,      1.68675563537488623633e-02,
+        4.01325091519489432490e-02,      4.14338905584917469027e-02,      1.31273776950603299207e-01,      7.16276979245435152510e-03,      5.02985992698696121606e-02,
+        1.78045915098635626483e-01,     -1.86314001159308406663e-01,     -1.35151434606926579285e-01,      1.69947309928447143346e-01,     -8.37791941109623933270e-02,
+        2.41195207762586322220e-02,      1.26309574838379373718e-01,     -2.00571859613532021971e-01,     -1.63465438373802895988e-01,     -6.96363659600393730686e-02,
+        1.14524330229191645403e-01,      7.12890316169484949960e-02,      5.80381889626466196397e-03,      4.93537868059431283907e-02,     -8.44257746020753430116e-02,
+        -1.41929196365875275043e-02,      8.22387462453117029648e-02,     -8.50093260265970818157e-02,      2.71192346905003156543e-02,      9.03395551304754379496e-02,
+        -1.71516448697893314490e-02,      8.18953521749132690166e-02,      1.11511604557867297777e-02,     -4.78373059022189212053e-03,     -9.53023452930306103070e-02,
+        5.38686323249407891800e-02,     -3.84678611713600085431e-02,     -5.04713920668615947246e-03,      6.80811773653991481048e-02,     -3.33049215638338835799e-02,
+        -5.28099294606356045589e-02,     -7.54699335274512245197e-02,     -5.40781758032556764126e-03,      8.29793590010352716257e-02,     -5.97312971039127629802e-02,
+        -2.71427292677366080453e-02,     -6.36007393417800138968e-03,     -6.21102608067901958838e-03,      1.20982775517295207401e-02,     -1.17366629581995736420e-02,
+        3.79477291991657597614e-02,      4.16172556173764890408e-02,     -4.15482630953573559007e-02,     -2.10178763811884848633e-02,      2.25384141584651191692e-02,
+        3.26544906456272876483e-01,      1.14875244914279722730e-01,     -1.66631737648658934114e-01,     -6.36733988328790686401e-03,      1.05207112351735077027e-01,
+        -2.56656713269180158932e-01,      6.60485459910778310855e-02,      4.17130045127815929362e-02,     -7.37791748174861372611e-02,      7.60523512741725499220e-02,
+        -4.55959006761720783696e-02,     -2.36680526647207629953e-02,      1.10634117950077798254e-01,     -2.08651727388676766495e-02,     -7.64711683504649686327e-02,
+        8.13422913278145920390e-03,      7.93342835009738511776e-02,     -1.36145811582776665727e-01,      3.71088391279384144372e-02,      3.21562962981391253781e-02,
+        -1.14387894243613869039e-01,     -1.51631103622234392203e-03,      5.78217444722389575795e-02,     -4.71124806075210594836e-03,      1.51729749910356030707e-02,
+        9.74258177618566034717e-02,     -1.10011849267590264279e-01,     -9.55723084321756233273e-02,      5.40108889439728720450e-02,      2.20372759806924181647e-02,
+        -3.12940070328804331723e-02,      7.31829279647891323135e-02,     -5.03897879848870661190e-02,      3.56857218059479508465e-02,      2.77447201596329011408e-02,
+        -2.09552594775335998545e-02,      1.43951419283830060747e-02,      5.39902985778747748769e-02,      2.12233791683978864628e-02,     -1.06021857317053335573e-02,
+        -1.29173575974317281917e-02,      2.33645540297061204277e-03,      2.61896609343018451146e-03,     -1.14595932568608803448e-02,      3.56767949738183843926e-04,
+        2.01246788122515993247e-02,      1.99364141245472692443e-01,      1.02386975283006720350e-02,      1.46491539292862016364e-01,     -2.92173375533333390397e-01,
+        -2.79882649001711690528e-02,      7.89598614348374083782e-02,      1.73932768517874730696e-02,     -1.69430993280276553925e-01,     -3.49439319604140236075e-02,
+        -2.41776119023419042153e-02,     -1.19007451411664612329e-02,      7.52785183419538428407e-02,      8.00732324924654653708e-02,      5.80254140930885203842e-02,
+        -2.99344525092792301812e-02,      2.00701049258613407889e-02,     -4.85173141225875570459e-02,     -1.24597145763424926868e-01,     -1.51901004582441958440e-02,
+        -1.61680779553563594431e-02,      6.85542113027582250551e-02,      4.25745326736892623631e-02,     -1.06278911193231559440e-04,      9.76285197536541464458e-03,
+        3.87428701891937912749e-02,     -2.30639988244256723127e-02,      6.36890026034679732764e-03,      3.02413182033626840028e-02,      3.88836672433736253024e-03,
+        -9.08662711955680046927e-02,      4.01745378306784250988e-02,      1.03266559093635329480e-01,      2.14979137912293429002e-03,     -5.41722635351460576891e-02,
+        2.61282597269434195553e-02,     -1.88195226737477086520e-03,     -2.19435523135619973967e-02,      1.32921056129775890658e-02,     -1.39584001825611234843e-02,
+        -2.33277834487258597940e-02,      3.20387242392535485924e-03,     -2.56605748623718842027e-02,      3.00558911102263848214e-02,      3.05648112133436906934e-02,
+        -2.59104772664633942192e-03,     -3.60234150814368395133e-02,      1.89051474579463585357e-01,      7.67659810167127809599e-02,     -1.24703387595890141659e-01,
+        1.16494243349512860419e-01,     -1.23273291315800521267e-02,     -8.52472265397304362899e-02,      4.85995814815475199455e-02,     -4.91533864052588892468e-02,
+        7.09392924651690154336e-02,      3.86918200904741022006e-02,     -6.05870726251201280332e-02,      1.26662290542081668043e-01,     -1.26300238339170367574e-02,
+        -2.77371050405810226636e-02,     -5.43586513698262885352e-02,     -7.86459616541178574423e-02,      6.23528587727540037355e-02,     -4.79677851814970662714e-02,
+        -6.51687150996678454806e-04,      5.76336385114276719688e-02,      1.44542478484825671209e-02,      3.16928492510423695516e-02,      1.45017405736592441823e-02,
+        3.77649866255029068030e-02,      2.76488049642000443748e-04,     -6.60577998684190731415e-02,     -1.43760686140608738570e-02,      3.59108661833638931338e-02,
+        -1.96544252969081192917e-02,     -3.14635605928988426605e-02,      2.73136448740384021883e-02,      4.81895944089887409700e-02,     -1.41798371596522010049e-03,
+        -2.76940211432370950173e-02,     -1.79321359038478039816e-02,     -8.04857916575939247306e-03,      6.12601355103674924743e-04,     -3.04826514707566033346e-02,
+        3.97737096905840994271e-03,      2.93070515299252015717e-02,     -1.68977509366934480761e-01,      3.32231696372570911580e-03,      1.25024830498748684704e-01,
+        1.14603027997231002311e-01,     -1.00188353252315814901e-01,     -9.84663913699934667534e-03,      4.24578628782099620764e-02,     -1.37172078837733080192e-01,
+        -3.49285758694722614504e-02,      5.10266827849673310080e-02,     -8.71727496405721724582e-02,      6.53026570180906262841e-03,      8.81977524226997683376e-02,
+        -6.34979748614215300240e-02,     -6.75922576223946108831e-02,     -9.09058087393600777748e-03,      8.58354921744265697559e-02,     -3.11903783366274736655e-02,
+        2.00028673474334506288e-02,      2.51992069666158204078e-02,     -1.15065874504069552003e-02,      1.90952708533619654185e-02,     -1.42994317615683774053e-02,
+        8.38885300224805237346e-04,     -3.82027498742033497225e-02,     -3.67441895491770198490e-02,      2.50992455595355073994e-02,      7.01187400269996513602e-02,
+        -5.54375280311450654991e-02,     -4.38519736099493434578e-02,     -7.84180536804670973161e-03,      2.15733075413469983783e-02,     -1.13430180042112986952e-03,
+        1.43263625967320618049e-02,      3.38406892444173892920e-02,      2.61661740894084809961e-02,      1.89963433472952851477e-02,      4.11523810167366797808e-03,
+        -4.07083694738235874616e-03,     -2.14250124636823323365e-02,     -2.51950730394823532721e-02,      3.42343547054715646727e-02,     -1.60995215305804545425e-01,
+        1.46286861154573760713e-01,     -1.42470612032240401268e-02,     -8.74980046536548150549e-02,     -4.25453860188948623788e-02,      1.17182553786398857554e-01,
+        -1.00991016453327253632e-01,     -7.91738577441953306213e-02,      5.29573588185536445194e-02,     -2.21614298461902045623e-02,      3.58602587208211864844e-02,
+        2.52438926833398191718e-02,      9.41877819477729971709e-02,     -6.48116676539685077074e-02,     -6.92622200130770665494e-02,      3.44271533520238565140e-02,
+        -2.14712430694437191037e-02,      1.72316382693014427674e-02,     -2.66608743584075963406e-02,     -2.10082338877249467923e-02,      8.91565305172099635544e-03,
+        -1.23413533420058361967e-02,     -6.55699200671947673991e-03,     -6.50539642022832619028e-03,      1.51124007337151353147e-02,      5.20370287348198221067e-03,
+        2.44544519960917354495e-02,      8.17735780033393942767e-03,     -3.77816692303542945967e-04,     -2.75580902253722351269e-02,      1.61366174765763085996e-02,
+        -2.54225642602667507852e-02,     -5.68510449978476550825e-02,      1.03315681722852791002e-02,      5.48232041684815468024e-03,     -3.22722809472682503618e-02,
+        1.68859338049149008965e-02,      6.21665123569529881609e-02,     -1.49734091796970530952e-01,     -1.69848035269845681894e-01,      7.28166844225807269320e-02,
+        -9.38546660994197951000e-02,     -5.98972210309676594830e-02,      1.60189670628219316129e-01,      9.68228235109596380159e-02,     -1.14699218288179388692e-01,
+        5.22495478003770982833e-02,     -2.50191304829539204468e-02,      2.77221049132821764638e-02,      5.25053174572039649259e-02,      4.67049795137407172674e-02,
+        -4.25063623233455645245e-02,     -7.79015735544906322285e-03,      8.35061691171900405406e-02,     -2.77565926301914164820e-02,     -3.55176007501909543618e-02,
+        5.22884040187019810686e-02,      4.47524306813492939866e-03,      3.34858736182796073999e-02,      2.18065090398272508343e-02,      3.96249948248765804237e-02,
+        -1.75050000687652293485e-02,     -5.30639824787136182155e-03,      1.31658536276919365532e-02,     -3.54893637807925724226e-02,      1.44838563901157494143e-03,
+        2.53219139441511024990e-02,      1.51209661740110620776e-02,     -3.18928979311501516886e-03,      8.08035892351891861518e-03,      1.49482343348299774599e-02,
+        -4.67401524501743839690e-02,      8.81785937471118302922e-02,      1.09443858484468511949e-01,      9.61675669132599497679e-02,     -7.39592182705455791769e-02,
+        8.87508822651789097691e-02,     -7.91714174638406542606e-02,     -1.25898861391198962911e-01,      8.84171948090256565322e-02,      3.93482215277929509023e-02,
+        -6.26211797345710557972e-02,      3.11866892937116280127e-02,      1.54206070094080910371e-01,     -7.15962414998223273255e-02,      4.04187883182457047271e-02,
+        3.87320351160306483584e-02,     -2.13087169719965857650e-02,      2.04352330201420621936e-02,      3.60324068311299108847e-02,     -6.71927151509099790383e-02,
+        -5.86355402262732916530e-02,      1.95738272971190847838e-02,      1.19986570986449735121e-02,     -4.16517345466257682407e-02,      4.57582247311850084937e-02,
+        -5.64919874467361762815e-02,     -2.96306742467898837426e-03,      3.45918894384134034681e-02,      9.37965919443191353810e-03,     -5.31266846947417263614e-03,
+        7.44645101900219368030e-03,     -8.16779483872519251886e-03,     -1.49486275306286754694e-02,      5.40961754497425346966e-03,     -6.07743621110200162722e-03,
+        -2.86027271239626297572e-02,      9.28607307596479303324e-02,      1.15334393912762608880e-01,      2.22619048233438435180e-02,     -2.81988516854455167904e-02,
+        -3.27953711282213400402e-02,     -7.26623103447188861681e-02,     -6.21318073281297983401e-02,      8.15860644657136341307e-02,      1.79600966703069159225e-02,
+        -8.26984672948943289050e-02,      2.66922837734803533594e-02,     -5.62012642483699781382e-02,     -7.54479658771655264937e-02,      5.63921972458279810447e-02,
+        -8.88808665037604112014e-03,      4.49098738994229513752e-04,     -1.64624335502902702233e-02,      5.00902714527058645633e-02,      1.06477908341492902983e-02,
+        2.19722684831073211686e-02,      9.27897245497274342219e-03,     -1.38071463629181757221e-02,     -3.25812324194547434097e-02,     -3.02235182235052954325e-02,
+        2.70211283173303479233e-02,      1.78695725115783597692e-02,     -1.97856995310294429824e-02,      2.14583909244959528118e-02,      8.31160096115654556392e-03,
+        -7.96044059263601583298e-03,     -7.03711411983747731069e-03,     -7.52245974116911853002e-02,     -7.17896739726268801052e-02,      1.07396425196690896431e-02,
+        7.25906809169843403318e-02,     -9.45023972725838740105e-02,     -6.71199808984563744962e-02,      7.35264690791543329418e-02,      2.98610952212447697263e-02,
+        -7.52442146662268135371e-04,      9.23976694955527116937e-02,      4.60854381027500578649e-02,     -5.81010137429742931636e-02,      5.19935015121687146844e-02,
+        -4.28751313838296663206e-02,      2.68412731409498166169e-02,      9.92974085166531926505e-03,     -1.41649957602334279627e-02,      8.49484772510930227774e-03,
+        1.60608334268962397659e-03,      1.53969582107269485627e-02,      2.53654424332110106644e-02,      2.20836817019017840613e-02,     -4.96400766026642691758e-03,
+        -4.63895546537213768895e-03,     -3.69755978269468085773e-02,     -4.24220279369531480529e-02,     -2.80842055465305032516e-03,      3.43511446156298310903e-03,
+        1.50427480682660263955e-02,     -7.64781824357823984684e-03,      1.55431405065905338392e-02,     -5.28685500234718219748e-02,     -4.81425552620864186104e-02,
+        -6.98904426260522071424e-02,     -5.69063762150740712342e-02,     -2.01599484306710097226e-02,     -7.08142573082899164094e-03,      1.60387886663503793916e-02,
+        -8.26785713680359968247e-02,      2.82003440014560874394e-02,      2.73932418290509169245e-02,     -3.17992788170617102228e-02,      5.85714331111230612770e-02,
+        5.86577384557991701741e-02,     -2.75299012996250893476e-03,     -8.45195718330371027760e-03,     -1.36279044444791216234e-02,     -1.13870143130110085955e-02,
+        -9.47170994530230694886e-03,      8.38589777991547574709e-03,     -2.44907795135516845320e-02,     -1.88112311627625997112e-02,      1.66825300517051550164e-02,
+        -1.40472696715355817310e-02,      4.07602998308370448322e-02,      4.52331228574007898624e-03,     -7.41516905358174677892e-03,     -1.90839799893427405908e-02,
+        1.37235319648593090402e-01,     -5.07166887609150802974e-03,      1.66347985382777688312e-02,     -8.94058332794331472870e-02,     -9.96617048317507969735e-03,
+        -3.39998201752246195784e-02,     -2.72752305938337435975e-02,      1.41116199971288980557e-04,      1.20136294077674496417e-02,      1.21046096252801875515e-02,
+        4.67374536088999582156e-03,      1.76093997807116745338e-03,     -6.49132489663982719524e-03,      6.34253853067380107822e-02,      4.20234078454048282092e-02,
+        -3.39907942260764435460e-03,     -3.13684078013621997494e-02,     -5.59725664044557688626e-03,      1.46041344723689698465e-02,      8.15628093364801319554e-03,
+        8.81123245682426982361e-03,     -5.36576704715815769320e-02,      4.13564181087699121731e-03,      6.66570175208870251832e-03,     -3.06753731552251258582e-03,
+        3.24260047333155276839e-02,      3.78357123622976698057e-03,      1.22559252382635042178e-01,     -3.26726534731656623189e-02,     -4.57263244390499479231e-02,
+        1.23161267442891183416e-02,      5.60898223233850107272e-02,     -2.07946281596515653023e-02,      3.30973059009364162231e-02,      3.79099335956614089116e-02,
+        3.02099801034241572523e-03,     -4.11260349557933183040e-02,     -2.09662321613402133358e-02,     -1.35059512400454856396e-02,      2.11033519015176411482e-02,
+        2.49738730383721862366e-03,      1.80042474049896738739e-03,     -4.21972590754290111104e-02,      7.84304881856809008034e-03,      1.28611420258033324476e-02,
+        1.53304442551651341764e-02,      1.14809771240723442615e-02,      5.45508167269171534430e-03,      6.03486224308978115582e-03,     -6.17922023172545829134e-03,
+        -1.06402780093771354153e-01,     -1.06566854283863088337e-01,     -1.56672555450536946098e-02,     -4.17617234129553371869e-02,     -5.84327485785076233826e-02,
+        1.72707037153512245331e-02,     -4.27180361478920241763e-03,      3.83975587930814599158e-02,      7.18917519991502662613e-02,      1.73599075858622414748e-02,
+        -5.06102136889801795805e-02,     -2.28302899957008066656e-02,      4.05449577890660689539e-02,      6.05903063932164507449e-03,      1.42495320779388468663e-02,
+        -1.46505630681158707102e-02,     -5.51579872998721708333e-03,     -2.03950903125686006101e-02,      1.71600095189964607645e-02,      3.10141280680510215972e-02,
+        -6.92078952483923121042e-03,     -1.25723580586239959064e-03,      4.83571917759556130223e-02,     -1.08848884748079619000e-01,     -7.62227492845969547414e-03,
+        3.98614872899268266049e-02,      2.51496883852979809248e-02,     -7.45157236466782307849e-02,     -2.54315956467565489063e-02,      5.86785913495517369443e-02,
+        6.07261945507166309849e-03,      2.37710782485035070077e-02,      2.40958099664499367232e-03,      8.00723308014901838381e-03,      5.57202821065413758661e-02,
+        -6.18738592105032812751e-03,      1.57471692604664484198e-03,     -2.08797558382940772262e-03,     -2.73200765442419279960e-02,     -2.06208586891517380024e-02,
+        6.40309150046379439887e-04,      3.34147637908005640250e-02,     -2.31245128603038314907e-02,      3.13805487530873783442e-02,     -3.76503956682762222496e-02,
+        3.82033717675601958152e-02,      6.08549869979059313008e-02,     -1.40664950951139375995e-02,      1.20432450888018800772e-02,      4.11120541709728091334e-03,
+        -1.31431111647770104689e-02,     -2.16767866450208908369e-02,      2.36444182462271527620e-03,      4.15518391649481646372e-03,     -7.19797119986096724242e-03,
+        3.63099914737792378583e-02,     -1.71114207061806439247e-02,      9.12094809288829279359e-03,     -2.00581984724530065778e-02,      4.18093901030532240359e-03,
+        -1.54353999486445108563e-02,      3.77632145097120189292e-02,     -8.67412239218371683425e-02,      3.74024476837445662980e-02,      7.02791955646850374784e-03,
+        -3.07387087745127421390e-03,      1.26170642077405754933e-02,      7.19502473862098246987e-03,      5.00348237158451253359e-02,      6.05821676660315069918e-03,
+        2.81657375913338843543e-02,     -2.75046494305255621871e-02,     -3.32847608680125889302e-02,      4.92458523340539092161e-03,     -6.97895182233836727098e-03,
+        -1.84078432809154611538e-02,     -2.55254058040131799612e-02,      4.38596283726821068588e-03,      7.97305689082921688338e-03,     -6.65251068675700718558e-02,
+        -2.43074168732615144076e-03,     -3.21551055785660854641e-03,     -2.14057386820096506863e-02,      1.73404829493880863200e-02,     -2.21788279126988834011e-02,
+        3.67289476360874028726e-02,      2.88921423109056961509e-02,     -4.36590369050650264210e-03,     -3.38015966458028857197e-03,     -1.47872402615952351634e-02,
+        -2.67937691397940741522e-02,     -4.01628891758317591032e-02,      5.37104159736995767638e-02,      3.38881421250558784175e-02,     -1.94731556323654853013e-02,
+        6.80080451079642287447e-04,     -1.16224021866609874415e-02,     -2.84314312441163938305e-02,     -3.10403528556473483346e-02,     -1.52614844050795953750e-02,
+        1.46865039960839046523e-02,      7.74337973212646264037e-03,     -2.75213939675030445919e-02,     -3.12476741289728875139e-02,     -3.75401476285800936306e-02,
+        4.53067917901101985256e-02,      4.75497506720418041531e-03,      1.25627944556748021021e-02,      4.03046169919628882727e-02,     -3.29378978115561424356e-02,
+        -2.51499548928088654393e-03,     -1.99564144518295516484e-02,     -2.63938123636600005528e-02,     -1.84979990476826575141e-02,     -4.75891539387540141171e-02,
+        1.70189645456799328038e-02,      2.90621732209333551167e-02,      1.69695748997654785595e-02,      6.00578109434020054880e-03,      3.77405846672976205691e-02,
+        1.04426223615697640751e-02,     -7.42237607930411715310e-04,     -1.51118572042552353624e-02,      1.29952623161545995079e-03,      1.26799047323642617713e-02,
+        1.05278997248968164691e-02,      2.29682654055416574090e-02,      1.28888330591014361320e-02,     -1.03014730669756075787e-02,     -4.83421710205830541113e-03,
+        -1.90040068302814585399e-02,     -4.31802671175361696410e-03
+};
+
+#define ILCHAM 992
+#define MTRONC  30
+#define STRONC  10
+
+int main (int argc, char * argv[])
+{
+    size_t len;
+    grib_handle * h;
+    double zval[ILCHAM];
+    int ioptimizeScaleFactor;
+    double zerr[2] = {0,0};
+    int i, m, n, k;
+
+    for (ioptimizeScaleFactor = 0; ioptimizeScaleFactor < 2; ioptimizeScaleFactor++)
+    {
+        GRIB_CHECK (((h = grib_handle_new_from_samples (NULL, "sh_ml_grib2")) == NULL), 0);
+
+        /* Meteo-France settings */
+        GRIB_CHECK (grib_set_long (h, "centre", 85), 0);
+        len = strlen ("stretched_rotated_sh");
+        GRIB_CHECK (grib_set_string (h, "gridType", "stretched_rotated_sh", &len), 0);
+        GRIB_CHECK (grib_set_long (h, "pentagonalResolutionParameterJ", MTRONC), 0);
+        GRIB_CHECK (grib_set_long (h, "pentagonalResolutionParameterK", MTRONC), 0);
+        GRIB_CHECK (grib_set_long (h, "pentagonalResolutionParameterM", MTRONC), 0);
+
+        GRIB_CHECK (grib_set_double (h,"stretchingFactor", 2.40000000000000), 0);
+        GRIB_CHECK (grib_set_double (h,"latitudeOfStretchingPoleInDegrees", 46.4688478326275), 0);
+        GRIB_CHECK (grib_set_double (h,"longitudeOfStretchingPoleInDegrees", 2.57831007808864), 0);
+
+        GRIB_CHECK (grib_set_long (h, "bitsPerValue", 16), 0);
+        len = strlen ("spectral_complex");
+        GRIB_CHECK (grib_set_string (h, "packingType", "spectral_complex", &len), 0);
+        GRIB_CHECK (grib_set_long (h, "optimizeScaleFactor", ioptimizeScaleFactor), 0);
+
+        GRIB_CHECK (grib_set_long (h, "subSetJ", STRONC), 0);
+        GRIB_CHECK (grib_set_long (h, "subSetK", STRONC), 0);
+        GRIB_CHECK (grib_set_long (h, "subSetM", STRONC), 0);
+        GRIB_CHECK (grib_set_long (h, "unpackedSubsetPrecision", 1), 0);
+
+        GRIB_CHECK (grib_set_double_array (h, "values", values, ILCHAM), 0);
+        len = ILCHAM;
+        GRIB_CHECK (grib_get_double_array (h, "values", zval, &len), 0);
+
+        /* Compare our values */
+        for(i=0; i<ILCHAM; ++i)
+        {
+            const double diff = fabs(zval[i]-values[i]);
+            if (diff > 1e-5) {
+                fprintf(stderr,"Unpacked value different: i=%d values[i]=%g zval[i]=%g\n", i, values[i], zval[i]);
+                return 1;
+            }
+        }
+
+        for (m = 0, k = 0; m < MTRONC+1; m++)
+        {
+            for (n = m; n < MTRONC+1; k++, n++)
+            {
+                /* Check sub-truncation was fully preserved in IEEE-32 */
+                if ((m < STRONC+1) && (n < STRONC+1) && (((float)zval[2*k] != (float)values[2*k]) || ((float)zval[2*k+1] != (float)values[2*k+1])))
+                {
+                    printf ("Unpacked sub-truncation was not fully preserved; coefficients for wave number (m=%d,n=%d) have been modified\n", m, n);
+                    return 1;
+                }
+            }
+        }
+
+        for (i = 0; i < ILCHAM; i++)
+        {
+            zerr[ioptimizeScaleFactor] += (zval[i] - values[i]) * (zval[i] - values[i]);
+        }
+
+        zerr[ioptimizeScaleFactor] = sqrt (zerr[ioptimizeScaleFactor]);
+
+        GRIB_CHECK (grib_handle_delete (h), 0);
+    }
+
+    if (zerr[0] < zerr[1])
+    {
+        printf ("Packing error too big: optimizeScaleFactor appears to be broken\n");
+        return 1;
+    }
+    printf("OK\n");
+
+    return 0;
+}
diff --git a/tests/optimize_scaling_sh.sh b/tests/optimize_scaling_sh.sh
new file mode 100755
index 0000000..800e2b2
--- /dev/null
+++ b/tests/optimize_scaling_sh.sh
@@ -0,0 +1,13 @@
+#!/bin/sh
+# Copyright 2005-2015 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+#
+# In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
+# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
+#
+
+. ./include.sh
+
+exec $test_dir/optimize_scaling_sh
diff --git a/tests/pack_unpack.c b/tests/pack_unpack.c
index c4cdea6..0076204 100644
--- a/tests/pack_unpack.c
+++ b/tests/pack_unpack.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/packing.c b/tests/packing.c
index 15a9c08..ec0af59 100644
--- a/tests/packing.c
+++ b/tests/packing.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/packing_check.c b/tests/packing_check.c
index d818df9..4d8c829 100644
--- a/tests/packing_check.c
+++ b/tests/packing_check.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/padding.sh b/tests/padding.sh
index 3a55c3d..c7bc799 100755
--- a/tests/padding.sh
+++ b/tests/padding.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/png_perf.c b/tests/png_perf.c
index 24fe063..9175145 100644
--- a/tests/png_perf.c
+++ b/tests/png_perf.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/read_any.c b/tests/read_any.c
index dfece43..2f1fbf1 100644
--- a/tests/read_any.c
+++ b/tests/read_any.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/read_any.sh b/tests/read_any.sh
index 7d5b2cb..768185c 100755
--- a/tests/read_any.sh
+++ b/tests/read_any.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/read_index.c b/tests/read_index.c
index 229a046..a57eeb7 100644
--- a/tests/read_index.c
+++ b/tests/read_index.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/second_order.sh b/tests/second_order.sh
index d4bf4f9..8cace32 100755
--- a/tests/second_order.sh
+++ b/tests/second_order.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/set.sh b/tests/set.sh
index 388a8d1..10fc9f4 100755
--- a/tests/set.sh
+++ b/tests/set.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/so_perf.c b/tests/so_perf.c
index 5e309b1..6913d25 100644
--- a/tests/so_perf.c
+++ b/tests/so_perf.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/statistics.sh b/tests/statistics.sh
index 5543024..8af1fd0 100755
--- a/tests/statistics.sh
+++ b/tests/statistics.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/step.sh b/tests/step.sh
index 19ee02b..f5b144f 100755
--- a/tests/step.sh
+++ b/tests/step.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/tigge.sh b/tests/tigge.sh
index c77f757..41b4ade 100755
--- a/tests/tigge.sh
+++ b/tests/tigge.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/tigge_conversions.sh b/tests/tigge_conversions.sh
index ae585bc..51b6412 100755
--- a/tests/tigge_conversions.sh
+++ b/tests/tigge_conversions.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/timing.c b/tests/timing.c
index 6374239..d07f5d9 100644
--- a/tests/timing.c
+++ b/tests/timing.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/tiny.sh b/tests/tiny.sh
index ca9d5be..645923b 100755
--- a/tests/tiny.sh
+++ b/tests/tiny.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/uerra.sh b/tests/uerra.sh
index 40629ad..9a554a2 100755
--- a/tests/uerra.sh
+++ b/tests/uerra.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/unit_tests.c b/tests/unit_tests.c
index eb44e9e..db01013 100644
--- a/tests/unit_tests.c
+++ b/tests/unit_tests.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -1366,6 +1366,38 @@ void test_gaussian_latitude_640()
 	free(lats);
 }
 
+void test_string_splitting()
+{
+    int i=0;
+    char input[80] = "Born|To|Be|Wild";
+    char** list=0;
+    list = string_split(input, "|");
+    for(i=0; list[i] != NULL; ++i) {} /* count how many tokens */
+    assert(i == 4);
+    if ( strcmp(list[0], "Born")!=0 ) assert(0);
+    if ( strcmp(list[1], "To")  !=0 ) assert(0);
+    if ( strcmp(list[2], "Be")  !=0 ) assert(0);
+    if ( strcmp(list[3], "Wild")!=0 ) assert(0);
+
+    strcpy(input, "12345|a gap|");
+    list = string_split(input, "|");
+    for(i=0; list[i] != NULL; ++i) {} /* count how many tokens */
+    assert(i == 2);
+    if ( strcmp(list[0], "12345")!=0 ) assert(0);
+    if ( strcmp(list[1], "a gap")!=0 ) assert(0);
+
+    strcpy(input, "Steppenwolf");
+    list = string_split(input, ",");
+    for(i=0; list[i] != NULL; ++i) {} /* count how many tokens */
+    assert(i == 1);
+    if ( strcmp(list[0], "Steppenwolf")!=0 ) assert(0);
+
+    /* Note: currently cannot cope with */
+    /*  input being NULL */
+    /*  input being empty */
+    /*  input having several adjacent delimiters e.g. 'A||B|||C' */
+}
+
 int main(int argc, char** argv)
 {
     /*printf("Doing unit tests. GRIB API version = %ld\n", grib_get_api_version());*/
@@ -1390,5 +1422,7 @@ int main(int argc, char** argv)
     test_grib_nearest_smaller_ibmfloat();
     test_grib_nearest_smaller_ieeefloat();
 
+    test_string_splitting();
+
     return 0;
 }
diff --git a/tests/unit_tests.sh b/tests/unit_tests.sh
index 8611aed..5ee3d6b 100755
--- a/tests/unit_tests.sh
+++ b/tests/unit_tests.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/utils.sh b/tests/utils.sh
index cf3934b..a7ecf31 100644
--- a/tests/utils.sh
+++ b/tests/utils.sh
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tests/values_to_ascii.c b/tests/values_to_ascii.c
index 510cca5..b4d1557 100755
--- a/tests/values_to_ascii.c
+++ b/tests/values_to_ascii.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tigge/jma.pl b/tigge/jma.pl
index fa202c4..1eafc78 100755
--- a/tigge/jma.pl
+++ b/tigge/jma.pl
@@ -1,5 +1,5 @@
 #!/usr/bin/perl -I../perl/GRIB-API/blib/lib -I../perl/GRIB-API/blib/arch
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tigge/tigge_accumulations.c b/tigge/tigge_accumulations.c
index 09676d4..76de47b 100755
--- a/tigge/tigge_accumulations.c
+++ b/tigge/tigge_accumulations.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tigge/tigge_check.c b/tigge/tigge_check.c
index 1a1e7af..ae7e77a 100755
--- a/tigge/tigge_check.c
+++ b/tigge/tigge_check.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -50,7 +50,7 @@ struct parameter {
     double max1;
     double max2;
     pair   pairs[15];
-    check_proc checks[4];
+    check_proc checks[5];
 };
 
 static void point_in_time(grib_handle*,const parameter*,double,double);
@@ -65,6 +65,8 @@ static void predefined_level(grib_handle*,const parameter*,double,double);
 static void predefined_thickness(grib_handle*,const parameter*,double,double);
 static void given_thickness(grib_handle*,const parameter*,double,double);
 static void has_bitmap(grib_handle*,const parameter*,double,double);
+static void has_soil_level(grib_handle*,const parameter*,double,double);
+static void has_soil_layer(grib_handle*,const parameter*,double,double);
 
 static void height_level(grib_handle*,const parameter*,double,double);
 static void pressure_level(grib_handle*,const parameter*,double,double);
@@ -465,14 +467,7 @@ static void point_in_time(grib_handle* h,const parameter* p,double min,double ma
         break;
     }
 
-    if (is_uerra)
-    {
-        if(get(h,"indicatorOfUnitOfTimeRange") == 1) /*  hourly */
-        {
-            CHECK((eq(h,"forecastTime",1)||eq(h,"forecastTime",2)||eq(h,"forecastTime",4)||eq(h,"forecastTime",5))||(get(h,"forecastTime") % 3) == 0);
-        }
-    }
-    else if (is_lam) {
+    if (is_lam) {
         if(get(h,"indicatorOfUnitOfTimeRange") == 10 ) /*  three hours */
         {
             /* Three hourly is OK */
@@ -483,7 +478,14 @@ static void point_in_time(grib_handle* h,const parameter* p,double min,double ma
             CHECK(eq(h,"indicatorOfUnitOfTimeRange",1));/* Hours */
             CHECK((get(h,"forecastTime") % 3) == 0);  /* Every three hours */
         }
-    } else {
+    } 
+    else if (is_uerra) {
+        if(get(h,"indicatorOfUnitOfTimeRange") == 1) /*  hourly */
+        {
+            CHECK((eq(h,"forecastTime",1)||eq(h,"forecastTime",2)||eq(h,"forecastTime",4)||eq(h,"forecastTime",5))||(get(h,"forecastTime") % 3) == 0);
+        }
+    }
+    else {
         if(get(h,"indicatorOfUnitOfTimeRange") == 11) /*  six hours */
         {
             /* Six hourly is OK */
@@ -673,14 +675,7 @@ static void statistical_process(grib_handle* h,const parameter* p,double min,dou
         break;
     }
 
-    if (is_uerra)
-    {
-        if(get(h,"indicatorOfUnitOfTimeRange") == 1) /*  hourly */
-        {
-            CHECK((eq(h,"forecastTime",1)||eq(h,"forecastTime",2)||eq(h,"forecastTime",4)||eq(h,"forecastTime",5))||(get(h,"forecastTime") % 3) == 0);
-        }
-    }
-    else if (is_lam) {
+    if (is_lam) {
         if(get(h,"indicatorOfUnitOfTimeRange") == 10 ) /*  three hours */
         {
             /* Three hourly is OK */
@@ -691,7 +686,17 @@ static void statistical_process(grib_handle* h,const parameter* p,double min,dou
             CHECK(eq(h,"indicatorOfUnitOfTimeRange",1));/* Hours */
             CHECK((get(h,"forecastTime") % 3) == 0);  /* Every three hours */
         }
-    } else {
+    } 
+    else if (is_uerra) 
+    {
+/*  forecastTime for uerra might be all steps decreased by 1 i.e 0,1,2,3,4,5,8,11...29 too many... */
+        if(get(h,"indicatorOfUnitOfTimeRange") == 1)
+        {
+            CHECK(le(h,"forecastTime",30));
+        }
+    }
+    else 
+    {
         if(get(h,"indicatorOfUnitOfTimeRange") == 11) /*  six hours */
         {
             /* Six hourly is OK */
@@ -733,6 +738,7 @@ static void statistical_process(grib_handle* h,const parameter* p,double min,dou
     {
         CHECK((get(h,"endStep") % 6) == 0); /* Every six hours */
     }
+    
 
     if(get(h,"indicatorOfUnitForTimeRange") == 11)
     {
@@ -757,6 +763,18 @@ static void has_bitmap(grib_handle* h,const parameter* p,double min,double max)
     CHECK(eq(h,"bitMapIndicator",0));
 }
 
+static void has_soil_level(grib_handle* h,const parameter* p,double min,double max)
+{
+    CHECK(get(h,"topLevel") == get(h,"bottomLevel"));
+    CHECK(le(h,"level",8)); /* max in UERRA */
+}
+
+static void has_soil_layer(grib_handle* h,const parameter* p,double min,double max)
+{
+    CHECK(get(h,"topLevel") == get(h,"bottomLevel") - 1);
+    CHECK(le(h,"level",8)); /* max in UERRA */
+}
+
 static void six_hourly(grib_handle* h,const parameter* p,double min,double max)
 {
     statistical_process(h,p,min,max);
diff --git a/tigge/tigge_check.h b/tigge/tigge_check.h
index 70629ee..97df55f 100644
--- a/tigge/tigge_check.h
+++ b/tigge/tigge_check.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -429,33 +429,17 @@ parameter parameters[] = {
    },
 
    {
-      "skin_temperature_sfc",
-      180,
-      230,
-      310,
-      355,
-      {
-         {"model", GRIB_TYPE_STRING, 0, "glob"},
-         {"discipline", GRIB_TYPE_LONG, 0},
-         {"parameterCategory", GRIB_TYPE_LONG, 0},
-         {"parameterNumber", GRIB_TYPE_LONG, 17},
-         {"typeOfFirstFixedSurface", GRIB_TYPE_LONG, 1},
-         {NULL, },
-      },
-      {&point_in_time, &predefined_level},
-   },
-
-   {
       "snow_depth_water_equivalent_sfc",
-      -4e-19,
       0,
-      10000,
+      0,
+      100,
       15000,
       {
-         {"model", GRIB_TYPE_STRING, 0, "glob"},
+
          {"discipline", GRIB_TYPE_LONG, 0},
          {"parameterCategory", GRIB_TYPE_LONG, 1},
          {"parameterNumber", GRIB_TYPE_LONG, 60},
+
          {"typeOfFirstFixedSurface", GRIB_TYPE_LONG, 1},
          {NULL, },
       },
@@ -806,13 +790,12 @@ s2s/ammc: warning: s2s.mx2t6_20151224_26.grib2, field 47 [surface_air_maximum_te
  */
    {
       "time_integrated_surface_net_solar_radiation_sfc",
-      -0.1,
+      -10,
       1e+05,
       1e+05,
       1e+07,
       {
          {"model", GRIB_TYPE_STRING, 0, "glob"},
-         {"paramId", GRIB_TYPE_LONG, 176},
          {"discipline", GRIB_TYPE_LONG, 0},
          {"parameterCategory", GRIB_TYPE_LONG, 4},
          {"parameterNumber", GRIB_TYPE_LONG, 9},
@@ -825,13 +808,12 @@ s2s/ammc: warning: s2s.mx2t6_20151224_26.grib2, field 47 [surface_air_maximum_te
 
    {
       "time_integrated_surface_net_solar_radiation_downwards_sfc",
-      -0.1,
-      200000,
+      -10,
+      1e+07,
       1e+05,
       1e+09,
       {
          {"model", GRIB_TYPE_STRING, 0, "glob"},
-         {"paramId", GRIB_TYPE_LONG, 169},
          {"discipline", GRIB_TYPE_LONG, 0},
          {"parameterCategory", GRIB_TYPE_LONG, 4},
          {"parameterNumber", GRIB_TYPE_LONG, 7},
@@ -917,24 +899,6 @@ s2s/ammc: warning: s2s.mx2t6_20151224_26.grib2, field 47 [surface_air_maximum_te
       {&point_in_time, &predefined_thickness},
    },
 
-   {
-      "total_column_water_sfc",
-      0.01,
-      0.3,
-      50,
-      150,
-      {
-         {"model", GRIB_TYPE_STRING, 0, "glob"},
-         {"discipline", GRIB_TYPE_LONG, 0},
-         {"parameterCategory", GRIB_TYPE_LONG, 1},
-         {"parameterNumber", GRIB_TYPE_LONG, 51},
-         {"typeOfFirstFixedSurface", GRIB_TYPE_LONG, 1},
-         {"typeOfSecondFixedSurface", GRIB_TYPE_LONG, 8},
-         {NULL, },
-      },
-      {&point_in_time, &predefined_thickness},
-   },
-
 /*
    hourly extreems for cumulated parameters!
 
@@ -1296,12 +1260,13 @@ s2s/egrr-enfo warning: s2s.z_s2s_c_ukmo_20160520000000_glob_prod_pf_1440_003.rt.
 warning: s2s.z_tigge_c_kwbc_20020817000000_ncep_prod_pf_pl_0000_003_0010_u.grib2, field 3 [u_velocity_pl]: u_velocity_pl maximum value 170.9 is not in [10,170]
    s2s/ammc: warning: s2s.u_20150913_31.grib2, field 550 [u_velocity_pl]: u_velocity_pl minimum value 0.352796 is not in [-150,-0.001]
    s2s/ammc: warning: s2s.u_20151101_13.grib2, field 401 [u_velocity_pl]: u_velocity_pl minimum value -195.645 is not in [-180,1]
+   uerra/edzw-an: warning: /tmp/marm/uerra/cosmo/sample2/grib2/an.200812020800.u.pl.grib2, field 1 [u_velocity_pl]: u_velocity_pl minimum value 1.41138 is not in [-200,1]
 */
    {
       "u_velocity_pl",
       -200,
+      -1,
       1,
-      10,
       200,
       {
          {"model", GRIB_TYPE_STRING, 0, "glob"},
@@ -1330,7 +1295,7 @@ warning: s2s.z_tigge_c_kwbc_20020817000000_ncep_prod_pf_pl_0000_003_0010_u.grib2
       -200,
       -2,
       2,
-      190,
+      200,
       {
          {"model", GRIB_TYPE_STRING, 0, "glob"},
 
@@ -1430,13 +1395,14 @@ warning: s2s.z_tigge_c_kwbc_20150817000000_ncep_prod_pf_pl_0000_015_0500_w.grib2
    },
 /*
 s2s_devel, ecmf, 20141229, 00UTC, test, enfh, real:  s2s.2014122900.test.768.10.pf.19941229.sl.168.grib2, field 21 [surface_pressure_sfc]: surface_pressure_sfc maximum value 102851 is not in [102900,110000]
+uerra, eswi-an: an.sp.sfc.grib2, field 1 [surface_pressure_sfc]: surface_pressure_sfc minimum value 66482.1 is not in [48000,55000]
 */
    {
       "surface_pressure_sfc",
       48000,
-      55000,
-      102500,
-      110000,
+      80000,
+      101500,
+      115000,
       {
          {"model", GRIB_TYPE_STRING, 0, "glob"},
 
@@ -1500,37 +1466,13 @@ s2s_devel, ecmf, 20141229, 00UTC, test, enfh, real:  s2s.2014122900.test.768.10.
       {&from_start, &predefined_level},
    },
 
-/*todo limits*/
-   {
-      "surface_runoff_sfc",
-      -1.5e+6,
-       1.5e+6,
-      -1.5e+6,
-       1.5e+6,
-      {
-         {"model", GRIB_TYPE_STRING, 0, "glob"},
 
-         {"paramId", GRIB_TYPE_LONG, 174008},
-
-         {"discipline", GRIB_TYPE_LONG,2},
-         {"parameterCategory", GRIB_TYPE_LONG,0},
-         {"parameterNumber", GRIB_TYPE_LONG,34},
-
-         {"typeOfStatisticalProcessing", GRIB_TYPE_LONG, 1},
-
-         {"typeOfFirstFixedSurface", GRIB_TYPE_LONG, 1},
-         {NULL, },
-      },
-      {&from_start, &predefined_level},
-   },
-
-/*todo limits*/
    {
       "water_runoff_sfc",
-      -1.5e+6,
-       1.5e+6,
-      -1.5e+6,
-       1.5e+6,
+      -0.001,
+       5,
+       0.5,
+       30,
       {
          {"model", GRIB_TYPE_STRING, 0, "glob"},
 
@@ -1639,27 +1581,22 @@ s2s_devel, ecmf, 20141229, 00UTC, test, enfh, real:  s2s.2014122900.test.768.10.
    S2S/CAWCR: total_column_water_sfc.glob minimum value 0.00832421 is not in [0.01,1]
 warning: s2s.z_tigge_c_kwbc_19990817000000_ncep_prod_cf_sl_0024_000_0000_tcw.grib2, field 33 [total_column_water_sfc.glob]: total_column_water_sfc.glob minimum value -0.168614 is not in [0.001,1]
 warning: s2s.z_tigge_c_kwbc_20090829000000_ncep_prod_pf_sl_0024_003_0000_tcw.grib2, field 11 [total_column_water_sfc.glob]: total_column_water_sfc.glob minimum value -2.00987 is not in [-2,1]
-  => [-2.00987,1]
   lfpw/enfo: warning: s2s.lfpw_tcw_0.grib2, field 10 [total_column_water_sfc.glob.s2]: total_column_water_sfc.glob.s2 minimum value 1.01153 is not in [-3,1]
+  uerra, eswi-an: an.tcw.sfc.grib2, field 1 [total_column_water_sfc]: total_column_water_sfc maximum value 37.9248 is not in [50,150]
 */
    {
-      "total_column_water_sfc.glob.s2",
+      "total_column_water_sfc.s2",
       -3.0,
       2,
-      50,
+      30,
       150,
       {
          {"model", GRIB_TYPE_STRING, 0, "glob"},
          {"class", GRIB_TYPE_STRING, 0, "s2"},
 
-         {"paramId", GRIB_TYPE_LONG, 136},
-
          {"discipline", GRIB_TYPE_LONG, 0},
          {"parameterCategory", GRIB_TYPE_LONG, 1},
          {"parameterNumber", GRIB_TYPE_LONG, 51},
-
-         {"typeOfStatisticalProcessing", GRIB_TYPE_LONG, 0},
-
          {"typeOfFirstFixedSurface", GRIB_TYPE_LONG, 1},
          {"typeOfSecondFixedSurface", GRIB_TYPE_LONG, 8},
          {NULL, },
@@ -1667,6 +1604,23 @@ warning: s2s.z_tigge_c_kwbc_20090829000000_ncep_prod_pf_sl_0024_003_0000_tcw.gri
       {&daily_average, &predefined_thickness},
    },
 
+   {
+      "total_column_water_sfc",
+      -3.0,
+      2,
+      30,
+      150,
+      {
+         {"discipline", GRIB_TYPE_LONG, 0},
+         {"parameterCategory", GRIB_TYPE_LONG, 1},
+         {"parameterNumber", GRIB_TYPE_LONG, 51},
+         {"typeOfFirstFixedSurface", GRIB_TYPE_LONG, 1},
+         {"typeOfSecondFixedSurface", GRIB_TYPE_LONG, 8},
+         {NULL, },
+      },
+      {&point_in_time, &predefined_thickness},
+   },
+
 /*
 s2s/rums warning: s2s.z_s2s_c_rhmc_20150819000000_glob_prod_0336_017.sl.grib2, field 4 [surface_air_temperature_sfc.glob]: surface_air_temperature_sfc.glob minimum value 177.17 is not in [180,290]
 s2s/ammc: warning: s2s.2t_20151224_26.grib2, field 12 [surface_air_temperature_sfc.glob.s2]: surface_air_temperature_sfc.glob.s2 maximum value 353.017 is not in [270,350]
@@ -1721,13 +1675,12 @@ s2s/ammc: warning: s2s.2t_20151224_26.grib2, field 12 [surface_air_temperature_s
    S2S/CAWCR: surface_air_dew_point_temperature_sfc.glob minimum value 32.4337 is not in [175,290]
 */
    {
-      "surface_air_dew_point_temperature_sfc.glob.s2",
+      "surface_air_dew_point_temperature_sfc.s2",
       30,
       290,
       270,
       350,
       {
-         {"model", GRIB_TYPE_STRING, 0, "glob"},
          {"class", GRIB_TYPE_STRING, 0, "s2"},
 
          {"paramId", GRIB_TYPE_LONG, 168},
@@ -1749,25 +1702,20 @@ s2s/kwbc/enfh: warning: s2s.z_s2s_c_rhmc_20150819000000_glob_prod_1464_000.sl.gr
 s2s/rums/enfo warning: s2s.z_s2s_c_rhmc_20150826000000_glob_prod_1392_003.sl.grib2, field 15 [skin_temperature_sfc.glob]: skin_temperature_sfc.glob minimum value 240.467 is not in [180,240]
 s2s/ammc/enfo warning: warning: s2s.skt_20150920_4.grib2, field 12 [skin_temperature_sfc.glob]: skin_temperature_sfc.glob minimum value 179.087 is not in [180,245]
 s2s/ammc/enfo warning: warning: s2s.skt_20160410_21.grib2, field 57 [skin_temperature_sfc.glob.s2]: skin_temperature_sfc.glob.s2 minimum value 164.277 is not in [175,245]
+uerra/egrr/det/an: skin_temperature_sfc minimum value 266.875 is not in [160,250]
 */
    {
-      "skin_temperature_sfc.glob.s2",
+      "skin_temperature_sfc.s2",
       160,
-      245,
+      300,
       300,
       355,
       {
-         {"model", GRIB_TYPE_STRING, 0, "glob"},
          {"class", GRIB_TYPE_STRING, 0, "s2"},
 
-         {"paramId", GRIB_TYPE_LONG, 235},
-
          {"discipline", GRIB_TYPE_LONG, 0},
          {"parameterCategory", GRIB_TYPE_LONG, 0},
          {"parameterNumber", GRIB_TYPE_LONG, 17},
-
-         {"typeOfStatisticalProcessing", GRIB_TYPE_LONG, 0},
-
          {"typeOfFirstFixedSurface", GRIB_TYPE_LONG, 1},
          {NULL, },
       },
@@ -1985,7 +1933,7 @@ warning: s2s.z_tigge_c_kwbc_19990817000000_ncep_prod_cf_sl_0024_000_0000_sd.grib
 */
    {
       "snow_depth_water_equivalent_sfc.glob.s2",
-      -4e-19,
+      0,
       0,
       100,
       15000,
@@ -1993,10 +1941,6 @@ warning: s2s.z_tigge_c_kwbc_19990817000000_ncep_prod_cf_sl_0024_000_0000_sd.grib
          {"model", GRIB_TYPE_STRING, 0, "glob"},
          {"class", GRIB_TYPE_STRING, 0, "s2"},
 
-         {"paramId", GRIB_TYPE_LONG, 228141},
-
-         {"typeOfStatisticalProcessing", GRIB_TYPE_LONG, 0},
-
          {"discipline", GRIB_TYPE_LONG, 0},
          {"parameterCategory", GRIB_TYPE_LONG, 1},
          {"parameterNumber", GRIB_TYPE_LONG, 60},
@@ -2328,10 +2272,10 @@ s2s/ammc/enfo:s2s.tcc_20151004_9.grib2, field 21 [total_cloud_cover_sfc.glob]: t
    },
    {
       "specific_humidity_ml",
-      -1e+10,
-       1e+10,
-      -1e+10,
-       1e+10,
+      -0.1,
+      0.01,
+         0,
+       0.1,
       {
          {"discipline", GRIB_TYPE_LONG, 0},
          {"parameterCategory", GRIB_TYPE_LONG, 1},
@@ -2345,7 +2289,7 @@ s2s/ammc/enfo:s2s.tcc_20151004_9.grib2, field 21 [total_cloud_cover_sfc.glob]: t
    {
       "temperature_ml",
       150,
-      270,
+      300,
       200,
       330,
       {
@@ -2359,12 +2303,17 @@ s2s/ammc/enfo:s2s.tcc_20151004_9.grib2, field 21 [total_cloud_cover_sfc.glob]: t
       },
       {&point_in_time, &given_level}, /* check model levels?? */
    },
+
+/*
+  uerra, eswi-an: an.200812020000+0.ml.grib2, field 3 [u_velocity_ml]: u_velocity_ml minimum value 1.55574 is not in [-200,1]
+  uerra, egrr-det-fc: u_velocity_ml maximum value 0.625 is not in [1,200]
+*/
    {
       "u_velocity_ml",
       -200,
-      1,
-      10,
-      200,
+         5,
+       0.1,
+       200,
       {
          {"paramId", GRIB_TYPE_LONG, 131},
          {"discipline", GRIB_TYPE_LONG, 0},
@@ -2378,10 +2327,10 @@ s2s/ammc/enfo:s2s.tcc_20151004_9.grib2, field 21 [total_cloud_cover_sfc.glob]: t
    },
    {
       "v_velocity_ml",
-      -190,
-      -4,
-      4,
-      190,
+      -200,
+      -1,
+      1,
+      200,
       {
          {"paramId", GRIB_TYPE_LONG, 132},
          {"discipline", GRIB_TYPE_LONG, 0},
@@ -2397,7 +2346,7 @@ s2s/ammc/enfo:s2s.tcc_20151004_9.grib2, field 21 [total_cloud_cover_sfc.glob]: t
       "cloud_cover_ml",
       0,
       1e-10,
-      100,
+      0,
       100.00001,
       {
          {"discipline", GRIB_TYPE_LONG, 0},
@@ -2412,9 +2361,13 @@ s2s/ammc/enfo:s2s.tcc_20151004_9.grib2, field 21 [total_cloud_cover_sfc.glob]: t
 
    /* pressure level */
 
+/* 
+uerra:edzw-an warning: /tmp/marm/uerra/cosmo/sample2/grib2/fc.200812021200+27.pl.grib2, field 76 [geopotential_height_pl.ur]: geopotential_height_pl.ur minimum value -2938.29 is not in [-1300,300000]
+*/
+
    {
       "geopotential_height_pl.ur",
-      -1300,
+      -5000,
       300000,
       2000,
       350000,
@@ -2433,11 +2386,12 @@ s2s/ammc/enfo:s2s.tcc_20151004_9.grib2, field 21 [total_cloud_cover_sfc.glob]: t
 
    {
       "specific_cloud_ice_water_content_pl",
-      -1e+10,
-       1e+10,
-      -1e+10,
-       1e+10,
+       0,
+       0.001,
+       0,
+       0.01,
       {
+         {"paramId", GRIB_TYPE_LONG, 247},
          {"discipline", GRIB_TYPE_LONG, 0},
          {"parameterCategory", GRIB_TYPE_LONG, 1},
          {"parameterNumber", GRIB_TYPE_LONG, 84},
@@ -2466,10 +2420,10 @@ s2s/ammc/enfo:s2s.tcc_20151004_9.grib2, field 21 [total_cloud_cover_sfc.glob]: t
    },
    {
       "specific_cloud_liquid_water_content_pl",
-      -1e+10,
-       1e+10,
-      -1e+10,
-       1e+10,
+       0,
+       1e+5,
+       0,
+       1e+6,
       {
          {"discipline", GRIB_TYPE_LONG, 0},
          {"parameterCategory", GRIB_TYPE_LONG, 1},
@@ -2482,10 +2436,10 @@ s2s/ammc/enfo:s2s.tcc_20151004_9.grib2, field 21 [total_cloud_cover_sfc.glob]: t
    },
    {
       "specific_cloud_ice_water_content_ml",
-      -1e+10,
-       1e+10,
-      -1e+10,
-       1e+10,
+       0,
+       0.001,
+       0,
+       0.01,
       {
          {"discipline", GRIB_TYPE_LONG, 0},
          {"parameterCategory", GRIB_TYPE_LONG, 1},
@@ -2498,10 +2452,10 @@ s2s/ammc/enfo:s2s.tcc_20151004_9.grib2, field 21 [total_cloud_cover_sfc.glob]: t
    },
    {
       "specific_cloud_liquid_water_content_ml",
-      -1e+10,
-       1e+10,
-      -1e+10,
-       1e+10,
+       0,
+       1e+5,
+       0,
+       1e+6,
       {
          {"discipline", GRIB_TYPE_LONG, 0},
          {"parameterCategory", GRIB_TYPE_LONG, 1},
@@ -2514,10 +2468,10 @@ s2s/ammc/enfo:s2s.tcc_20151004_9.grib2, field 21 [total_cloud_cover_sfc.glob]: t
    },
    {
       "relative_humidity_pl",
-      -1e+10,
-       1e+10,
-      -1e+10,
-       1e+10,
+       0,
+       20,
+       0,
+       100.01,
       {
          {"paramId", GRIB_TYPE_LONG, 157},
          {"discipline", GRIB_TYPE_LONG, 0},
@@ -2536,7 +2490,7 @@ s2s/ammc/enfo:s2s.tcc_20151004_9.grib2, field 21 [total_cloud_cover_sfc.glob]: t
       "cloud_cover_hl",
       0,
       1e-10,
-      100,
+      80,
       100.00001,
       {
          {"discipline", GRIB_TYPE_LONG, 0},
@@ -2566,10 +2520,10 @@ s2s/ammc/enfo:s2s.tcc_20151004_9.grib2, field 21 [total_cloud_cover_sfc.glob]: t
    },
    {
       "specific_cloud_liquid_water_content_hl",
-      -1e+10,
-       1e+10,
-      -1e+10,
-       1e+10,
+       0,
+       1e+5,
+       0,
+       1e+6,
       {
          {"discipline", GRIB_TYPE_LONG, 0},
          {"parameterCategory", GRIB_TYPE_LONG, 1},
@@ -2582,10 +2536,10 @@ s2s/ammc/enfo:s2s.tcc_20151004_9.grib2, field 21 [total_cloud_cover_sfc.glob]: t
    },
    {
       "specific_cloud_ice_water_content_hl",
-      -1e+10,
-       1e+10,
-      -1e+10,
-       1e+10,
+       0,
+       0.001,
+       0,
+       0.01,
       {
          {"discipline", GRIB_TYPE_LONG, 0},
          {"parameterCategory", GRIB_TYPE_LONG, 1},
@@ -2599,9 +2553,9 @@ s2s/ammc/enfo:s2s.tcc_20151004_9.grib2, field 21 [total_cloud_cover_sfc.glob]: t
    {
       "relative_humidity_hl",
       0,
-      10,
-      90,
-      100.1,
+      20,
+      1,
+      100.01,
       {
          {"paramId", GRIB_TYPE_LONG, 157},
          {"discipline", GRIB_TYPE_LONG, 0},
@@ -2616,7 +2570,7 @@ s2s/ammc/enfo:s2s.tcc_20151004_9.grib2, field 21 [total_cloud_cover_sfc.glob]: t
    {
       "temperature_hl",
       150,
-      270,
+      300,
       200,
       330,
       {
@@ -2632,7 +2586,7 @@ s2s/ammc/enfo:s2s.tcc_20151004_9.grib2, field 21 [total_cloud_cover_sfc.glob]: t
    },
    {
       "wind_speed_hl",
-      0.001,
+      0,
       10,
       10,
       150,
@@ -2650,9 +2604,9 @@ s2s/ammc/enfo:s2s.tcc_20151004_9.grib2, field 21 [total_cloud_cover_sfc.glob]: t
    {
       "wind_direction_hl",
       0,
-      0.01,
+      1,
       359,
-      360,
+      360.1,
       {
          {"paramId", GRIB_TYPE_LONG, 3031},
          {"discipline", GRIB_TYPE_LONG, 0},
@@ -2667,12 +2621,15 @@ s2s/ammc/enfo:s2s.tcc_20151004_9.grib2, field 21 [total_cloud_cover_sfc.glob]: t
 
    /* uerra single level (surface) */
 
+/*
+  uerra, eswi-fc: percolation_sfc maximum value 0.971001 is not in [1,30]
+*/
    {
       "percolation_sfc",
-      -1e+10, /* TBD xxx */
-       1e+10,
-      -1e+10,
-       1e+10,
+      0,
+      1,
+      0.8,
+      30,
       {
          {"paramId", GRIB_TYPE_LONG, 260430},
          {"discipline", GRIB_TYPE_LONG, 1},
@@ -2687,7 +2644,7 @@ s2s/ammc/enfo:s2s.tcc_20151004_9.grib2, field 21 [total_cloud_cover_sfc.glob]: t
    {
       "2_metre_relative_humidity",
       0,
-      10,
+      25,
       90,
       100.1,
       {
@@ -2700,12 +2657,16 @@ s2s/ammc/enfo:s2s.tcc_20151004_9.grib2, field 21 [total_cloud_cover_sfc.glob]: t
       },
       {&point_in_time, &given_level},
    },
+
+/*
+  s2s, babj-enfo: surface_runoff maximum value 0.479167 is not in [1,100]
+*/
    {
       "surface_runoff",
-      -1e+10,
-       1e+10,
-      -1e+10,
-       1e+10,
+      -0.001,
+      1,
+      0.1,
+      100,
       {
          {"paramId", GRIB_TYPE_LONG, 174008},
          {"discipline", GRIB_TYPE_LONG, 2},
@@ -2717,13 +2678,38 @@ s2s/ammc/enfo:s2s.tcc_20151004_9.grib2, field 21 [total_cloud_cover_sfc.glob]: t
       },
       {&from_start, &predefined_level},
    },
+
+/*
+  uerra, cosmo-fc:albedo_sfc maximum value 70 is not in [80,100]
+*/
    {
       "albedo_sfc",
       0,
-      5,
-      90,
+      20,
+      60,
+      100,
+      {
+         {"paramId", GRIB_TYPE_LONG, 260509},
+         {"discipline", GRIB_TYPE_LONG, 0},
+         {"parameterCategory", GRIB_TYPE_LONG, 19},
+         {"parameterNumber", GRIB_TYPE_LONG, 1},
+         {"typeOfFirstFixedSurface", GRIB_TYPE_LONG, 1},
+         {NULL, },
+      },
+      {&point_in_time, &predefined_level},
+   },
+/*
+  uerra, egrr:  The albedo is 0 at night because it is dependent on solar radiation
+*/
+   {
+      "albedo_sfc.uerra-egrr",
+      0,
+      20,
+      0,
       100,
       {
+         {"class", GRIB_TYPE_STRING, 0, "ur"},
+         {"centre", GRIB_TYPE_STRING, 1, "egrr"},
          {"paramId", GRIB_TYPE_LONG, 260509},
          {"discipline", GRIB_TYPE_LONG, 0},
          {"parameterCategory", GRIB_TYPE_LONG, 19},
@@ -2736,8 +2722,8 @@ s2s/ammc/enfo:s2s.tcc_20151004_9.grib2, field 21 [total_cloud_cover_sfc.glob]: t
    {
       "time_integrated_surface_clear-sky_solar_radiation_downwards",
       -0.1,
-      200000,
-      1e+05,
+      1e+08,
+      0,
       1e+09,
       {
          {"paramId", GRIB_TYPE_LONG, 260423},
@@ -2753,8 +2739,8 @@ s2s/ammc/enfo:s2s.tcc_20151004_9.grib2, field 21 [total_cloud_cover_sfc.glob]: t
    {
       "time_integrated_surface_clear-sky_solar_radiation_upwards",
       -0.1,
-      200000,
-      1e+05,
+      1e+08,
+      0,
       1e+09,
       {
          {"paramId", GRIB_TYPE_LONG, 260427},
@@ -2769,10 +2755,10 @@ s2s/ammc/enfo:s2s.tcc_20151004_9.grib2, field 21 [total_cloud_cover_sfc.glob]: t
    },
    {
       "time_integrated_surface_clear-sky_thermal_radiation_downwards",
-      -1e+10,
-       1e+10,
-      -1e+10,
-       1e+10,
+      -0.1,
+      1e+08,
+      0,
+      1e+09,
       {
          {"paramId", GRIB_TYPE_LONG, 260428},
          {"discipline", GRIB_TYPE_LONG, 0},
@@ -2784,13 +2770,18 @@ s2s/ammc/enfo:s2s.tcc_20151004_9.grib2, field 21 [total_cloud_cover_sfc.glob]: t
       },
       {&from_start, &predefined_level},
    },
+
+/*
+  uerra, eswi-fc: fc.tidirswrf.sfc.grib2, field 6 [time_integrated_surface_direct_solar_radiation]: time_integrated_surface_direct_solar_radiation minimum value 58442 is not in [-0.1,20000]
+*/
    {
-      "time_integrated_surface_direct_solar_radiation",
-      -0.1,
-      20000,
-      1e+05,
+      "time_integrated_surface_direct_solar_radiation.ur",
+      -10,
+      1e+08,
+      0,
       1e+09,
       {
+         {"class", GRIB_TYPE_STRING, 0, "ur"},
          {"paramId", GRIB_TYPE_LONG, 260264},
          {"discipline", GRIB_TYPE_LONG, 0},
          {"parameterCategory", GRIB_TYPE_LONG, 4},
@@ -2801,12 +2792,54 @@ s2s/ammc/enfo:s2s.tcc_20151004_9.grib2, field 21 [total_cloud_cover_sfc.glob]: t
       },
       {&from_start, &predefined_level},
    },
+
+/*
+  s2s, lfpw-enfo:  time_integrated_surface_net_solar_radiation_downwards_sfc minimum value -1.02308 is not in [-1,1e+07]
+*/
+
+   {
+      "time_integrated_surface_net_solar_radiation_downwards_sfc.ur",
+      -10,
+      1e+08,
+      0,
+      1e+09,
+      {
+         {"class", GRIB_TYPE_STRING, 0, "ur"},
+         {"paramId", GRIB_TYPE_LONG, 169},
+         {"discipline", GRIB_TYPE_LONG, 0},
+         {"parameterCategory", GRIB_TYPE_LONG, 4},
+         {"parameterNumber", GRIB_TYPE_LONG, 7},
+         {"typeOfFirstFixedSurface", GRIB_TYPE_LONG, 1},
+         {"typeOfStatisticalProcessing", GRIB_TYPE_LONG, 1},
+         {NULL, },
+      },
+      {&from_start, &predefined_level},
+   },
+   {
+      "time_integrated_surface_net_solar_radiation_sfc.ur",
+      -0.1,
+      1e+08,
+      0,
+      1e+09,
+      {
+         {"class", GRIB_TYPE_STRING, 0, "ur"},
+         {"paramId", GRIB_TYPE_LONG, 176},
+         {"discipline", GRIB_TYPE_LONG, 0},
+         {"parameterCategory", GRIB_TYPE_LONG, 4},
+         {"parameterNumber", GRIB_TYPE_LONG, 9},
+         {"typeOfStatisticalProcessing", GRIB_TYPE_LONG, 1},
+         {"typeOfFirstFixedSurface", GRIB_TYPE_LONG, 1},
+         {NULL, },
+      },
+      {&from_start, &predefined_level},
+   },
+
    {
       "10_metre_wind_speed",
-      0.001,
+      0,
       10,
       10,
-      150,
+      300,
       {
          {"paramId", GRIB_TYPE_LONG, 207},
          {"discipline", GRIB_TYPE_LONG, 0},
@@ -2819,12 +2852,15 @@ s2s/ammc/enfo:s2s.tcc_20151004_9.grib2, field 21 [total_cloud_cover_sfc.glob]: t
       },
       {&point_in_time, &given_level},
    },
+/*
+  uerra, cosmo-fc: 10_metre_wind_direction maximum value 360.001 is not in [359,360]
+*/
    {
       "10_metre_wind_direction",
       0,
-      0.001,
-      359.999,
-      360,
+      0.1,
+      359.,
+      360.01,
       {
          {"paramId", GRIB_TYPE_LONG, 260260},
          {"discipline", GRIB_TYPE_LONG, 0},
@@ -2895,10 +2931,10 @@ s2s/ammc/enfo:s2s.tcc_20151004_9.grib2, field 21 [total_cloud_cover_sfc.glob]: t
    },
    {
       "evaporation_sfc",
-      -1e+10,
-       1e+10,
-      -1e+10,
-       1e+10,
+      -10,
+       0,
+       0,
+       5,
       {
          {"paramId", GRIB_TYPE_LONG, 260259},
          {"discipline", GRIB_TYPE_LONG, 0},
@@ -2912,10 +2948,10 @@ s2s/ammc/enfo:s2s.tcc_20151004_9.grib2, field 21 [total_cloud_cover_sfc.glob]: t
    },
    {
       "snow_depth_sfc",
-      -1e+10,
-       1e+10,
-      -1e+10,
-       1e+10,
+       0,
+       0,
+       0,
+       5,
       {
          {"paramId", GRIB_TYPE_LONG, 3066},
          {"discipline", GRIB_TYPE_LONG, 0},
@@ -2926,12 +2962,17 @@ s2s/ammc/enfo:s2s.tcc_20151004_9.grib2, field 21 [total_cloud_cover_sfc.glob]: t
       },
       {&point_in_time, &predefined_level},
    },
+
+/*
+  uerra, cosmo-det-an: surface_roughness_sfc maximum value 9.36719 is not in [1.3,1.8]
+  uerra, egrr:  surface roughness is fixed at 0.5 over land and is close to 0 over sea
+*/
    {
       "surface_roughness_sfc",
-      -1e+10,
-       1e+10,
-      -1e+10,
-       1e+10,
+       0,
+       0.001,
+       0.5,
+       10,
       {
          {"paramId", GRIB_TYPE_LONG, 173},
          {"discipline", GRIB_TYPE_LONG, 2},
@@ -2944,10 +2985,10 @@ s2s/ammc/enfo:s2s.tcc_20151004_9.grib2, field 21 [total_cloud_cover_sfc.glob]: t
    },
    {
       "liquid_non-frozen_soil_moisture_level",
-      -1e-19,
       0,
-      450,
-      800,
+      0.1,
+      0.1,
+      1,
       {
          {"paramId", GRIB_TYPE_LONG, 260210},
          {"discipline", GRIB_TYPE_LONG, 2},
@@ -2956,14 +2997,14 @@ s2s/ammc/enfo:s2s.tcc_20151004_9.grib2, field 21 [total_cloud_cover_sfc.glob]: t
          {"typeOfFirstFixedSurface", GRIB_TYPE_LONG, 151},
          {NULL, },
       },
-      {&point_in_time, &given_level},
+      {&point_in_time, &given_level, &has_bitmap, &has_soil_level},
    },
    {
       "liquid_non-frozen_soil_moisture_layer",
-      -1e-19,
       0,
-      450,
-      800,
+      0.1,
+      0.1,
+      1,
       {
          {"paramId", GRIB_TYPE_LONG, 260210},
          {"discipline", GRIB_TYPE_LONG, 2},
@@ -2975,14 +3016,14 @@ s2s/ammc/enfo:s2s.tcc_20151004_9.grib2, field 21 [total_cloud_cover_sfc.glob]: t
          {"scaleFactorOfSecondFixedSurface", GRIB_TYPE_LONG, 0},
          {NULL, },
       },
-      {&point_in_time, &given_thickness},
+      {&point_in_time, &given_thickness, &has_bitmap, &has_soil_layer},
    },
    {
       "volumetric_soil_moisture_level",
-      -1e-19,
       0,
-      450,
-      800,
+      0.1,
+      0.1,
+      1,
       {
          {"paramId", GRIB_TYPE_LONG, 260199},
          {"discipline", GRIB_TYPE_LONG, 2},
@@ -2991,14 +3032,14 @@ s2s/ammc/enfo:s2s.tcc_20151004_9.grib2, field 21 [total_cloud_cover_sfc.glob]: t
          {"typeOfFirstFixedSurface", GRIB_TYPE_LONG, 151},
          {NULL, },
       },
-      {&point_in_time, &given_level},
+      {&point_in_time, &given_level, &has_bitmap, &has_soil_level},
    },
    {
       "volumetric_soil_moisture_layer",
-      -1e-19,
       0,
-      450,
-      800,
+      0.1,
+      0.1,
+      1,
       {
          {"paramId", GRIB_TYPE_LONG, 260199},
          {"discipline", GRIB_TYPE_LONG, 2},
@@ -3010,14 +3051,14 @@ s2s/ammc/enfo:s2s.tcc_20151004_9.grib2, field 21 [total_cloud_cover_sfc.glob]: t
          {"scaleFactorOfSecondFixedSurface", GRIB_TYPE_LONG, 0},
          {NULL, },
       },
-      {&point_in_time, &given_thickness},
+      {&point_in_time, &given_thickness, &has_bitmap, &has_soil_layer},
    },
    {
       "soil_heat_flux_sfc",
-      -1e+10,
-       1e+10,
-      -1e+10,
-       1e+10,
+      -1000,
+        -10,
+         10,
+       1000,
       {
          {"paramId", GRIB_TYPE_LONG, 260364},
          {"discipline", GRIB_TYPE_LONG, 2},
@@ -3028,11 +3069,16 @@ s2s/ammc/enfo:s2s.tcc_20151004_9.grib2, field 21 [total_cloud_cover_sfc.glob]: t
       },
       {&point_in_time, &predefined_level},
    },
+
+/*
+  uerra, cosmo-an: soil_temperature_level maximum value 296.188 is not in [300,350]
+  uerra, eswi: soil_temperature_level minimum value 199.649 is not in [200,270]
+*/
    {
       "soil_temperature_level",
-      200,
-      230,
-      300,
+      180,
+      270,
+      280,
       350,
       {
          {"paramId", GRIB_TYPE_LONG, 260360},
@@ -3043,13 +3089,16 @@ s2s/ammc/enfo:s2s.tcc_20151004_9.grib2, field 21 [total_cloud_cover_sfc.glob]: t
          {"scaleFactorOfFirstFixedSurface", GRIB_TYPE_LONG, 0},
          {NULL, },
       },
-      {&point_in_time, &given_level},
+      {&point_in_time, &given_level, &has_bitmap, &has_soil_level},
    },
 
+/*
+  uerra, egrr-an-enda: soil_temperature_layer minimum value 273.125 is not in [200,230]
+*/
    {
       "soil_temperature_layer",
       200,
-      230,
+      280,
       300,
       350,
       {
@@ -3063,19 +3112,83 @@ s2s/ammc/enfo:s2s.tcc_20151004_9.grib2, field 21 [total_cloud_cover_sfc.glob]: t
          {"scaleFactorOfSecondFixedSurface", GRIB_TYPE_LONG, 0},
          {NULL, },
       },
-      {&point_in_time, &given_thickness},
+      {&point_in_time, &given_thickness, &has_bitmap, &has_soil_layer},
    },
+
    {
-      "total_column_water_sfc.ur",
+      "w_vertical_velocity_pl",
+      -20,
+      0,
       0,
-      0.5,
       20,
-      150,
       {
          {"class", GRIB_TYPE_STRING, 0, "ur"},
+         {"paramId", GRIB_TYPE_LONG, 135},
+         {"discipline", GRIB_TYPE_LONG, 0},
+         {"parameterCategory", GRIB_TYPE_LONG, 2},
+         {"parameterNumber", GRIB_TYPE_LONG, 8},
+
+         {"typeOfFirstFixedSurface", GRIB_TYPE_LONG, 100},
+         {NULL, },
+      },
+      {&point_in_time, &given_level, &pressure_level},
+   },
+   {
+      "cloud_cover_pl.ur",
+      0,
+      1e-10,
+      0,
+      100,
+      {
+         {"class", GRIB_TYPE_STRING, 0, "ur"},
+         {"discipline", GRIB_TYPE_LONG, 0},
+         {"parameterCategory", GRIB_TYPE_LONG, 6},
+         {"parameterNumber", GRIB_TYPE_LONG, 22},
+         {"typeOfFirstFixedSurface", GRIB_TYPE_LONG, 100},
+         {"scaleFactorOfFirstFixedSurface", GRIB_TYPE_LONG, 0},
+         {NULL, },
+      },
+      {&point_in_time, &given_level, &pressure_level},
+   },
+
+/*
+ ========================
+ this skin_temperature_sfc  must be matched by tigge and uerra (not s2s!) 
+ ========================
+
+ uerra, cosmo-an: skin_temperature_sfc minimum value 245.905 is not in [160,245]
+ uerra, eswi-fc: skin_temperature_sfc maximum value 298.942 is not in [300,355]
+*/
+   {
+      "skin_temperature_sfc",
+      160,
+      300,
+      280,
+      355,
+      {
+         {"paramId", GRIB_TYPE_LONG, 235},
+         {"discipline", GRIB_TYPE_LONG, 0},
+         {"parameterCategory", GRIB_TYPE_LONG, 0},
+         {"parameterNumber", GRIB_TYPE_LONG, 17},
+         {"typeOfFirstFixedSurface", GRIB_TYPE_LONG, 1},
+         {NULL, },
+      },
+      {&point_in_time, &predefined_level},
+   },
+
+/*
+  uerra, egrr-det-an: total_column_water_vapour_sfc minimum value 5.57326 is not in [-3,2]
+*/
+   {
+      "total_column_water_vapour_sfc",
+      -3.0,
+      10,
+      30,
+      150,
+      {
          {"discipline", GRIB_TYPE_LONG, 0},
          {"parameterCategory", GRIB_TYPE_LONG, 1},
-         {"parameterNumber", GRIB_TYPE_LONG, 51},
+         {"parameterNumber", GRIB_TYPE_LONG, 64},
          {"typeOfFirstFixedSurface", GRIB_TYPE_LONG, 1},
          {"typeOfSecondFixedSurface", GRIB_TYPE_LONG, 8},
          {NULL, },
@@ -3083,23 +3196,70 @@ s2s/ammc/enfo:s2s.tcc_20151004_9.grib2, field 21 [total_cloud_cover_sfc.glob]: t
       {&point_in_time, &predefined_thickness},
    },
 
+ /*
+uerra, eswi-enfo:total_cloud_cover_sfc maximum value 96.4844 is not in [100,100]
+ */
    {
-      "w_vertical_velocity_pl",
-      -20,
-      0,
+      "total_cloud_cover_sfc.ur.eswi",
       0,
-      20,
+      1e-10,
+      90.,
+      100.,
       {
          {"class", GRIB_TYPE_STRING, 0, "ur"},
-         {"paramId", GRIB_TYPE_LONG, 135},
+         {"centre", GRIB_TYPE_STRING, 1, "eswi"},
+
+         {"discipline", GRIB_TYPE_LONG, 0},
+         {"parameterCategory", GRIB_TYPE_LONG, 6},
+         {"parameterNumber", GRIB_TYPE_LONG, 1},
+
+         {"typeOfFirstFixedSurface", GRIB_TYPE_LONG, 1},
+         {"typeOfSecondFixedSurface", GRIB_TYPE_LONG, 8},
+         {NULL, },
+      },
+      {&point_in_time, &predefined_thickness},
+   },
+
+/*
+ uerra, cosmo-det-an: u_velocity_pl minimum value 1.40681 is not in [-200,-1]
+*/
+   {
+      "u_velocity_pl",
+      -200,
+      5,
+      1,
+      200,
+      {
+         {"class", GRIB_TYPE_STRING, 0, "ur"},
+
+         {"paramId", GRIB_TYPE_LONG, 131},
+
          {"discipline", GRIB_TYPE_LONG, 0},
          {"parameterCategory", GRIB_TYPE_LONG, 2},
-         {"parameterNumber", GRIB_TYPE_LONG, 8},
+         {"parameterNumber", GRIB_TYPE_LONG, 2},
 
          {"typeOfFirstFixedSurface", GRIB_TYPE_LONG, 100},
          {NULL, },
       },
       {&point_in_time, &given_level, &pressure_level},
    },
+   {
+      "soil_depth",
+      0.005,
+      100,
+      0.005,
+      100,
+      {
+         {"paramId", GRIB_TYPE_LONG, 260367},
+         {"discipline", GRIB_TYPE_LONG, 2},
+         {"parameterCategory", GRIB_TYPE_LONG, 3},
+         {"parameterNumber", GRIB_TYPE_LONG, 27},
+         {"typeOfFirstFixedSurface", GRIB_TYPE_LONG, 151},
+         {"scaleFactorOfFirstFixedSurface", GRIB_TYPE_LONG, 0},
+         {NULL, },
+      },
+      {&point_in_time, &given_level, &has_bitmap, &has_soil_level},
+   },
+
 };
 
diff --git a/tigge/tigge_name.c b/tigge/tigge_name.c
index 891cf21..0bdffce 100755
--- a/tigge/tigge_name.c
+++ b/tigge/tigge_name.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tigge/tigge_split.c b/tigge/tigge_split.c
index 1f59ac5..c155ab5 100755
--- a/tigge/tigge_split.c
+++ b/tigge/tigge_split.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt
index 7efefdf..18baf6a 100644
--- a/tools/CMakeLists.txt
+++ b/tools/CMakeLists.txt
@@ -1,5 +1,5 @@
 #
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/Makefile.am b/tools/Makefile.am
index dbc494a..5e59c15 100644
--- a/tools/Makefile.am
+++ b/tools/Makefile.am
@@ -19,8 +19,9 @@ bin_PROGRAMS = grib_histogram big2gribex \
                gg_sub_area_check grib_to_netcdf grib_to_json \
                bufr_count codes_bufr_filter bufr_ls bufr_dump bufr_set bufr_get \
                bufr_copy bufr_compare bufr_index_build \
-               gts_copy gts_dump gts_filter gts_ls \
-							 metar_dump metar_ls
+               gts_copy gts_dump gts_filter gts_ls gts_get gts_compare \
+               metar_dump metar_ls metar_compare metar_copy metar_filter metar_get
+
 
 noinst_PROGRAMS =  gaussian mars_request xref #compile #dumpload grib_compare_old
 
@@ -67,14 +68,20 @@ bufr_compare_SOURCES   = bufr_compare.c
 bufr_index_build_SOURCES   = bufr_index_build.c
 
 gts_copy_SOURCES = gts_copy.c
+gts_compare_SOURCES = gts_compare.c
 gts_dump_SOURCES = gts_dump.c
 gts_filter_SOURCES = gts_filter.c
-#gts_get_SOURCES = gts_get.c
+gts_get_SOURCES = gts_get.c
 gts_ls_SOURCES = gts_ls.c
 
 metar_dump_SOURCES = metar_dump.c
 metar_ls_SOURCES = metar_ls.c
 
+metar_compare_SOURCES = metar_compare.c
+metar_copy_SOURCES = metar_copy.c
+metar_filter_SOURCES = metar_filter.c
+metar_get_SOURCES = metar_get.c
+
 INCLUDES =  -I$(top_builddir)/src
 
 LDADD = libgrib_tools.la $(top_builddir)/src/libeccodes.la
diff --git a/tools/big2gribex.c b/tools/big2gribex.c
index 0f22b61..c1f8025 100644
--- a/tools/big2gribex.c
+++ b/tools/big2gribex.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/bufr_3to4.c b/tools/bufr_3to4.c
index 253438d..0589e2e 100644
--- a/tools/bufr_3to4.c
+++ b/tools/bufr_3to4.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/bufr_compare.c b/tools/bufr_compare.c
index 468c1e8..6837abc 100644
--- a/tools/bufr_compare.c
+++ b/tools/bufr_compare.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -584,6 +584,13 @@ static void save_error(grib_context* c,const char* key)
     }
 }
 
+static char* double_as_string(grib_context* c, double v)
+{
+    char* sval=grib_context_malloc_clear(c, sizeof(char)*40);
+    if (v == GRIB_MISSING_DOUBLE) sprintf(sval,"MISSING");
+    else                          sprintf(sval,"%.20e",v);
+    return sval;
+}
 static int compare_values(grib_runtime_options* options, grib_handle* handle1, grib_handle *handle2, const char *name, int type)
 {
     size_t len1 = 0;
@@ -735,8 +742,7 @@ static int compare_values(grib_runtime_options* options, grib_handle* handle1, g
             if(grib_inline_strcmp(sval1,sval2) != 0)
             {
                 printInfo(handle1);
-                printf("string [%s]: [%s] != [%s]\n",
-                        name,sval1,sval2);
+                printf("string [%s]: [%s] != [%s]\n", name, sval1, sval2);
                 err1 = GRIB_VALUE_MISMATCH;
                 save_error(c,name);
             }
@@ -791,15 +797,12 @@ static int compare_values(grib_runtime_options* options, grib_handle* handle1, g
                 save_error(c,name);
                 err1 = GRIB_VALUE_MISMATCH;
                 if(len1 == 1)
-                    printf("long [%s]: [%ld] != [%ld]\n",
-                            name,*lval1,*lval2);
+                    printf("long [%s]: [%ld] != [%ld]\n", name, *lval1, *lval2);
                 else
-                    printf("long [%s] %d out of %ld different\n",
-                            name,countdiff,(long)len1);
+                    printf("long [%s] %d out of %ld different\n", name, countdiff, (long)len1);
             }
         }
 
-
         grib_context_free(handle1->context,lval1);
         grib_context_free(handle2->context,lval2);
 
@@ -906,13 +909,22 @@ static int compare_values(grib_runtime_options* options, grib_handle* handle1, g
                 save_error(c,name);
                 if (len1>1) {
                     printf("double [%s]: %d out of %ld different\n",name,countdiff,(long)len1);
-                    if (compareAbsolute) printf(" max");
-                    printf(" absolute diff. = %.16e,",fabs(dval1[imaxdiff]-dval2[imaxdiff]));
-                    if (!compareAbsolute) printf(" max");
-                    printf(" relative diff. = %g",relative_error(dval1[imaxdiff],dval2[imaxdiff],value_tolerance));
-                    printf("\n\tmax diff. element %d: %.20e %.20e",
-                            imaxdiff,dval1[imaxdiff],dval2[imaxdiff]);
-                    printf("\n\ttolerance=%.16e",value_tolerance);
+                    if (dval1[imaxdiff] != GRIB_MISSING_DOUBLE && dval2[imaxdiff] != GRIB_MISSING_DOUBLE) {
+                        if (compareAbsolute) printf(" max");
+                        printf(" absolute diff. = %.16e,",fabs(dval1[imaxdiff]-dval2[imaxdiff]));
+                        if (!compareAbsolute) printf(" max");
+                        printf(" relative diff. = %g",relative_error(dval1[imaxdiff],dval2[imaxdiff],value_tolerance));
+                        printf("\n\tmax diff. element %d: %.20e %.20e",
+                                imaxdiff,dval1[imaxdiff],dval2[imaxdiff]);
+                        printf("\n\ttolerance=%.16e",value_tolerance);
+                    } else {
+                        /* One or both values are missing */
+                        char* sval1 = double_as_string(c, dval1[imaxdiff]);
+                        char* sval2 = double_as_string(c, dval2[imaxdiff]);
+                        printf("\tdiff. element %d: %s %s", imaxdiff, sval1, sval2);
+                        grib_context_free(c,sval1);
+                        grib_context_free(c,sval2);
+                    }
                     if (packingError2!=0 || packingError1!=0)
                         printf(" packingError: [%g] [%g]",packingError1,packingError2);
 
@@ -927,11 +939,19 @@ static int compare_values(grib_runtime_options* options, grib_handle* handle1, g
                     }
                     printf("\n");
                 } else {
-                    printf("double [%s]: [%.20e] != [%.20e]\n",
-                            name,dval1[0],dval2[0]);
-                    printf("\tabsolute diff. = %g,",fabs(dval1[0]-dval2[0]));
-                    printf(" relative diff. = %g\n",relative_error(dval1[0],dval2[0],value_tolerance));
-                    printf("\ttolerance=%g\n",value_tolerance);
+                    if (dval1[0] != GRIB_MISSING_DOUBLE && dval2[0] != GRIB_MISSING_DOUBLE) {
+                        printf("double [%s]: [%.20e] != [%.20e]\n", name, dval1[0], dval2[0]);
+                        printf("\tabsolute diff. = %g,",fabs(dval1[0]-dval2[0]));
+                        printf(" relative diff. = %g\n",relative_error(dval1[0],dval2[0],value_tolerance));
+                        printf("\ttolerance=%g\n",value_tolerance);
+                    } else {
+                        /* One or both values are missing */
+                        char* sval1 = double_as_string(c, dval1[0]);
+                        char* sval2 = double_as_string(c, dval2[0]);
+                        printf("double [%s]: [%s] != [%s]\n", name, sval1, sval2);
+                        grib_context_free(c,sval1);
+                        grib_context_free(c,sval2);
+                    }
                 }
             }
         }
@@ -972,7 +992,7 @@ static int compare_values(grib_runtime_options* options, grib_handle* handle1, g
             if(memcmp(uval1,uval2,len1) != 0)
             {
                 int i;
-                for(i = 0; i < len1; i++)
+                for(i = 0; i < len1; i++) {
                     if(uval1[i] != uval2[i])
                     {
                         printInfo(handle1);
@@ -987,6 +1007,7 @@ static int compare_values(grib_runtime_options* options, grib_handle* handle1, g
                         err1 = GRIB_VALUE_MISMATCH;
                         break;
                     }
+                }
                 err1 = GRIB_VALUE_MISMATCH;
             }
         }
@@ -1042,6 +1063,7 @@ static int compare_attributes(grib_handle* handle1, grib_handle* handle2, grib_r
 
     return ret;
 }
+
 static int compare_attribute(grib_handle* handle1, grib_handle* handle2, grib_runtime_options* options,
         grib_accessor* a, const char* prefix, int* err)
 {
@@ -1108,7 +1130,7 @@ static int compare_all_dump_keys(grib_handle* handle1, grib_handle* handle2, gri
         if (xa==NULL || ( xa->flags & GRIB_ACCESSOR_FLAG_DUMP )==0 ) continue;
 
         /* Get full name of key, e.g. '#2#windSpeed' or 'blockNumber' */
-        rank = compute_key_rank(handle1, keys_list, xa->name);
+        rank = compute_bufr_key_rank(handle1, keys_list, xa->name);
         if (rank != 0) {
             prefix=grib_context_malloc_clear(context,sizeof(char)*(strlen(xa->name)+10));
             dofree = 1;
@@ -1117,6 +1139,8 @@ static int compare_all_dump_keys(grib_handle* handle1, grib_handle* handle2, gri
             prefix = (char*)xa->name;
         }
 
+        if (blacklisted(prefix)) continue;
+
         /* Compare the key itself */
         if (compare_values(options, handle1, handle2, prefix, GRIB_TYPE_UNDEFINED)) {
             err++;
@@ -1157,7 +1181,7 @@ static int compare_handles(grib_handle* handle1, grib_handle* handle2, grib_runt
         for (i=0; i< options->compare_count; i++) {
             if (blacklisted((char*)options->compare[i].name)) continue;
             if (options->compare[i].type == GRIB_NAMESPACE) {
-                iter=grib_keys_iterator_new(handle1,0,(char*)options->compare[i].name);
+                iter=grib_keys_iterator_new(handle1,0,options->compare[i].name);
                 if (!iter) {
                     grib_context_log(handle1->context, GRIB_LOG_ERROR, "unable to get iterator");
                     exit(1);
@@ -1217,7 +1241,7 @@ static int compare_handles(grib_handle* handle1, grib_handle* handle2, grib_runt
             for (i=0; i< options->compare_count; i++) {
                 if (blacklisted(name)) continue;
                 if (options->compare[i].type == GRIB_NAMESPACE) {
-                    iter=grib_keys_iterator_new(handle1,0,(char*)options->compare[i].name);
+                    iter=grib_keys_iterator_new(handle1,0,options->compare[i].name);
                     if (!iter) {
                         grib_context_log(handle1->context, GRIB_LOG_ERROR,
                                 "ERROR: unable to get keys iterator for %s",options->compare[i].name);
diff --git a/tools/bufr_copy.c b/tools/bufr_copy.c
index e9f82bc..6e3a219 100644
--- a/tools/bufr_copy.c
+++ b/tools/bufr_copy.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/bufr_dump.c b/tools/bufr_dump.c
index a404126..3c78ba3 100644
--- a/tools/bufr_dump.c
+++ b/tools/bufr_dump.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/bufr_filter.c b/tools/bufr_filter.c
index 74fdc7f..dc7d09c 100644
--- a/tools/bufr_filter.c
+++ b/tools/bufr_filter.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/bufr_get.c b/tools/bufr_get.c
index 54c53d1..0647d9d 100644
--- a/tools/bufr_get.c
+++ b/tools/bufr_get.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/bufr_index_build.c b/tools/bufr_index_build.c
index 325a5fd..1544b8b 100644
--- a/tools/bufr_index_build.c
+++ b/tools/bufr_index_build.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/bufr_ls.c b/tools/bufr_ls.c
index c427566..c8d7586 100644
--- a/tools/bufr_ls.c
+++ b/tools/bufr_ls.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/bufr_ls.sh b/tools/bufr_ls.sh
index a0e6296..39c424f 100755
--- a/tools/bufr_ls.sh
+++ b/tools/bufr_ls.sh
@@ -72,7 +72,7 @@ echo "\\endverbatim\\n "
 
 #echo "\\endverbatim\\n "
 
-echo "-# To list only the scond message from a BUFR file:\\n "
+echo "-# To list only the second message from a BUFR file:\\n "
 echo "\\verbatim "
 echo "> bufr_ls -w count=2 ../data/bufr/syno_multi.bufr"
 
diff --git a/tools/bufr_set.c b/tools/bufr_set.c
index b88110b..e5b239a 100644
--- a/tools/bufr_set.c
+++ b/tools/bufr_set.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/codes_count.c b/tools/codes_count.c
index d0f82d5..fbcdc32 100644
--- a/tools/codes_count.c
+++ b/tools/codes_count.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/codes_info.c b/tools/codes_info.c
index bc1656c..e8bb14f 100644
--- a/tools/codes_info.c
+++ b/tools/codes_info.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -10,7 +10,7 @@
 
 #include "grib_tools.h"
 
-void usage( char*);
+void usage(const char*);
 
 #define INFO_PRINT_ALL              0
 #define INFO_PRINT_VERSION          (1<<0)
@@ -52,8 +52,8 @@ int main( int argc,char* argv[])
 
     if (print_flags ==  INFO_PRINT_ALL) {
         printf("\n");
-        printf("eccodes Version %d.%d.%d",
-                major,minor,revision);
+        printf("%s Version %d.%d.%d",
+                grib_get_package_name(), major,minor,revision);
         /* if (ECCODES_MAJOR_VERSION < 1) printf(" PRE-RELEASE"); */
         printf("\n");
         printf("\n");
@@ -115,7 +115,7 @@ int main( int argc,char* argv[])
     return 0;
 }
 
-void usage(char* progname) {
+void usage(const char* progname) {
     printf("\nUsage: %s [-v] [-d] [-s]\n",progname);
     exit(1);
 }
diff --git a/tools/codes_parser.c b/tools/codes_parser.c
index b850091..01dced4 100755
--- a/tools/codes_parser.c
+++ b/tools/codes_parser.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/compile.c b/tools/compile.c
index 3d9383f..1c7dbfb 100755
--- a/tools/compile.c
+++ b/tools/compile.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/deprecated/all_keys.c b/tools/deprecated/all_keys.c
index d80609e..ba0a25f 100755
--- a/tools/deprecated/all_keys.c
+++ b/tools/deprecated/all_keys.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/deprecated/dump.c b/tools/deprecated/dump.c
index b3401a7..3f4f11e 100644
--- a/tools/deprecated/dump.c
+++ b/tools/deprecated/dump.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/deprecated/dumpload.c b/tools/deprecated/dumpload.c
index 64d3bf3..0999438 100644
--- a/tools/deprecated/dumpload.c
+++ b/tools/deprecated/dumpload.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/deprecated/grib_add.c b/tools/deprecated/grib_add.c
index 9279e27..017cb85 100644
--- a/tools/deprecated/grib_add.c
+++ b/tools/deprecated/grib_add.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/deprecated/grib_cmp.c b/tools/deprecated/grib_cmp.c
index 3deddd0..3ab0910 100644
--- a/tools/deprecated/grib_cmp.c
+++ b/tools/deprecated/grib_cmp.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/deprecated/grib_convert.c b/tools/deprecated/grib_convert.c
index 54bc958..f1aa047 100644
--- a/tools/deprecated/grib_convert.c
+++ b/tools/deprecated/grib_convert.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/deprecated/grib_corruption_check.c b/tools/deprecated/grib_corruption_check.c
index ffd6752..09ab9b8 100644
--- a/tools/deprecated/grib_corruption_check.c
+++ b/tools/deprecated/grib_corruption_check.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/deprecated/grib_debug.c b/tools/deprecated/grib_debug.c
index 7e976a0..355b086 100644
--- a/tools/deprecated/grib_debug.c
+++ b/tools/deprecated/grib_debug.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/deprecated/grib_diff.c b/tools/deprecated/grib_diff.c
index aa4c85d..e1162bf 100644
--- a/tools/deprecated/grib_diff.c
+++ b/tools/deprecated/grib_diff.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/deprecated/grib_distance.c b/tools/deprecated/grib_distance.c
index b444bfd..e9dfc4d 100644
--- a/tools/deprecated/grib_distance.c
+++ b/tools/deprecated/grib_distance.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/deprecated/grib_error.c b/tools/deprecated/grib_error.c
index 62b960e..5822fec 100644
--- a/tools/deprecated/grib_error.c
+++ b/tools/deprecated/grib_error.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/deprecated/grib_gen.c b/tools/deprecated/grib_gen.c
index 33530fb..4c6b728 100644
--- a/tools/deprecated/grib_gen.c
+++ b/tools/deprecated/grib_gen.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/deprecated/grib_keys.c b/tools/deprecated/grib_keys.c
index 42ac8be..419eb93 100644
--- a/tools/deprecated/grib_keys.c
+++ b/tools/deprecated/grib_keys.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/deprecated/grib_moments.c b/tools/deprecated/grib_moments.c
index 43a3679..f546088 100644
--- a/tools/deprecated/grib_moments.c
+++ b/tools/deprecated/grib_moments.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/deprecated/grib_packing.c b/tools/deprecated/grib_packing.c
index d5fba54..0e54e65 100644
--- a/tools/deprecated/grib_packing.c
+++ b/tools/deprecated/grib_packing.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/deprecated/grib_points.c b/tools/deprecated/grib_points.c
index ebbb756..7f0059c 100644
--- a/tools/deprecated/grib_points.c
+++ b/tools/deprecated/grib_points.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/gaussian.c b/tools/gaussian.c
index 7b92b30..68a4439 100644
--- a/tools/gaussian.c
+++ b/tools/gaussian.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/gg_sub_area_check.c b/tools/gg_sub_area_check.c
index 1c29a6c..9fb9a31 100644
--- a/tools/gg_sub_area_check.c
+++ b/tools/gg_sub_area_check.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/grib2ppm.c b/tools/grib2ppm.c
index 4a6fffc..ec331d1 100644
--- a/tools/grib2ppm.c
+++ b/tools/grib2ppm.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/grib_2_request.c b/tools/grib_2_request.c
index 8078a26..a4dda8b 100644
--- a/tools/grib_2_request.c
+++ b/tools/grib_2_request.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/grib_check_gaussian_grid.c b/tools/grib_check_gaussian_grid.c
index dbbad70..440aa3b 100644
--- a/tools/grib_check_gaussian_grid.c
+++ b/tools/grib_check_gaussian_grid.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/grib_compare.c b/tools/grib_compare.c
index 5cc4b40..3bee29b 100644
--- a/tools/grib_compare.c
+++ b/tools/grib_compare.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -818,12 +818,22 @@ static int compare_values(grib_runtime_options* options,grib_handle* h1,grib_han
         }
 
         if (!compareAbsolute) {
+            int all_specified = 0; /* =1 if relative comparison with "all" specified */
             for (i=0;i<options->tolerance_count;i++) {
-                if (!strcmp((options->tolerance[i]).name,name)) {
+                if (!strcmp((options->tolerance[i]).name, "all")) {
+                    all_specified = 1;
                     value_tolerance=(options->tolerance[i]).double_value;
                     break;
                 }
             }
+            if (!all_specified) {
+                for (i=0;i<options->tolerance_count;i++) {
+                    if (!strcmp((options->tolerance[i]).name,name)) {
+                        value_tolerance=(options->tolerance[i]).double_value;
+                        break;
+                    }
+                }
+            }
         }
 
         if((err1 = grib_get_double_array(h1,name,dval1,&len1)) != GRIB_SUCCESS)
@@ -1024,8 +1034,8 @@ static int compare_handles(grib_handle* h1,grib_handle* h2,grib_runtime_options*
             return 0;
 
         err=0;
-        h11=grib_handle_new_from_partial_message(h1->context,(void*)msg1,size1);
-        h22=grib_handle_new_from_partial_message(h1->context,(void*)msg2,size2);
+        h11=grib_handle_new_from_partial_message(h1->context,msg1,size1);
+        h22=grib_handle_new_from_partial_message(h1->context,msg2,size2);
 
         iter=grib_keys_iterator_new(h11, GRIB_KEYS_ITERATOR_SKIP_COMPUTED, NULL);
 
diff --git a/tools/grib_copy.c b/tools/grib_copy.c
index 623bbb9..f727fe8 100644
--- a/tools/grib_copy.c
+++ b/tools/grib_copy.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/grib_copy.dox b/tools/grib_copy.dox
index a2ca31f..6e07565 100644
--- a/tools/grib_copy.dox
+++ b/tools/grib_copy.dox
@@ -26,7 +26,7 @@
 		type can be defined. Default type is string.
  \n \n -B order by directive \n 
 		Order by. The output will be ordered according to the order by directive.
-		Order by example: "step asc, centre desc" (step ascending and centre descending)
+		Order by example: "step:i asc, centre desc" (step numeric ascending and centre descending)
  \n \n -V  \n Version.
  \n \n -W width \n 
 		Minimum width of each column in output. Default is 10.
diff --git a/tools/grib_dump.c b/tools/grib_dump.c
index 7a61a43..81e6409 100644
--- a/tools/grib_dump.c
+++ b/tools/grib_dump.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/grib_filter.c b/tools/grib_filter.c
index 3fc8a9d..8c37a0c 100644
--- a/tools/grib_filter.c
+++ b/tools/grib_filter.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/grib_filter.h b/tools/grib_filter.h
index e36d447..80b8a44 100644
--- a/tools/grib_filter.h
+++ b/tools/grib_filter.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/grib_get.c b/tools/grib_get.c
index 185f810..ee69a6f 100644
--- a/tools/grib_get.c
+++ b/tools/grib_get.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/grib_get_data.c b/tools/grib_get_data.c
index 9bf108d..720af87 100644
--- a/tools/grib_get_data.c
+++ b/tools/grib_get_data.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -196,6 +196,7 @@ int grib_tool_new_handle_action(grib_runtime_options* options, grib_handle* h)
     }
 
     if (iter) grib_iterator_delete(iter);
+    if (bitmap) free(bitmap);
 
     free(data_values);
     if (iter) {
diff --git a/tools/grib_histogram.c b/tools/grib_histogram.c
index 22b968e..64d24a7 100644
--- a/tools/grib_histogram.c
+++ b/tools/grib_histogram.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/grib_index_build.c b/tools/grib_index_build.c
index 7802aa7..90d8616 100644
--- a/tools/grib_index_build.c
+++ b/tools/grib_index_build.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/grib_ls.c b/tools/grib_ls.c
index 11629fc..ac06c4f 100644
--- a/tools/grib_ls.c
+++ b/tools/grib_ls.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/grib_ls.dox b/tools/grib_ls.dox
index 73fd328..9f0f041 100644
--- a/tools/grib_ls.dox
+++ b/tools/grib_ls.dox
@@ -25,7 +25,7 @@
  \n \n -j  \n json output
  \n \n -B order by directive \n 
 		Order by. The output will be ordered according to the order by directive.
-		Order by example: "step asc, centre desc" (step ascending and centre descending)
+		Order by example: "step:i asc, centre desc" (step numeric ascending and centre descending)
  \n \n -l Latitude,Longitude[,MODE,file] \n 
 		Value close to the point of a Latitude/Longitude.
 		Allowed values for MODE are:
diff --git a/tools/grib_merge.c b/tools/grib_merge.c
index 67df943..dc7c223 100644
--- a/tools/grib_merge.c
+++ b/tools/grib_merge.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/grib_nearest_land.c b/tools/grib_nearest_land.c
index ae0b8dc..891084e 100644
--- a/tools/grib_nearest_land.c
+++ b/tools/grib_nearest_land.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/grib_options.c b/tools/grib_options.c
index 5190f91..a1d347c 100644
--- a/tools/grib_options.c
+++ b/tools/grib_options.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -29,7 +29,7 @@ grib_options_help grib_options_help_list[] ={
      "\n\t\tAll the keys in this list are skipped in the comparison. Bit-by-bit compare on.\n"},
   {"B:","order by directive",
      "\n\t\tOrder by. The output will be ordered according to the order by directive."
-     "\n\t\tOrder by example: \"step asc, centre desc\" (step ascending and centre descending)\n"},
+     "\n\t\tOrder by example: \"step:i asc, centre desc\" (step numeric ascending and centre descending)\n"},
   {"c:","key[:i/d/s/n],key[:i/d/s/n],...",
    "\n\t\tOnly the listed keys or namespaces (:n) are compared. The optional letter after the colon is used "
    "\n\t\tto force the type in the comparison: i->integer, d->float, s->string, n->namespace."
diff --git a/tools/grib_repair.c b/tools/grib_repair.c
index be4dcac..c81a347 100644
--- a/tools/grib_repair.c
+++ b/tools/grib_repair.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/grib_set.c b/tools/grib_set.c
index 31b6d5f..763e100 100644
--- a/tools/grib_set.c
+++ b/tools/grib_set.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/grib_to_json.c b/tools/grib_to_json.c
index bf288d5..95593d5 100644
--- a/tools/grib_to_json.c
+++ b/tools/grib_to_json.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/grib_to_netcdf.c b/tools/grib_to_netcdf.c
index 8e4a5b9..d90abee 100644
--- a/tools/grib_to_netcdf.c
+++ b/tools/grib_to_netcdf.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/grib_to_netcdf.sh b/tools/grib_to_netcdf.sh
index 3a5af13..165ae19 100755
--- a/tools/grib_to_netcdf.sh
+++ b/tools/grib_to_netcdf.sh
@@ -23,3 +23,8 @@ echo "Note these types were chosen to provide a reasonably wide range of trade-o
 echo "\\verbatim"
 echo ">grib_to_netcdf -D NC_FLOAT -o output.nc input.grib"
 echo "\\endverbatim"
+
+echo "-# Set the netcdf dimension 'time' to be unlimited i.e. time can have unlimited length so variables using this dimension can grow along this dimension."
+echo "\\verbatim"
+echo ">grib_to_netcdf -u time -o output.nc input.grib"
+echo "\\endverbatim"
diff --git a/tools/grib_tools.c b/tools/grib_tools.c
index f924c75..32fb540 100644
--- a/tools/grib_tools.c
+++ b/tools/grib_tools.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -21,7 +21,6 @@
 #undef PACKAGE_STRING
 #undef PACKAGE_TARNAME
 #undef PACKAGE_VERSION
-#include "jasper/jasper.h"
 #endif
 
 #ifdef ENABLE_FLOATING_POINT_EXCEPTIONS
@@ -674,7 +673,7 @@ static void grib_tools_set_print_keys(grib_runtime_options* options, grib_handle
     }
 
     if (ns) {
-        kiter=grib_keys_iterator_new(h,0,(char*)ns);
+        kiter=grib_keys_iterator_new(h,0,ns);
         if (!kiter) {
             fprintf(dump_file,"ERROR: Unable to create keys iterator\n");
             exit(1);
diff --git a/tools/grib_tools.h b/tools/grib_tools.h
index 0d2e09b..09f4f2e 100644
--- a/tools/grib_tools.h
+++ b/tools/grib_tools.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -8,6 +8,10 @@
  * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
  */
 
+#ifdef __gnu_hurd__
+ #define _FILE_OFFSET_BITS 64 /* 64-bit offsets off_t not the default on Hurd/i386 */
+#endif
+
 #include "grib_api_internal.h"
 #include <stdio.h>
 #ifndef ECCODES_ON_WINDOWS
diff --git a/tools/gts_compare.c b/tools/gts_compare.c
index d341f84..ee967ab 100644
--- a/tools/gts_compare.c
+++ b/tools/gts_compare.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -47,17 +47,6 @@ int verbose=0;
 int tolerance_factor=1;
 static int write_error=0;
 
-GRIB_INLINE static double compare_double_absolute(double *a,double *b,double *err)
-{
-    double ret=0;
-    double d=fabs(*a-*b);
-    if (d > *err) {
-        ret=d;
-    }
-    return ret;
-    /* return fabs(*a-*b) > *err ? fabs(*a-*b) : 0; */
-}
-
 static int write_count=0;
 
 static void write_message(grib_handle* h,const char* str)
@@ -819,8 +808,8 @@ static int compare_handles(grib_handle* h1,grib_handle* h2,grib_runtime_options*
             return 0;
 
         err=0;
-        h11=grib_handle_new_from_partial_message(h1->context,(void*)msg1,size1);
-        h22=grib_handle_new_from_partial_message(h1->context,(void*)msg2,size2);
+        h11=grib_handle_new_from_partial_message(h1->context,msg1,size1);
+        h22=grib_handle_new_from_partial_message(h1->context,msg2,size2);
 
         iter=grib_keys_iterator_new(h11,
                 GRIB_KEYS_ITERATOR_SKIP_COMPUTED,NULL);
@@ -852,7 +841,7 @@ static int compare_handles(grib_handle* h1,grib_handle* h2,grib_runtime_options*
         for (i=0; i< options->compare_count; i++) {
             if (blacklisted((char*)options->compare[i].name)) continue;
             if (options->compare[i].type == GRIB_NAMESPACE) {
-                iter=grib_keys_iterator_new(h1,0,(char*)options->compare[i].name);
+                iter=grib_keys_iterator_new(h1,0,options->compare[i].name);
                 if (!iter) {
                     printf("ERROR: unable to get iterator\n");
                     exit(1);
@@ -912,7 +901,7 @@ static int compare_handles(grib_handle* h1,grib_handle* h2,grib_runtime_options*
             for (i=0; i< options->compare_count; i++) {
                 if (blacklisted(name)) continue;
                 if (options->compare[i].type == GRIB_NAMESPACE) {
-                    iter=grib_keys_iterator_new(h1,0,(char*)options->compare[i].name);
+                    iter=grib_keys_iterator_new(h1,0,options->compare[i].name);
                     if (!iter) {
                         printf("ERROR: unable to get iterator for %s\n",options->compare[i].name );
                         exit(1);
diff --git a/tools/gts_copy.c b/tools/gts_copy.c
index 22b1831..5af856b 100644
--- a/tools/gts_copy.c
+++ b/tools/gts_copy.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/gts_dump.c b/tools/gts_dump.c
index 5102611..da9c021 100644
--- a/tools/gts_dump.c
+++ b/tools/gts_dump.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/gts_filter.c b/tools/gts_filter.c
index 3953fe7..ab76303 100644
--- a/tools/gts_filter.c
+++ b/tools/gts_filter.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/gts_get.c b/tools/gts_get.c
index bbdca70..b992f1f 100644
--- a/tools/gts_get.c
+++ b/tools/gts_get.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/gts_ls.c b/tools/gts_ls.c
index 15f7de3..cf81924 100644
--- a/tools/gts_ls.c
+++ b/tools/gts_ls.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/list_keys.c b/tools/list_keys.c
index 03066bc..b2365e1 100755
--- a/tools/list_keys.c
+++ b/tools/list_keys.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/load.c b/tools/load.c
index 3dc9efc..36c9975 100644
--- a/tools/load.c
+++ b/tools/load.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/load.h b/tools/load.h
index bd4be11..c1b3bff 100644
--- a/tools/load.h
+++ b/tools/load.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/mars_request.c b/tools/mars_request.c
index 6a88b9b..6e92d95 100644
--- a/tools/mars_request.c
+++ b/tools/mars_request.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/metar_compare.c b/tools/metar_compare.c
index eb6e038..f920e56 100644
--- a/tools/metar_compare.c
+++ b/tools/metar_compare.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -1034,8 +1034,8 @@ static int compare_handles(grib_handle* h1,grib_handle* h2,grib_runtime_options*
             return 0;
 
         err=0;
-        h11=grib_handle_new_from_partial_message(h1->context,(void*)msg1,size1);
-        h22=grib_handle_new_from_partial_message(h1->context,(void*)msg2,size2);
+        h11=grib_handle_new_from_partial_message(h1->context,msg1,size1);
+        h22=grib_handle_new_from_partial_message(h1->context,msg2,size2);
 
         iter=grib_keys_iterator_new(h11,
                 GRIB_KEYS_ITERATOR_SKIP_COMPUTED,NULL);
@@ -1067,7 +1067,7 @@ static int compare_handles(grib_handle* h1,grib_handle* h2,grib_runtime_options*
         for (i=0; i< options->compare_count; i++) {
             if (blacklisted((char*)options->compare[i].name)) continue;
             if (options->compare[i].type == GRIB_NAMESPACE) {
-                iter=grib_keys_iterator_new(h1,0,(char*)options->compare[i].name);
+                iter=grib_keys_iterator_new(h1,0,options->compare[i].name);
                 if (!iter) {
                     printf("ERROR: unable to get iterator\n");
                     exit(1);
@@ -1127,7 +1127,7 @@ static int compare_handles(grib_handle* h1,grib_handle* h2,grib_runtime_options*
             for (i=0; i< options->compare_count; i++) {
                 if (blacklisted(name)) continue;
                 if (options->compare[i].type == GRIB_NAMESPACE) {
-                    iter=grib_keys_iterator_new(h1,0,(char*)options->compare[i].name);
+                    iter=grib_keys_iterator_new(h1,0,options->compare[i].name);
                     if (!iter) {
                         printf("ERROR: unable to get iterator for %s\n",options->compare[i].name );
                         exit(1);
diff --git a/tools/metar_copy.c b/tools/metar_copy.c
index 4be3ad7..9f79d8c 100644
--- a/tools/metar_copy.c
+++ b/tools/metar_copy.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/metar_dump.c b/tools/metar_dump.c
index d8938e1..b83493f 100644
--- a/tools/metar_dump.c
+++ b/tools/metar_dump.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/metar_filter.c b/tools/metar_filter.c
index 2a9e8e9..aa1d551 100644
--- a/tools/metar_filter.c
+++ b/tools/metar_filter.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/metar_get.c b/tools/metar_get.c
index 363603d..d930875 100644
--- a/tools/metar_get.c
+++ b/tools/metar_get.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/metar_ls.c b/tools/metar_ls.c
index b5e1707..63c71aa 100644
--- a/tools/metar_ls.c
+++ b/tools/metar_ls.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/taf_dump.c b/tools/taf_dump.c
index a742668..4f5bf71 100644
--- a/tools/taf_dump.c
+++ b/tools/taf_dump.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/taf_filter.c b/tools/taf_filter.c
index 119969d..659bd5b 100644
--- a/tools/taf_filter.c
+++ b/tools/taf_filter.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/taf_get.c b/tools/taf_get.c
index 3626baf..ada83ce 100644
--- a/tools/taf_get.c
+++ b/tools/taf_get.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/taf_ls.c b/tools/taf_ls.c
index 423045e..a9d43aa 100644
--- a/tools/taf_ls.c
+++ b/tools/taf_ls.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/test.c b/tools/test.c
index 6db7374..84dec64 100644
--- a/tools/test.c
+++ b/tools/test.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/wingetopt.c b/tools/wingetopt.c
index 14b9136..b10fcee 100644
--- a/tools/wingetopt.c
+++ b/tools/wingetopt.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/wingetopt.h b/tools/wingetopt.h
index a778711..c1e19a7 100644
--- a/tools/wingetopt.h
+++ b/tools/wingetopt.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/tools/xref.c b/tools/xref.c
index c7854ba..8851287 100755
--- a/tools/xref.c
+++ b/tools/xref.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2016 ECMWF.
+ * Copyright 2005-2017 ECMWF.
  *
  * This software is licensed under the terms of the Apache Licence Version 2.0
  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/version.sh b/version.sh
index ee14dc9..0438ff3 100644
--- a/version.sh
+++ b/version.sh
@@ -1,4 +1,4 @@
-# Copyright 2005-2016 ECMWF.
+# Copyright 2005-2017 ECMWF.
 #
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -14,8 +14,8 @@ PACKAGE_NAME='eccodes'
 
 # Package version
 ECCODES_MAJOR_VERSION=2
-ECCODES_MINOR_VERSION=0
-ECCODES_REVISION_VERSION=2
+ECCODES_MINOR_VERSION=1
+ECCODES_REVISION_VERSION=0
 
 ECCODES_CURRENT=1
 ECCODES_REVISION=0
diff --git a/windows/msvc/grib_api_lib/grib_api_lib.vcproj b/windows/msvc/grib_api_lib/grib_api_lib.vcproj
index a6e2917..8a52bc4 100644
--- a/windows/msvc/grib_api_lib/grib_api_lib.vcproj
+++ b/windows/msvc/grib_api_lib/grib_api_lib.vcproj
@@ -421,11 +421,15 @@
 				>
 			</File>
 			<File
-				RelativePath="..\..\..\src\codes_memfs.c"
+				RelativePath="..\..\..\src\bufr_keys_iterator.c"
 				>
 			</File>
 			<File
-				RelativePath="..\..\..\src\compile.c"
+				RelativePath="..\..\..\src\bufr_util.c"
+				>
+			</File>
+			<File
+				RelativePath="..\..\..\src\codes_memfs.c"
 				>
 			</File>
 			<File
@@ -968,7 +972,7 @@
 				RelativePath="..\..\..\src\grib_accessor_class_int8.c"
 				>
 			</File>
-            <File
+			<File
 				RelativePath="..\..\..\src\grib_accessor_class_iterator.c"
 				>
 			</File>
@@ -1453,10 +1457,6 @@
 				>
 			</File>
 			<File
-				RelativePath="..\..\..\src\grib_dumper_class_xml.c"
-				>
-			</File>
-			<File
 				RelativePath="..\..\..\src\grib_errors.c"
 				>
 			</File>
@@ -1617,6 +1617,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\..\..\src\grib_iterator_class_space_view.c"
+				>
+			</File>
+			<File
 				RelativePath="..\..\..\src\grib_itrie.c"
 				>
 			</File>
@@ -1677,6 +1681,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\..\..\src\grib_optimize_decimal_factor.c"
+				>
+			</File>
+			<File
 				RelativePath="..\..\..\tools\grib_options.c"
 				>
 			</File>
@@ -1745,6 +1753,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\..\..\src\string_util.c"
+				>
+			</File>
+			<File
 				RelativePath="..\..\..\tools\wingetopt.c"
 				>
 			</File>

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/eccodes.git



More information about the debian-science-commits mailing list