diff --git a/docs/User_manual.docx b/docs/User_manual.docx
index 3599eb41ac21ac96a0f5f0d7fa986dd5e329de68..72f552bbf3ab5d02d3cc833478036302a667ec59 100644
Binary files a/docs/User_manual.docx and b/docs/User_manual.docx differ
diff --git a/properties.py b/properties.py
index 55afa40021153ded6826745e73292c492f90f5d4..d00f4f798f84b8722f01ba94d445dea8c4b15c6f 100644
--- a/properties.py
+++ b/properties.py
@@ -11,7 +11,6 @@ import pandas as pd
 
 
 # Supported formats, sources and internal data models -------------------------
-supported_meta_file_formats = ['fixed_width','delimited']
 schema_path = os.path.join(os.path.dirname(__file__),'schemas','lib')
 supported_file_formats = [ os.path.basename(x).split(".")[0] for x in glob.glob(schema_path + '/*/*.json') if os.path.basename(x).split(".")[0] == os.path.dirname(x).split("/")[-1]]
 supported_sources = [pd.DataFrame, pd.io.parsers.TextFileReader, io.StringIO]
@@ -44,4 +43,6 @@ data_type_conversion_args['datetime'] = ['datetime_format']
 
 # Misc ------------------------------------------------------------------------
 tol = 1E-10
-dummy_level = '_section'
\ No newline at end of file
+dummy_level = 'SECTION__'
+# Length of reports in initial read
+MAX_FULL_REPORT_WIDTH = 100000
\ No newline at end of file
diff --git a/read.py b/read.py
index 20b88bab99e97d9fc4452b80e2623dd942d7a199..1533d0d74f9e13bc5d4eb0446cfb77cc3dd8f3b2 100644
--- a/read.py
+++ b/read.py
@@ -3,8 +3,8 @@
 """
 Created on Tue Apr 30 09:38:17 2019
 
-Reads source data (file, pandas DataFrame or pd.io.parsers.TextFileReader) to 
-a pandas DataFrame. The source data model needs to be input to the module as 
+Reads source data (file, pandas DataFrame or pd.io.parsers.TextFileReader) to
+a pandas DataFrame. The source data model needs to be input to the module as
 a named model (included in the module) or as the path to a data model.
 
 Data is validated against its data model after reading, producing a boolean mask.
@@ -26,7 +26,6 @@ import logging
 import json
 
 def read(source, data_model = None, data_model_path = None, sections = None,chunksize = None,
-         supp_section = None, supp_model = None, supp_model_path = None,
          skiprows = None, out_path = None ):
 
     logging.basicConfig(format='%(levelname)s\t[%(asctime)s](%(filename)s)\t%(message)s',
@@ -50,39 +49,24 @@ def read(source, data_model = None, data_model_path = None, sections = None,chun
     schema = schemas.read_schema( schema_name = data_model, ext_schema_path = data_model_path)
     if not schema:
         return
-    if supp_section:
-        logging.info("READING SUPPLEMENTAL DATA MODEL SCHEMA FILE...")
-        supp_schema = schemas.read_schema( schema_name = supp_model, ext_schema_path = supp_model_path)
-        if not supp_schema:
-            return
-    else:
-        supp_schema = None
+
     # 2. Read data
     imodel = data_model if data_model else data_model_path
     logging.info("EXTRACTING DATA FROM MODEL: {}".format(imodel))
     data, valid = reader.read_model(source,schema, sections = sections, chunksize = chunksize, skiprows = skiprows)
-    # 3. Read additional format: on error, return what's been read so far...
-    # Mmmmm, make sure we can mix meta_file_formats: eg. core('FIXED_WIDTH')-supp("DELIMITED")           
-    if supp_section:
-        i_suppmodel = supp_model if supp_model else supp_model_path
-        logging.info("EXTRACTING SUPPLEMENTAL DATA FROM MODEL: {}".format(i_suppmodel))
-        data, valid = reader.add_supplemental(data, supp_section, supp_schema, valid)
-        if isinstance(data,pd.io.parsers.TextFileReader):
-            logging.info('...RESTORING DATA PARSER')
-            data = pandas_TextParser_hdlr.restore(data.f,data.orig_options)
 
     # 4. Create out data attributes
     logging.info("CREATING OUTPUT DATA ATTRIBUTES FROM DATA MODEL(S)")
     data_columns = [ x for x in data ] if isinstance(data,pd.DataFrame) else data.orig_options['names']
-    out_atts = schemas.df_schema(data_columns, schema, data_model, supp_section = supp_section, supp_schema = supp_schema, supp_model = supp_model )
+    out_atts = schemas.df_schema(data_columns, schema, data_model)
 
     # 5. Complete data validation
     logging.info("VALIDATING DATA")
-    valid = validate.validate(data, out_atts, valid, data_model = data_model, data_model_path = data_model_path, supp_section = supp_section, supp_model = supp_model, supp_model_path = supp_model_path) 
+    valid = validate.validate(data, out_atts, valid, data_model = data_model, data_model_path = data_model_path)
     if isinstance(data,pd.io.parsers.TextFileReader):
             logging.info('...RESTORING DATA PARSER')
             data = pandas_TextParser_hdlr.restore(data.f,data.orig_options)
-            
+
     if out_path:
         logging.info('WRITING DATA TO FILES IN: {}'.format(out_path))
         cols = [ x for x in data ]
@@ -96,12 +80,12 @@ def read(source, data_model = None, data_model_path = None, sections = None,chun
         valid.to_csv(os.path.join(out_path,'valid_mask.csv'), header = header, encoding = 'utf-8',index = True, index_label='index')
         with open(os.path.join(out_path,'atts.json'),'w') as fileObj:
             json.dump(out_atts_json,fileObj,indent=4)
-            
+
     return {'data':data,'atts':out_atts,'valid_mask':valid}
 
 if __name__=='__main__':
     kwargs = dict(arg.split('=') for arg in sys.argv[2:])
     if 'sections' in kwargs.keys():
         kwargs.update({ 'sections': [ x.strip() for x in kwargs.get('sections').split(",")] })
-    read(sys.argv[1], 
-         **kwargs) # kwargs
\ No newline at end of file
+    read(sys.argv[1],
+         **kwargs) # kwargs
diff --git a/read.py.old b/read.py.old
new file mode 100644
index 0000000000000000000000000000000000000000..20b88bab99e97d9fc4452b80e2623dd942d7a199
--- /dev/null
+++ b/read.py.old
@@ -0,0 +1,107 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+Created on Tue Apr 30 09:38:17 2019
+
+Reads source data (file, pandas DataFrame or pd.io.parsers.TextFileReader) to 
+a pandas DataFrame. The source data model needs to be input to the module as 
+a named model (included in the module) or as the path to a data model.
+
+Data is validated against its data model after reading, producing a boolean mask.
+
+Calls the schemas, reader and valiate modules in the tool to access the data models,
+read the data and validate it.
+
+@author: iregon
+"""
+import os
+import sys
+import pandas as pd
+from mdf_reader.reader import reader as reader
+from mdf_reader.validate import validate as validate
+import mdf_reader.schemas as schemas
+import mdf_reader.properties as properties
+import mdf_reader.common.pandas_TextParser_hdlr as pandas_TextParser_hdlr
+import logging
+import json
+
+def read(source, data_model = None, data_model_path = None, sections = None,chunksize = None,
+         supp_section = None, supp_model = None, supp_model_path = None,
+         skiprows = None, out_path = None ):
+
+    logging.basicConfig(format='%(levelname)s\t[%(asctime)s](%(filename)s)\t%(message)s',
+                    level=logging.INFO,datefmt='%Y%m%d %H:%M:%S',filename=None)
+
+    # 0. Make sure min info is available
+    if not data_model and not data_model_path:
+        logging.error('A valid data model name or path to data model must be provided')
+        return
+    if not isinstance(source,tuple(properties.supported_sources)):
+        if not source:
+            logging.error('Data source is empty (first argument to read()) ')
+            return
+        elif not os.path.isfile(source):
+            logging.error('Can\'t reach data source {} as a file'.format(source))
+            logging.info('Supported in-memory data sources are {}'.format(",".join(properties.supported_sources)))
+            return
+
+    # 1. Read schema(s) and get file format
+    logging.info("READING DATA MODEL SCHEMA FILE...")
+    schema = schemas.read_schema( schema_name = data_model, ext_schema_path = data_model_path)
+    if not schema:
+        return
+    if supp_section:
+        logging.info("READING SUPPLEMENTAL DATA MODEL SCHEMA FILE...")
+        supp_schema = schemas.read_schema( schema_name = supp_model, ext_schema_path = supp_model_path)
+        if not supp_schema:
+            return
+    else:
+        supp_schema = None
+    # 2. Read data
+    imodel = data_model if data_model else data_model_path
+    logging.info("EXTRACTING DATA FROM MODEL: {}".format(imodel))
+    data, valid = reader.read_model(source,schema, sections = sections, chunksize = chunksize, skiprows = skiprows)
+    # 3. Read additional format: on error, return what's been read so far...
+    # Mmmmm, make sure we can mix meta_file_formats: eg. core('FIXED_WIDTH')-supp("DELIMITED")           
+    if supp_section:
+        i_suppmodel = supp_model if supp_model else supp_model_path
+        logging.info("EXTRACTING SUPPLEMENTAL DATA FROM MODEL: {}".format(i_suppmodel))
+        data, valid = reader.add_supplemental(data, supp_section, supp_schema, valid)
+        if isinstance(data,pd.io.parsers.TextFileReader):
+            logging.info('...RESTORING DATA PARSER')
+            data = pandas_TextParser_hdlr.restore(data.f,data.orig_options)
+
+    # 4. Create out data attributes
+    logging.info("CREATING OUTPUT DATA ATTRIBUTES FROM DATA MODEL(S)")
+    data_columns = [ x for x in data ] if isinstance(data,pd.DataFrame) else data.orig_options['names']
+    out_atts = schemas.df_schema(data_columns, schema, data_model, supp_section = supp_section, supp_schema = supp_schema, supp_model = supp_model )
+
+    # 5. Complete data validation
+    logging.info("VALIDATING DATA")
+    valid = validate.validate(data, out_atts, valid, data_model = data_model, data_model_path = data_model_path, supp_section = supp_section, supp_model = supp_model, supp_model_path = supp_model_path) 
+    if isinstance(data,pd.io.parsers.TextFileReader):
+            logging.info('...RESTORING DATA PARSER')
+            data = pandas_TextParser_hdlr.restore(data.f,data.orig_options)
+            
+    if out_path:
+        logging.info('WRITING DATA TO FILES IN: {}'.format(out_path))
+        cols = [ x for x in data ]
+        if isinstance(cols[0],tuple):
+            header = [":".join(x) for x in cols]
+            out_atts_json = { ":".join(x):out_atts.get(x) for x in out_atts.keys() }
+        else:
+            header = cols
+            out_atts_json = out_atts
+        data.to_csv(os.path.join(out_path,'data.csv'), header = header, encoding = 'utf-8',index = True, index_label='index')
+        valid.to_csv(os.path.join(out_path,'valid_mask.csv'), header = header, encoding = 'utf-8',index = True, index_label='index')
+        with open(os.path.join(out_path,'atts.json'),'w') as fileObj:
+            json.dump(out_atts_json,fileObj,indent=4)
+            
+    return {'data':data,'atts':out_atts,'valid_mask':valid}
+
+if __name__=='__main__':
+    kwargs = dict(arg.split('=') for arg in sys.argv[2:])
+    if 'sections' in kwargs.keys():
+        kwargs.update({ 'sections': [ x.strip() for x in kwargs.get('sections').split(",")] })
+    read(sys.argv[1], 
+         **kwargs) # kwargs
\ No newline at end of file
diff --git a/reader/get_sections.py b/reader/get_sections.py
new file mode 100644
index 0000000000000000000000000000000000000000..4d8a5698e5988257ec2bce8b6535772d12e90498
--- /dev/null
+++ b/reader/get_sections.py
@@ -0,0 +1,222 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+Created on Tue Apr 30 09:38:17 2019
+
+Splits string reports in sections using a data model layout
+
+Input and output are simple pandas dataframes, with the output DF column names
+as the section names
+
+To work with a pandas TextParser, loop through this module.
+
+Internally works assuming highest complexity in the input data model:
+multiple non sequential sections
+
+DEV NOTES:
+    
+1) make sure we use Series when working with Series, DataFrames otherwise...
+like now:
+  threads[thread_id]['data'] = pd.Series(threads[thread_id]['parent_data'][0].str[0:section_len])
+instead of:
+  threads[thread_id]['data'] = pd.DataFrame(threads[thread_id]['parent_data'][0].str[0:section_len])
+
+on data import in import_data.py, we use pd.read_fwf because is more general
+use, also support to chunking would make converting to series a bit dirty...
+
+2) Can we extend (do we need to?) this to reading sequential sections with
+    no sentinals? apparently (see td11) we are already able to do that:
+        provided the section is in a sequential parsing_order group
+
+@author: iregon
+"""
+
+import pandas as pd
+from copy import deepcopy
+import logging
+import mdf_reader.properties as properties
+
+
+#   ---------------------------------------------------------------------------
+#   FUNCTIONS TO PERFORM INITIAL SEPARATION OF SECTIONS: MAIN IS GET_SECTIONS()
+#   ---------------------------------------------------------------------------
+def extract_data():
+    section_len = section_lens.get(threads[thread_id]['section'])
+    if section_len:
+        threads[thread_id]['data'] = pd.Series(threads[thread_id]['parent_data'][0].str[0:section_len]) # object consistency needed here
+        threads[thread_id]['modulo'] = pd.DataFrame(threads[thread_id]['parent_data'][0].str[section_len:]) # object consistency needed here
+    else:
+        threads[thread_id]['data'] = pd.Series(threads[thread_id]['parent_data'][0].str[0:]) #threads[thread_id]['parent_data'].copy()
+        # Could even be like with section_len (None in section_len will read to the end)
+        threads[thread_id]['modulo'] = pd.DataFrame(columns = [0]) # Just for consistency
+    del threads[thread_id]['parent_data']
+
+def add_next_children():
+    global children_parsing_order, branch_parsing_order, children_group_type, children_group_number
+    children_parsing_order = deepcopy(threads[thread_id]['parsing_order'])
+    branch_parsing_order = deepcopy(threads[thread_id]['parsing_order'])
+    children_group_type = list(children_parsing_order[0])[0]
+    children_group_number = threads[thread_id]['children_group_number']
+    threads[thread_id]['children_no'] = 0
+    threads[thread_id]['children'] = []
+    add_children()
+
+def add_higher_group_children():
+    global children_parsing_order, branch_parsing_order, children_group_type, children_group_number
+    children_parsing_order = deepcopy(threads[thread_id]['parsing_order'])
+    children_parsing_order.pop(0) # Move to next group of sections
+    if len(children_parsing_order) > 0:
+        branch_parsing_order = deepcopy(threads[thread_id]['parsing_order'])
+        branch_parsing_order.pop(0)
+        children_group_type = list(children_parsing_order[0])[0]
+        children_group_number = threads[thread_id]['children_group_number'] + 1
+        add_children()
+
+def add_children():
+    if children_group_type == 's':
+        add_static_children()
+    else:
+        add_dynamic_children()
+
+def add_static_children():
+    threads[thread_id]['children_no'] += 1
+    children_thread_id = str(children_group_number) + str(0) + thread_id
+    threads[thread_id]['children'].append(children_thread_id)
+    # Now build children's thread
+    children_section = children_parsing_order[0][children_group_type].pop(0)
+    grandchildren_group_number = children_group_number
+    if len(children_parsing_order[0][children_group_type]) == 0:
+        children_parsing_order.pop(0)
+        if len(children_parsing_order) > 0:
+            grandchildren_group_number += 1
+        else:
+            grandchildren_group_number = None
+    threads[children_thread_id] = {'parsing_order':children_parsing_order}
+    threads[children_thread_id]['group_number'] = children_group_number
+    threads[children_thread_id]['group_type'] = children_group_type
+    threads[children_thread_id]['section'] = children_section
+    threads[children_thread_id]['parent_data'] = threads[thread_id]['modulo']
+    threads[thread_id]['modulo'].iloc[0:0] # Remove reports from modulo
+    threads[children_thread_id]['children_group_number'] = grandchildren_group_number
+
+def add_dynamic_children():
+    for i in range(0,len(children_parsing_order[0][children_group_type])):
+        branch_i_parsing_order = deepcopy(branch_parsing_order)
+        children_thread_id = str(children_group_number) + str(i+1) + thread_id
+        # Now build children's thread
+        children_section = children_parsing_order[0][children_group_type].pop(0)
+        children_idx = threads[thread_id]['modulo'].loc[threads[thread_id]['modulo'][0].str[0:sentinals_lens.get(children_section)] == sentinals.get(children_section)].index
+        if len(children_idx) == 0:
+            continue
+        threads[thread_id]['children'].append(children_thread_id)
+        threads[thread_id]['children_no'] += 1
+        branch_i_parsing_order[0][children_group_type].remove(children_section)
+        grandchildren_group_number = children_group_number
+        if len(branch_i_parsing_order[0][children_group_type]) == 0 or children_group_type == 'e':
+            branch_i_parsing_order.pop(0)
+            if len(children_parsing_order) > 0:
+                grandchildren_group_number += 1
+            else:
+                grandchildren_group_number = None
+        threads[children_thread_id] = {'parsing_order':branch_i_parsing_order}
+        threads[children_thread_id]['group_number'] = children_group_number
+        threads[children_thread_id]['group_type'] = children_group_type
+        threads[children_thread_id]['section'] = children_section
+        threads[children_thread_id]['parent_data'] = threads[thread_id]['modulo'].loc[children_idx]
+        threads[thread_id]['modulo'].drop(children_idx,inplace = True)
+        threads[children_thread_id]['children_group_number'] = grandchildren_group_number
+    if (len(threads[thread_id]['modulo'])) > 0:
+        add_higher_group_children()
+
+def extract_sections(df_in):
+    # threads elements:
+    #    'parsing_order'            What needs to be applied to current parent data
+    #    'group_number'             Order in the global parsing order
+    #    'group_type'               Is it sequential, exclusive or optional
+    #    'section'                  Section name to be extracted from parent_data to data
+    #    'parent_data'              Inital data from which section must be extracted
+    #    'data'                     Section data extracted from parent_data
+    #    'modulo'                   Reminder of parent_data after extracting section (data)
+    #    'children_no'              Number of children threads to build, based on next parsing order list element. Resets to number of active children
+    #    'children'                 Thread id for every child
+    #    'children_group_number'    Group number (in the global parsing order, of the children)
+    global sentinals, section_lens, sentinal_lens, parsing_order
+    global children_group_type
+    global threads
+    global thread_id
+    global group_type
+
+    # Initial "node': input data
+    threads = dict()
+    thread_id = '00'
+    threads_queue = [thread_id]
+    threads[thread_id] = {'parsing_order':parsing_order}
+    threads[thread_id]['group_number'] = 0
+    threads[thread_id]['group_type'] = None
+    threads[thread_id]['section'] = None
+    threads[thread_id]['parent_data'] = df_in
+    threads[thread_id]['data'] = None
+    threads[thread_id]['modulo'] = threads[thread_id]['parent_data']
+    del threads[thread_id]['parent_data']
+    threads[thread_id]['children_group_number'] = 1
+    add_next_children()
+    threads_queue.extend(threads[thread_id]['children'])
+    threads_queue.remove(thread_id)
+    # And now, once initialized, let it grow:
+    logging.info('Processing section partitioning threads')
+    while threads_queue:
+        thread_id = threads_queue[0]
+        logging.info('{} ...'.format(thread_id))
+        group_type = threads[thread_id]['group_type']
+        # get section data
+        extract_data()
+        # kill thread if nothing there
+        if len(threads[thread_id]['data']) == 0:
+            del threads[thread_id]
+            logging.info('{} deleted: no data'.format(thread_id))
+            threads_queue.pop(0)
+            continue
+        # build children threads
+        if len(threads[thread_id]['parsing_order']) > 0  and len(threads[thread_id]['modulo']) > 0:
+            add_next_children()
+            threads_queue.extend(threads[thread_id]['children'])
+            #del threads[thread_id]['modulo'] # not until we control what to do whit leftovers....
+        threads_queue.pop(0)
+        logging.info('done')
+    section_dict = dict()
+    section_groups = [ d[x] for d in parsing_order for x in d.keys() ]
+    sections = [item for sublist in section_groups for item in sublist]
+    for section in sections:
+        #section_dict[section] = pd.DataFrame() # Index as initial size to help final merging
+        section_dict[section] = pd.Series()
+        thread_ids = [ x for x in threads.keys() if threads[x]['section'] == section ]
+        for thread_id in thread_ids:
+            section_dict[section] = section_dict[section].append(threads[thread_id]['data'],ignore_index=False)
+        section_dict[section].sort_index(inplace=True)
+    return section_dict
+
+#   ---------------------------------------------------------------------------
+#   MAIN
+#   ---------------------------------------------------------------------------
+def get_sections(StringDf, schema, read_sections):
+    global sentinals, section_lens, sentinals_lens
+    global parsing_order
+
+    if len(schema['sections'].keys())> 1:
+        section_lens = { section: schema['sections'][section]['header'].get('length') for section in schema['sections'].keys()}
+        sentinals = { section: schema['sections'][section]['header'].get('sentinal') for section in schema['sections'].keys()}
+        sentinals_lens = { section: len(sentinals.get(section)) if sentinals.get(section) else 0 for section in sentinals.keys()}
+        parsing_order = schema['header']['parsing_order']
+        # Get sections separated
+        section_strings = extract_sections(StringDf)
+        # Paste in order in a single dataframe with columns named as sections
+        # Do not include sections not asked for
+        df_out = pd.DataFrame()
+        for section in read_sections:
+            df_out = pd.concat([df_out,section_strings[section].rename(section)],sort = False,axis=1)
+    else:
+        df_out = StringDf
+        df_out.columns = read_sections
+
+
+    return df_out
diff --git a/reader/import_data.py b/reader/import_data.py
new file mode 100644
index 0000000000000000000000000000000000000000..a98a184dad6c054a8e7b3ffe93134060a26157b2
--- /dev/null
+++ b/reader/import_data.py
@@ -0,0 +1,44 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+Created on Fri Jan 10 13:17:43 2020
+
+FUNCTION TO PREPARE SOURCE DATA TO WHAT GET_SECTIONS() EXPECTS, AN ITERABLE:
+EITHER A PD.IO.PARSERS.TEXTFILEREADER OR A LIST, DEPENDING ON
+SOURCE TYPE AND CHUNKSIZE ARGUMENT
+BASICALLY 1 RECORD (ONE OR MULTIPLE REPORTS) IN ONE LINE
+
+delimiter="\t" option in pandas.read_fwf avoids white spaces at taild 
+to be stripped
+
+@author: iregon
+
+OPTIONS IN OLD DEVELOPMENT:
+    1. DLMT: delimiter = ',' default
+        names = [ (x,y) for x in schema['sections'].keys() for y in schema['sections'][x]['elements'].keys()]
+        missing = { x:schema['sections'][x[0]]['elements'][x[1]].get('missing_value') for x in names }
+        TextParser = pd.read_csv(source,header = None, delimiter = delimiter, encoding = 'utf-8',
+                                 dtype = 'object', skip_blank_lines = False, chunksize = chunksize,
+                                 skiprows = skiprows, names = names, na_values = missing)
+
+    2. FWF:# delimiter = '\t' so that it reads blanks as blanks, otherwise reads as empty: NaN
+    this applies mainly when reading elements from sections, but we leave it also here
+    TextParser = pd.read_fwf(source,widths=[FULL_WIDTH],header = None, skiprows = skiprows, delimiter="\t", chunksize = chunksize)
+
+"""
+
+import pandas as pd
+import os
+from mdf_reader import properties
+
+def import_data(source,chunksize = None, skiprows = None):
+
+    if isinstance(source,pd.io.parsers.TextFileReader):
+        TextParser = source
+    elif os.path.isfile(source):
+        TextParser = pd.read_fwf(source,widths=[properties.MAX_FULL_REPORT_WIDTH],header = None, delimiter="\t", skiprows = skiprows, chunksize = chunksize)
+        if not chunksize:
+            TextParser = [TextParser]
+    else:
+        print('Error')
+    return TextParser
diff --git a/reader/meta_formats/delimited.py b/reader/meta_formats/delimited.py
index 5aebbb175abcee552ba2f4ef746372c854e6ac6b..f38fe197b362577ed17842bad1a66eaa720266c2 100644
--- a/reader/meta_formats/delimited.py
+++ b/reader/meta_formats/delimited.py
@@ -8,8 +8,8 @@ DataFrame.
 
 Assumes source data as data model layout and all sections and elements in data.
 Reads in full data content, then decodes and converts the elements.
- 
-Internally works assuming highest complexity in the input data model: 
+
+Internally works assuming highest complexity in the input data model:
 multiple sequential sections
 
 @author: iregon
@@ -44,36 +44,10 @@ else:
     from io import BytesIO as BytesIO
 
 #   ---------------------------------------------------------------------------
-#   FUNCTION TO PREPARE SOURCE DATA TO WHAT GET_SECTIONS() EXPECTS, AN ITERABLE:
-#   EITHER A PD.IO.PARSERS.TEXTFILEREADER OR A LIST, DEPENDING ON 
-#   SOURCE TYPE AND CHUNKSIZE ARGUMENT
-#   BASICALLY 1 RECORD (ONE OR MULTIPLE REPORTS) IN ONE LINE
-#   ---------------------------------------------------------------------------
-def source_11(source, schema, chunksize = None, skiprows = None, delimiter = ',' ):
-    # 11: 1 REPORT PER RECORD IN ONE LINE
-    if isinstance(source,pd.DataFrame):
-        TextParser = source
-        TextParser = [TextParser]
-    elif isinstance(source,pd.io.parsers.TextFileReader):
-        TextParser = source
-    else:
-        names = [ (x,y) for x in schema['sections'].keys() for y in schema['sections'][x]['elements'].keys()]
-        missing = { x:schema['sections'][x[0]]['elements'][x[1]].get('missing_value') for x in names }
-        TextParser = pd.read_csv(source,header = None, delimiter = delimiter, encoding = 'utf-8',
-                                 dtype = 'object', skip_blank_lines = False, chunksize = chunksize,
-                                 skiprows = skiprows, names = names, na_values = missing)
-        if not chunksize:
-            TextParser = [TextParser]
-    return TextParser
-
-def source_1x(source,schema, chunksize = None, skiprows = None, delimiter = ',' ):
-    # 1X: MULTIPLE REPORTS PER RECORD IN ONE LINE
-    return source_11(source,schema, chunksize = chunksize, skiprows = skiprows, delimiter = ',' )
-#   ---------------------------------------------------------------------------
 #   MAIN FUNCTIONS
 #   ---------------------------------------------------------------------------
 def source_to_df(source, schema, read_sections, idx_offset = 0):
-    
+
     column_names = []
     for section in schema['sections']:
         column_names.extend([ (section,i) for i in schema['sections'][section]['elements'] ])
@@ -102,11 +76,11 @@ def source_to_df(source, schema, read_sections, idx_offset = 0):
         for element in dtypes.keys():
                 missing = df[element].isna()
                 if element in encoded:
-                    df[element] = decoders.get(encodings.get(element)).get(dtypes.get(element))(df[element]) 
-                          
+                    df[element] = decoders.get(encodings.get(element)).get(dtypes.get(element))(df[element])
+
                 kwargs = { converter_arg:schema['sections'][element[0]]['elements'][element[1]].get(converter_arg) for converter_arg in properties.data_type_conversion_args.get(dtypes.get(element))  }
-                df[element] = converters.get(dtypes.get(element))(df[element], **kwargs) 
-                
+                df[element] = converters.get(dtypes.get(element))(df[element], **kwargs)
+
                 valid[element] = missing | df[element].notna()
         # Add _datetime section: watch this if we mean to do multiple reports in record!!!
         # for this to be valid, would have to assume that same day reports and that date in common report section....
@@ -118,11 +92,11 @@ def source_to_df(source, schema, read_sections, idx_offset = 0):
             out_dtypes.update({ date_name: 'object' })
             df = functions.df_prepend_datetime(df, date_elements, date_parser['format'], date_name = date_name )
             valid = pd.concat([pd.DataFrame(index = valid.index, data = True,columns = [date_name]),valid],sort = False,axis=1)
-            
-        out_dtypes.update({ i:df[i].dtype.name for i in df if df[i].dtype.name in properties.numpy_floats})   
-        if idx_offset > 0:  
+
+        out_dtypes.update({ i:df[i].dtype.name for i in df if df[i].dtype.name in properties.numpy_floats})
+        if idx_offset > 0:
             df.index = df.index + idx_offset
-        # If I get into the section: is it really only removing that named element from that section???? have to check 
+        # If I get into the section: is it really only removing that named element from that section???? have to check
         #element[section].drop([element],axis=1,level=1,inplace = True)
         # Drop level 0 in multilevel if len(read_sections)==1 or section is dummy
         # 3. Add chunk data to output
@@ -130,5 +104,5 @@ def source_to_df(source, schema, read_sections, idx_offset = 0):
         df.to_csv(output_buffer,header = header, mode = 'a', encoding = 'utf-8',index = False)
         valid.to_csv(valid_buffer,header=header, mode = 'a', encoding = 'utf-8',index = False)
         I_CHUNK += 1
- 
-    return output_buffer, valid_buffer, out_dtypes
\ No newline at end of file
+
+    return output_buffer, valid_buffer, out_dtypes
diff --git a/reader/meta_formats/fixed_width.py b/reader/meta_formats/fixed_width.py
index 17b7c9cd52883d422dfef36fcfb9c48558ba7249..29a6fe5e9e8e610909dbc8b7a0d103059d7e0a43 100644
--- a/reader/meta_formats/fixed_width.py
+++ b/reader/meta_formats/fixed_width.py
@@ -10,8 +10,8 @@ Uses the data model layout to first find sections in the data and internally
 store the data in sections, then reads in, decodes and converts the elements on
 a section by section basis and finally merges that together in the output
 dataframe.
- 
-Internally works assuming highest complexity in the input data model: 
+
+Internally works assuming highest complexity in the input data model:
 multiple non sequential sections
 
 @author: iregon
@@ -41,7 +41,7 @@ if sys.version_info[0] >= 3:
 else:
     py3 = False
     from io import BytesIO as BytesIO
-    
+
 
 FULL_WIDTH = 100000
 
@@ -147,13 +147,13 @@ def get_sections(df_in):
     #    'modulo'                   Reminder of parent_data after extracting section (data)
     #    'children_no'              Number of children threads to build, based on next parsing order list element. Resets to number of active children
     #    'children'                 Thread id for every child
-    #    'children_group_number'    Group number (in the global parsing order, of the children) 
+    #    'children_group_number'    Group number (in the global parsing order, of the children)
     global sentinals, section_lens, sentinal_lens, parsing_order
     global children_group_type
     global threads
     global thread_id
     global group_type
-    
+
     # Initial "node': input data
     threads = dict()
     thread_id = '00'
@@ -202,39 +202,13 @@ def get_sections(df_in):
         section_dict[section].sort_index(inplace=True)
     return section_dict
 
-#   ---------------------------------------------------------------------------
-#   FUNCTION TO PREPARE SOURCE DATA TO WHAT GET_SECTIONS() EXPECTS, AN ITERABLE:
-#   EITHER A PD.IO.PARSERS.TEXTFILEREADER OR A LIST, DEPENDING ON 
-#   SOURCE TYPE AND CHUNKSIZE ARGUMENT
-#   BASICALLY 1 RECORD (ONE OR MULTIPLE REPORTS) IN ONE LINE
-#   ---------------------------------------------------------------------------
-def source_11(source,schema, chunksize = None, skiprows = None, delimiter = None ):
-    # 11: 1 REPORT PER RECORD IN ONE LINE
-    # delimiter = '\t' so that it reads blanks as blanks, otherwise reads as empty: NaN
-    # this applies mainly when reading elements from sections, but we leave it also here
-    if isinstance(source,pd.DataFrame):
-        TextParser = source
-        TextParser.columns = [0]
-        TextParser = [TextParser]
-    elif isinstance(source,pd.io.parsers.TextFileReader):
-        TextParser = source
-    else:
-        TextParser = pd.read_fwf(source,widths=[FULL_WIDTH],header = None, skiprows = skiprows, delimiter="\t", chunksize = chunksize)
-        if not chunksize:
-            TextParser = [TextParser]
-    return TextParser
-
-def source_1x(source,schema, chunksize = None, skiprows = None, delimiter = None  ):
-    # 1X: MULTIPLE REPORTS PER RECORD IN ONE LINE
-    return source_11(source,schema, chunksize = chunksize, skiprows = skiprows, delimiter = delimiter )
-
 #   ---------------------------------------------------------------------------
 #   MAIN FUNCTIONS
 #   ---------------------------------------------------------------------------
 def source_to_df(TextParser, schema, read_sections, idx_offset = 0):
     global sentinals, section_lens, sentinals_lens
     global parsing_order
-    
+
     section_lens = { section: schema['sections'][section]['header'].get('length') for section in schema['sections'].keys()}
     sentinals = { section: schema['sections'][section]['header'].get('sentinal') for section in schema['sections'].keys()}
     sentinals_lens = { section: schema['sections'][section]['header'].get('sentinal_length') for section in schema['sections'].keys()}
@@ -247,7 +221,7 @@ def source_to_df(TextParser, schema, read_sections, idx_offset = 0):
             out_dtypes.update({ (section,i):properties.pandas_dtypes.get(schema['sections'][section]['elements'][i].get('column_type')) for i in schema['sections'][section]['elements'].keys() } )
     else:
         for section in read_sections:
-            out_dtypes.update({ i:properties.pandas_dtypes.get(schema['sections'][section]['elements'][i].get('column_type')) for i in schema['sections'][section]['elements'].keys() } ) 
+            out_dtypes.update({ i:properties.pandas_dtypes.get(schema['sections'][section]['elements'][i].get('column_type')) for i in schema['sections'][section]['elements'].keys() } )
     I_CHUNK = 0
     output_buffer = StringIO() if py3 else BytesIO()
     valid_buffer = StringIO() if py3 else BytesIO()
@@ -297,12 +271,12 @@ def source_to_df(TextParser, schema, read_sections, idx_offset = 0):
                 missing = section_elements[element].isna()
                 if element in encoded:
                     section_elements[element] = decoders.get(section_encoding.get(element)).get(section_dtypes.get(element))(section_elements[element])
-                  
+
                 kwargs = { converter_arg:schema['sections'][section]['elements'][element].get(converter_arg) for converter_arg in properties.data_type_conversion_args.get(section_dtypes.get(element))  }
                 section_elements[element] = converters.get(section_dtypes.get(element))(section_elements[element], **kwargs)
-                
+
                 section_valid[element] = missing | section_elements[element].notna()
-                
+
             # 3.1.3. Format section:
             #   - Put data in its rightfull place of the original data (indexing!) and remove section elements not desired
             #   - Name columns: tuples (section, element_name) for multisection, element_name if one section
@@ -338,4 +312,4 @@ def source_to_df(TextParser, schema, read_sections, idx_offset = 0):
         valid_out.to_csv(valid_buffer,header=header, mode = 'a', encoding = 'utf-8',index = False)
         I_CHUNK += 1
 
-    return output_buffer,valid_buffer,out_dtypes
\ No newline at end of file
+    return output_buffer,valid_buffer,out_dtypes
diff --git a/reader/read_sections.py b/reader/read_sections.py
new file mode 100644
index 0000000000000000000000000000000000000000..9bdd36168402e8ed70ff30a79933d173897ed647
--- /dev/null
+++ b/reader/read_sections.py
@@ -0,0 +1,113 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+Created on Fri Jan 10 13:17:43 2020
+
+@author: iregon
+"""
+
+import pandas as pd
+from io import StringIO as StringIO
+import mdf_reader.properties as properties
+import csv # To disable quoting
+from mdf_reader.common.converters import converters
+from mdf_reader.common.decoders import decoders
+
+def extract_fixed_width(section_serie_bf,section_schema):
+    # Read section elements descriptors
+    section_names = section_schema['elements'].keys()
+    section_widths = list(map(lambda x: x if x else properties.MAX_FULL_REPORT_WIDTH, [ section_schema['elements'][i].get('field_length') for i in section_names ]))
+    section_missing = { i:section_schema['elements'][i].get('missing_value') if section_schema['elements'][i].get('disable_white_strip') == True
+                               else [section_schema['elements'][i].get('missing_value')," "*section_schema['elements'][i].get('field_length', properties.MAX_FULL_REPORT_WIDTH)]
+                               for i in section_names }
+    section_elements = pd.read_fwf(section_serie_bf, widths = section_widths, header = None, names = section_names , na_values = section_missing, delimiter="\t", encoding = 'utf-8', dtype = 'object', skip_blank_lines = False )
+    return section_elements
+
+def extract_delimited(section_serie_bf,section_schema): 
+    delimiter = section_schema['header'].get('delimiter')
+    section_names = section_schema['elements'].keys()
+    section_missing = { x:section_schema['elements'][x].get('missing_value') for x in section_names }
+    section_elements = pd.read_csv(section_serie_bf,header = None, delimiter = delimiter, encoding = 'utf-8',
+                                 dtype = 'object', skip_blank_lines = False,
+                                 names = section_names, na_values = section_missing)
+    
+    return section_elements
+
+def read_data(section_df,section_schema): 
+    section_names = section_df.columns
+    section_dtypes = { i:section_schema['elements'][i]['column_type'] for i in section_names }
+    encoded = [ (x) for x in section_names if 'encoding' in section_schema['elements'][x]]
+    section_encoding = { i:section_schema['elements'][i]['encoding'] for i in encoded }
+    
+    for element in section_dtypes.keys():
+        #missing = section_elements[element].isna()
+        if element in encoded:
+            section_df[element] = decoders.get(section_encoding.get(element)).get(section_dtypes.get(element))(section_df[element])
+
+        kwargs = { converter_arg:section_schema['elements'][element].get(converter_arg) for converter_arg in properties.data_type_conversion_args.get(section_dtypes.get(element))  }
+        section_df[element] = converters.get(section_dtypes.get(element))(section_df[element], **kwargs)
+
+#        section_valid[element] = missing | section_elements[element].notna()
+                
+    return section_df
+
+def read_sections(sections_df, schema):
+    
+    multiindex = True if len(sections_df.columns) > 1 or sections_df.columns[0] != properties.dummy_level else False
+    data_df = pd.DataFrame()
+    
+    out_dtypes = dict()
+    
+    for section in sections_df.columns: 
+        print('Reading section {}'.format(section))
+        section_schema = schema['sections'].get(section)
+        disable_read = section_schema.get('header').get('disable_read')
+        
+        if not disable_read:     
+            field_layout = section_schema.get('header').get('field_layout')
+            ignore = [ i for i in section_schema['elements'].keys() if section_schema['elements'][i].get('ignore') ] # evals to True if set and true, evals to False if not set or set and false
+             # Get rid of false delimiters in fixed_width
+            delimiter = section_schema['header'].get('delimiter')
+            if delimiter and field_layout == 'fixed_width':
+                sections_df[section] = sections_df[section].str.replace(delimiter,'')
+        
+            section_buffer = StringIO()
+            # Writing options from quoting on to prevent supp buoy data to be quoted:
+            # maybe this happenned because buoy data has commas, and pandas makes its own decission about
+            # how to write that.....
+            #https://stackoverflow.com/questions/21147058/pandas-to-csv-output-quoting-issue
+            # quoting=csv.QUOTE_NONE was failing when a section is empty (or just one record in a section,...)
+            # Here indices are lost, have to give the real ones, those in section_strings:
+            # we'll see if we do that in the caller module or here....
+            sections_df[section].to_csv(section_buffer,header=False, encoding = 'utf-8',index = False)#,quoting=csv.QUOTE_NONE,escapechar="\\",sep="\t") 
+            ssshh = section_buffer.seek(0)
+        # Get the individual elements as objects
+            if field_layout == 'fixed_width':
+                section_elements_obj = extract_fixed_width(section_buffer,section_schema)
+            elif field_layout == 'delimited':
+                section_elements_obj = extract_delimited(section_buffer,section_schema)
+                
+            section_elements_obj.drop(ignore, axis = 1, inplace = True)
+            # Read the objects to their data types and apply decoding, scaling and so on...
+            section_elements = read_data(section_elements_obj,section_schema)
+            section_elements.index = sections_df[section].index
+        else:
+            section_elements = pd.DataFrame(sections_df[section],columns = [section])
+               
+        if not disable_read:
+            if multiindex:
+                out_dtypes.update({ (section,i):properties.pandas_dtypes.get(section_schema['elements'][i].get('column_type')) for i in section_elements.columns } )
+                out_dtypes.update({ (section,i):section_elements[i].dtype.name for i in section_elements if section_elements[i].dtype.name in properties.numpy_floats})
+            else:
+                out_dtypes.update({ i:properties.pandas_dtypes.get(section_schema['elements'][i].get('column_type')) for i in section_elements.columns } ) 
+                out_dtypes.update({ i:section_elements[i].dtype.name for i in section_elements if section_elements[i].dtype.name in properties.numpy_floats})
+        else:
+            if multiindex:
+                    out_dtypes.update({ (section,section):'object' } )
+            else:
+                out_dtypes.update({ section:'object' } )        
+        
+        section_elements.columns = [ (section, x) for x in section_elements.columns] if multiindex else section_elements.columns
+        data_df = pd.concat([data_df,section_elements],sort = False,axis=1)
+           
+    return data_df,out_dtypes
diff --git a/reader/reader.py b/reader/reader.py
index 4309c8fbf6c534be56b1d2bcc0b4dd7f16dffa64..db2a381ccc26d19b352002cd75a575d783f845d5 100644
--- a/reader/reader.py
+++ b/reader/reader.py
@@ -27,7 +27,13 @@ import pandas as pd
 import numpy as np
 import logging
 from . import meta_formats
+
 from .. import properties
+from . import import_data
+from . import get_sections
+from . import read_sections
+
+import copy
 
 if sys.version_info[0] >= 3:
     py3 = True
@@ -38,136 +44,70 @@ else:
 # Get pandas dtype for time_stamps
 pandas_timestamp_dtype = pd.to_datetime(pd.DataFrame(['20000101'])[0],format='%Y%m%d').dtypes
 
-def add_supplemental(data, supp_section, supp_schema, valid):
-    # Supplemental data needs to have no sectioning: cannot merge dfs with different level depths in the columns...
-    try:
-
-        supp_format = supp_schema['header'].get('format')
-
-        if supp_format in properties.supported_meta_file_formats:
-            TextParser = data if isinstance(data, pd.io.parsers.TextFileReader) else [data]
-            TextParser_valid = valid if isinstance(valid, pd.io.parsers.TextFileReader) else [valid]
-            chunksize = data.orig_options['chunksize'] if isinstance(TextParser,pd.io.parsers.TextFileReader) else None
-            iidx_offset = chunksize if chunksize else 0
-            output_buffer = StringIO() if py3 else BytesIO()
-            output_buffer_valid = StringIO() if py3 else BytesIO()
-            I_CHUNK = 0
-            for idata,ivalid in zip(TextParser,TextParser_valid):
-                date_columns = list(np.where(idata.dtypes == pandas_timestamp_dtype)[0])
-                dtypes = idata.dtypes.to_dict()
-                supp, supp_valid = read_model(idata[supp_section],supp_schema, idx_offset = I_CHUNK*iidx_offset )
-                supp_date_columns = list(np.where(supp.dtypes == pandas_timestamp_dtype)[0] + len(idata.columns) - 1 )
-                date_columns.extend(supp_date_columns)
-                date_columns = [ int(x) for x in date_columns ] # reader date parser won't take numpy.int64 from np.where as col index
-                if I_CHUNK == 0:
-                    o_supp_dtypes = supp.dtypes.to_dict()
-                else:
-                    o_supp_dtypes.update({ i:supp[i].dtype for i in supp if supp[i].dtype in properties.numpy_floats})
-                supp_elements = supp.columns.to_list()
-                supp_dtypes = {}
-                for element in supp_elements:
-                    supp_dtypes[(supp_section,element)] =  o_supp_dtypes.get(element)
-                dtypes.pop((supp_section,idata[supp_section].columns.to_list()[0]), None)
-                idata.drop(supp_section, axis = 1, inplace = True, level = 0)# OMG: apparently, with multiindex, this does not drop the columns from idata.columns
-                ivalid.drop(supp_section, axis = 1, inplace = True, level = 0)
-                supp.columns = [ (supp_section,x) for x in supp.columns ]
-                supp_valid.columns = [ (supp_section,x) for x in supp_valid.columns ]
-                dtypes.update(supp_dtypes)
-                supp.index = idata.index
-                supp_valid.index = ivalid.index
-                column_names = [ x for x in idata if x[0] != supp_section ]
-                column_names.extend([ x for x in supp ])
-                new_dtypes = { x:dtypes.get(x) for x in column_names }
-                idata = pd.concat([idata,supp],sort = False,axis=1)
-                ivalid = pd.concat([ivalid,supp_valid],sort = False,axis=1)
-                idata.to_csv(output_buffer,header=False, mode = 'a', encoding = 'utf-8',index = False)
-                ivalid.to_csv(output_buffer_valid,header=False, mode = 'a', encoding = 'utf-8',index = False)
-                I_CHUNK += 1
-            
-            output_buffer.seek(0)
-            output_buffer_valid.seek(0)
-            for element in list(dtypes):
-                if new_dtypes.get(element) == pandas_timestamp_dtype:
-                    new_dtypes[element] = 'object' # Only on output (on reading) will be then converted to datetime64[ns] type, cannot specify 'datetime' here: have to go through parser
-            data = pd.read_csv(output_buffer,names = idata.columns, dtype = new_dtypes, chunksize = chunksize, parse_dates = date_columns )
-            valid = pd.read_csv(output_buffer_valid,names = ivalid.columns, chunksize = chunksize)
-            return data, valid
-        else:
-            logging.error('Supplemental file format not supported: {}'.format(supp_format))
-            logging.warning('Supplemental data not extracted from supplemental section')
-            return data, valid
-    except Exception as e:
-        logging.warning('Supplemental data not extracted from supplemental section', exc_info=True)
-        return data, valid
-
-
-def read_model(source,schema, sections = None, chunksize = None, skiprows = None, idx_offset = 0):
-
-    meta_format = schema['header'].get('format')
-    if meta_format not in properties.supported_meta_file_formats:
-        logging.error('File format read from input schema not supported: {}'.format(meta_format))
-        return
-    meta_reader = ".".join(['meta_formats',meta_format])
+def read_model(source,schema, sections = None, chunksize = None, skiprows = None):
 
     # 0. GET META FORMAT SUBCLASS ---------------------------------------------
-    if schema['header'].get('multiple_reports_per_line'): # needs to eval to True if set and True and to false if not set or false, without breaking
-        format_subclass = '1x'
-    else:
-        format_subclass = '11'
+    # For future use: some work already done in schema reading
+    if schema['header'].get('multiple_reports_per_line'):
+        logging.error('File format not yet supported')
+        sys.exit(1)
 
     # 1. PARSE SCHEMA ---------------------------------------------------------
 
-    delimiter = schema['header'].get('delimiter')
     parsing_order = schema['header'].get('parsing_order')
 
     # 2. DEFINE OUTPUT --------------------------------------------------------
     # 2.1 Sections to read
     if not sections:
         sections = [ x.get(y) for x in parsing_order for y in x ]
-        read_sections = [y for x in sections for y in x]
+        read_sections_list = [y for x in sections for y in x]
     else:
-        read_sections = sections
-    multiindex = True if len(read_sections) > 1 or read_sections[0] != properties.dummy_level else False
+        read_sections_list = sections
+        
+
+    # 3. HOMOGENEIZE INPUT DATA (FILE OR TEXTREADER) TO AN ITERABLE TEXTREADER
+    logging.info("Getting data string from source...")
+    TextParser = import_data.import_data(source, chunksize = chunksize, skiprows = skiprows)
+    
+    # 4. EXTRACT SECTIONS IN A PARSER; EXTRACT SECTIONS HERE AND READ DATA IN 
+    # SAME LOOP? SHOULD DO....
+    logging.info("Extracting sections...")
+    data_buffer = StringIO()
     
-    if format_subclass == '1x':
-        return schema
-    # 2.1 Elements names: same order as declared in schema, which is the order in which the readers read them...
-    names = []
-    if schema['header'].get('date_parser'):
-        if multiindex:
-            names.extend([('_datetime','_datetime')])
-        else:
-            names.extend(['_datetime'])
-
-    for section in read_sections:
-        if multiindex:
-            names.extend([ (section,x) for x in schema['sections'][section]['elements'].keys() if not schema['sections'][section]['elements'][x].get('ignore') ])
-        else:
-            names.extend([ x for x in schema['sections'][section]['elements'].keys() if not schema['sections'][section]['elements'][x].get('ignore') ])
-
-    # 3. GET DATA FROM SOURCE (DF, FILE OR TEXTREADER):------------------------
-    #    SIMPLE STRING PER REPORT/LINE
-    logging.info("Getting input data from source...")
-    source_function = eval(meta_reader + "." + "_".join(['source',format_subclass]))
-    TextParser = source_function(source,schema, chunksize = chunksize, skiprows = skiprows, delimiter = delimiter)
-    # 4. DO THE ACTUAL READING
-    reader_function = eval(meta_reader + "." + 'source_to_df')
-    logging.info("Reading data...")
-    [output_buffer,valid_buffer,dtypes] = reader_function(TextParser, schema, read_sections = read_sections, idx_offset = idx_offset )
-    # 5. OUTPUT DATA:----------------------------------------------------------
-    # WE'LL NEED TO POSPROCESS THIS WHEN READING MULTIPLE REPORTS PER LINE
-    output_buffer.seek(0)
-    valid_buffer.seek(0)
-    logging.info("Wrapping output....")
-    chunksize = TextParser.orig_options['chunksize'] if isinstance(TextParser,pd.io.parsers.TextFileReader) else None
-    logging.info('Data')
-    # 'datetime' is not a valid pandas dtype: Only on output (on reading) will be then converted (via parse_dates) to datetime64[ns] type, cannot specify 'datetime' (of any kind) here: will fail
-    date_columns = [] # Needs to be the numeric index of the column, as seems not to be able to work with tupples....
-    for i,element in enumerate(list(dtypes)):
-        if dtypes.get(element) == 'datetime':
-            date_columns.append(i)
-    df_reader = pd.read_csv(output_buffer,names = names, chunksize = chunksize, dtype = dtypes, parse_dates = date_columns)
-    logging.info('Mask')
-    valid_reader = pd.read_csv(valid_buffer,names = names, chunksize = chunksize)
-
-    return df_reader, valid_reader
+    
+#    valid_buffer = ...
+    for i,string_df in enumerate(TextParser):
+        # Get sections separated in a dataframe: one per column, only requested
+        # sections, ignore rest.
+        sections_df = get_sections.get_sections(string_df, schema, read_sections_list)
+        # Read elements from sections: along data chunks, resulting data types
+        # may vary if gaps
+        [data_df,out_dtypesi ] = read_sections.read_sections(sections_df, schema)
+        if i == 0:
+            out_dtypes = copy.deepcopy(out_dtypesi)
+            
+        for k in out_dtypesi: 
+            if out_dtypesi in properties.numpy_floats:
+                out_dtypes.update({ k:out_dtypesi.get(k) })
+
+        data_df.to_csv(data_buffer,header = False, mode = 'a', encoding = 'utf-8',index = False)
+#        [output_buffer,valid_buffer,dtypes] = reader_function(TextParser, schema, read_sections = read_sections, idx_offset = idx_offset )
+#        
+#    # 5. OUTPUT DATA:----------------------------------------------------------
+#    # WE'LL NEED TO POSPROCESS THIS WHEN READING MULTIPLE REPORTS PER LINE
+    data_buffer.seek(0)
+#    valid_buffer.seek(0)
+#    logging.info("Wrapping output....")
+#    chunksize = TextParser.orig_options['chunksize'] if isinstance(TextParser,pd.io.parsers.TextFileReader) else None
+#    logging.info('Data')
+#    # 'datetime' is not a valid pandas dtype: Only on output (on reading) will be then converted (via parse_dates) to datetime64[ns] type, cannot specify 'datetime' (of any kind) here: will fail
+#    date_columns = [] # Needs to be the numeric index of the column, as seems not to be able to work with tupples....
+#    for i,element in enumerate(list(dtypes)):
+#        if dtypes.get(element) == 'datetime':
+#            date_columns.append(i)
+    data_reader = pd.read_csv(data_buffer,names = data_df.columns, chunksize = chunksize, dtype = out_dtypes)#, parse_dates = date_columns)
+#    logging.info('Mask')
+#    valid_reader = pd.read_csv(valid_buffer,names = out_names, chunksize = chunksize)
+
+#    return data_reader, valid_reader
+    return data_reader
diff --git a/reader/reader.py.old b/reader/reader.py.old
new file mode 100644
index 0000000000000000000000000000000000000000..5c5054e824aff3c5a28ed65449c0b592ce9c9ad3
--- /dev/null
+++ b/reader/reader.py.old
@@ -0,0 +1,173 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+Created on Tue Apr 30 09:38:17 2019
+
+Reads source data from a data model to a pandas DataFrame.
+
+Optionally, it reads supplemental data from the same source (from a different
+ data model) and pastes that to the output DataFrame
+
+Uses the meta_formats generic submodules ('delimited' and 'fixed_width') to
+pre-format data source and read either generic type of data model.
+
+@author: iregon
+"""
+
+from __future__ import unicode_literals
+from __future__ import print_function
+from __future__ import absolute_import
+# CAREFULL HERE:
+# Note that in Python 3, the io.open function is an alias for the built-in open function.
+# The built-in open function only supports the encoding argument in Python 3, not Python 2.
+# https://docs.python.org/3.4/library/io.html?highlight=io
+from io import StringIO as StringIO
+import sys
+import pandas as pd
+import numpy as np
+import logging
+from . import meta_formats
+from .. import properties
+
+if sys.version_info[0] >= 3:
+    py3 = True
+else:
+    py3 = False
+    from io import BytesIO as BytesIO
+
+# Get pandas dtype for time_stamps
+pandas_timestamp_dtype = pd.to_datetime(pd.DataFrame(['20000101'])[0],format='%Y%m%d').dtypes
+
+def add_supplemental(data, supp_section, supp_schema, valid):
+    # Supplemental data needs to have no sectioning: cannot merge dfs with different level depths in the columns...
+    try:
+
+        supp_format = supp_schema['header'].get('format')
+
+        if supp_format in properties.supported_meta_file_formats:
+            TextParser = data if isinstance(data, pd.io.parsers.TextFileReader) else [data]
+            TextParser_valid = valid if isinstance(valid, pd.io.parsers.TextFileReader) else [valid]
+            chunksize = data.orig_options['chunksize'] if isinstance(TextParser,pd.io.parsers.TextFileReader) else None
+            iidx_offset = chunksize if chunksize else 0
+            output_buffer = StringIO() if py3 else BytesIO()
+            output_buffer_valid = StringIO() if py3 else BytesIO()
+            I_CHUNK = 0
+            for idata,ivalid in zip(TextParser,TextParser_valid):
+                date_columns = list(np.where(idata.dtypes == pandas_timestamp_dtype)[0])
+                dtypes = idata.dtypes.to_dict()
+                supp, supp_valid = read_model(idata[supp_section],supp_schema, idx_offset = I_CHUNK*iidx_offset )
+                supp_date_columns = list(np.where(supp.dtypes == pandas_timestamp_dtype)[0] + len(idata.columns) - 1 )
+                date_columns.extend(supp_date_columns)
+                date_columns = [ int(x) for x in date_columns ] # reader date parser won't take numpy.int64 from np.where as col index
+                if I_CHUNK == 0:
+                    o_supp_dtypes = supp.dtypes.to_dict()
+                else:
+                    o_supp_dtypes.update({ i:supp[i].dtype for i in supp if supp[i].dtype in properties.numpy_floats})
+                supp_elements = supp.columns.to_list()
+                supp_dtypes = {}
+                for element in supp_elements:
+                    supp_dtypes[(supp_section,element)] =  o_supp_dtypes.get(element)
+                dtypes.pop((supp_section,idata[supp_section].columns.to_list()[0]), None)
+                idata.drop(supp_section, axis = 1, inplace = True, level = 0)# OMG: apparently, with multiindex, this does not drop the columns from idata.columns
+                ivalid.drop(supp_section, axis = 1, inplace = True, level = 0)
+                supp.columns = [ (supp_section,x) for x in supp.columns ]
+                supp_valid.columns = [ (supp_section,x) for x in supp_valid.columns ]
+                dtypes.update(supp_dtypes)
+                supp.index = idata.index
+                supp_valid.index = ivalid.index
+                column_names = [ x for x in idata if x[0] != supp_section ]
+                column_names.extend([ x for x in supp ])
+                new_dtypes = { x:dtypes.get(x) for x in column_names }
+                idata = pd.concat([idata,supp],sort = False,axis=1)
+                ivalid = pd.concat([ivalid,supp_valid],sort = False,axis=1)
+                idata.to_csv(output_buffer,header=False, mode = 'a', encoding = 'utf-8',index = False)
+                ivalid.to_csv(output_buffer_valid,header=False, mode = 'a', encoding = 'utf-8',index = False)
+                I_CHUNK += 1
+
+            output_buffer.seek(0)
+            output_buffer_valid.seek(0)
+            for element in list(dtypes):
+                if new_dtypes.get(element) == pandas_timestamp_dtype:
+                    new_dtypes[element] = 'object' # Only on output (on reading) will be then converted to datetime64[ns] type, cannot specify 'datetime' here: have to go through parser
+            data = pd.read_csv(output_buffer,names = idata.columns, dtype = new_dtypes, chunksize = chunksize, parse_dates = date_columns )
+            valid = pd.read_csv(output_buffer_valid,names = ivalid.columns, chunksize = chunksize)
+            return data, valid
+        else:
+            logging.error('Supplemental file format not supported: {}'.format(supp_format))
+            logging.warning('Supplemental data not extracted from supplemental section')
+            return data, valid
+    except Exception as e:
+        logging.warning('Supplemental data not extracted from supplemental section', exc_info=True)
+        return data, valid
+
+
+def read_model(source,schema, sections = None, chunksize = None, skiprows = None, idx_offset = 0):
+
+    meta_format = schema['header'].get('format')
+    if meta_format not in properties.supported_meta_file_formats:
+        logging.error('File format read from input schema not supported: {}'.format(meta_format))
+        return
+    meta_reader = ".".join(['meta_formats',meta_format])
+
+    # 0. GET META FORMAT SUBCLASS ---------------------------------------------
+    if schema['header'].get('multiple_reports_per_line'): # needs to eval to True if set and True and to false if not set or false, without breaking
+        format_subclass = '1x'
+    else:
+        format_subclass = '11'
+
+    # 1. PARSE SCHEMA ---------------------------------------------------------
+
+    delimiter = schema['header'].get('delimiter')
+    parsing_order = schema['header'].get('parsing_order')
+
+    # 2. DEFINE OUTPUT --------------------------------------------------------
+    # 2.1 Sections to read
+    if not sections:
+        sections = [ x.get(y) for x in parsing_order for y in x ]
+        read_sections = [y for x in sections for y in x]
+    else:
+        read_sections = sections
+    multiindex = True if len(read_sections) > 1 or read_sections[0] != properties.dummy_level else False
+
+    if format_subclass == '1x':
+        return schema
+    # 2.1 Elements names: same order as declared in schema, which is the order in which the readers read them...
+    names = []
+    if schema['header'].get('date_parser'):
+        if multiindex:
+            names.extend([('_datetime','_datetime')])
+        else:
+            names.extend(['_datetime'])
+
+    for section in read_sections:
+        if multiindex:
+            names.extend([ (section,x) for x in schema['sections'][section]['elements'].keys() if not schema['sections'][section]['elements'][x].get('ignore') ])
+        else:
+            names.extend([ x for x in schema['sections'][section]['elements'].keys() if not schema['sections'][section]['elements'][x].get('ignore') ])
+
+    # 3. GET DATA FROM SOURCE (DF, FILE OR TEXTREADER):------------------------
+    #    SIMPLE STRING PER REPORT/LINE
+    logging.info("Getting input data from source...")
+    source_function = eval(meta_reader + "." + "_".join(['source',format_subclass]))
+    TextParser = source_function(source,schema, chunksize = chunksize, skiprows = skiprows, delimiter = delimiter)
+    # 4. DO THE ACTUAL READING
+    reader_function = eval(meta_reader + "." + 'source_to_df')
+    logging.info("Reading data...")
+    [output_buffer,valid_buffer,dtypes] = reader_function(TextParser, schema, read_sections = read_sections, idx_offset = idx_offset )
+    # 5. OUTPUT DATA:----------------------------------------------------------
+    # WE'LL NEED TO POSPROCESS THIS WHEN READING MULTIPLE REPORTS PER LINE
+    output_buffer.seek(0)
+    valid_buffer.seek(0)
+    logging.info("Wrapping output....")
+    chunksize = TextParser.orig_options['chunksize'] if isinstance(TextParser,pd.io.parsers.TextFileReader) else None
+    logging.info('Data')
+    # 'datetime' is not a valid pandas dtype: Only on output (on reading) will be then converted (via parse_dates) to datetime64[ns] type, cannot specify 'datetime' (of any kind) here: will fail
+    date_columns = [] # Needs to be the numeric index of the column, as seems not to be able to work with tupples....
+    for i,element in enumerate(list(dtypes)):
+        if dtypes.get(element) == 'datetime':
+            date_columns.append(i)
+    df_reader = pd.read_csv(output_buffer,names = names, chunksize = chunksize, dtype = dtypes, parse_dates = date_columns)
+    logging.info('Mask')
+    valid_reader = pd.read_csv(valid_buffer,names = names, chunksize = chunksize)
+
+    return df_reader, valid_reader
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C0.A.json b/schemas/lib/imma.old/code_tables/ICOADS.C0.A.json
new file mode 100644
index 0000000000000000000000000000000000000000..2a8daf9fe9c53de8ff74c4646a249df28c250b29
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C0.A.json
@@ -0,0 +1,11 @@
+{
+	"0":"Increasing, then decreasing; atmopsheric pressure the same or higher than three hours ago",
+	"1":"Increasing, then steady; or increasing, then increasing more slowly - Atmospheric pressure now higher than three hours ago",
+	"2":"Increasing (steadily or unsteadily) - Atmospheric pressure now higher than three hours ago",
+	"3":"Decreasing or steady, then increasing; or increasing, then increasing more rapidly - Atmospheric pressure now higher than three hours ago",
+	"4":"Steady; atmopsheric pressure the same as three hours ago",
+	"5":"Decreasing, then increasing; atmospheric pressure the same ot lower than three hours ago",
+	"6":"Decreasing, then steady; or decreasing, then decreasing more slowly - Atmospheric pressure now lower than three hours ago",
+	"7":"Decreasing (steadily or unsteadily) - Atmospheric pressure now lower than three hours ago",
+	"8":"Steady or increasing, then decreasing; or decreasing, then decreasing more rapidly - Atmospheric pressure now lower than three hours ago"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C0.C1.json b/schemas/lib/imma.old/code_tables/ICOADS.C0.C1.json
new file mode 100644
index 0000000000000000000000000000000000000000..d9ec138fe198628d95ba1a547db3b7aae75beb69
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C0.C1.json
@@ -0,0 +1,259 @@
+{
+	"0":"Netherlands",
+	"1":"Norway",
+	"2":"US",
+	"3":"UK",
+	"4":"France",
+	"5":"Denmark",
+	"6":"Italy",
+	"7":"India",
+	"8":"Hong Kong",
+	"9":"New Zealand",
+	"00":"Netherlands",
+	"01":"Norway",
+	"02":"US",
+	"03":"UK",
+	"04":"France",
+	"05":"Denmark",
+	"06":"Italy",
+	"07":"India",
+	"08":"Hong Kong",
+	"09":"New Zealand",
+	"10":"Ireland",
+	"11":"Philippines",
+	"12":"Egypt",
+	"13":"Canada",
+	"14":"Belgium",
+	"15":"South Africa",
+	"16":"Australia",
+	"17":"Japan",
+	"18":"Pakistan",
+	"19":"Argentina",
+	"20":"Sweden",
+	"21":"Federal Republic of Germany",
+	"22":"Iceland",
+	"23":"Israel",
+	"24":"Malaysia",
+	"25":"USSR",
+	"26":"Finland",
+	"27":"Rep. of Korea",
+	"28":"New Caledonia",
+	"29":"Portugal",
+	"30":"Spain",
+	"31":"Thailand",
+	"32":"Yugoslavia",
+	"33":"Poland",
+	"34":"Brazil",
+	"35":"Singapore",
+	"36":"Kenya",
+	"37":"Tanzania",
+	"38":"Uganda",
+	"39":"Mexico",
+	"40":"German Democractic Republic",
+	"AF":"Afghanistan",
+	"AL":"Albania",
+	"DZ":"Algeria",
+	"AD":"Andorra",
+	"AO":"Angola",
+	"AG":"Antigua and Barbuda",
+	"AR":"Argentina",
+	"AM":"Armenia",
+	"AW":"Aruba",
+	"AU":"Australia",
+	"AT":"Austria",
+	"AZ":"Azerbaijan",
+	"BS":"Bahamas",
+	"BH":"Bahrain",
+	"BD":"Bangladesh",
+	"BB":"Barbados",
+	"BY":"Belarus",
+	"BE":"Belgium",
+	"BZ":"Belize",
+	"BJ":"Benin",
+	"BT":"Bhutan",
+	"BO":"Bolivia",
+	"BA":"Bosnia and Herzegovina",
+	"BW":"Botswana",
+	"BR":"Brazil",
+	"BN":"Brunei Darussalam",
+	"BG":"Bulgaria",
+	"BF":"Burkina Faso",
+	"BI":"Burundi",
+	"KH":"Cambodia",
+	"CM":"Cameroon",
+	"CA":"Canada",
+	"CV":"Cape Verde",
+	"CF":"Central African Republic",
+	"TD":"Chad",
+	"CL":"Chile",
+	"CN":"China",
+	"CO":"Columbia",
+	"KM":"Comoros",
+	"CG":"Congo",
+	"CD":"The Democratic Republic of the Congo",
+	"CR":"Costa Rica",
+	"CI":"Cote d'Ivoire",
+	"HR":"Croatia",
+	"CU":"Cuba",
+	"CY":"Cyprus",
+	"CZ":"Czech Republic",
+	"DK":"Denmark",
+	"DJ":"Djibouti",
+	"DM":"Dominica",
+	"DO":"Dominican Republic",
+	"EC":"Ecuador",
+	"EG":"Egypt",
+	"SV":"El Salvador",
+	"GQ":"Equatorial Guinea",
+	"ER":"Eritrea",
+	"EE":"Estonia",
+	"ET":"Ethiopia",
+	"FJ":"Fiji",
+	"FI":"Finland",
+	"FR":"France",
+	"GA":"Gabon",
+	"GM":"Gambia",
+	"GE":"Georgia",
+	"DE":"Germany",
+	"GH":"Ghana",
+	"GR":"Greece",
+	"GD":"Grenada",
+	"GT":"Guatemala",
+	"GN":"Guinea",
+	"GW":"Guinea Bissau",
+	"GY":"Guyana",
+	"HT":"Haiti",
+	"HN":"Honduras",
+	"HK":"Hong Kong",
+	"HU":"Hungary",
+	"IS":"Iceland",
+	"IN":"India",
+	"ID":"Indonesia",
+	"IR":"Islamic Republic of Iran",
+	"IQ":"Iraq",
+	"IE":"Ireland",
+	"IL":"Israel",
+	"IT":"Italy",
+	"JM":"Jamaica",
+	"JP":"Japan",
+	"JO":"Jordan",
+	"KZ":"Kazakhstan",
+	"KE":"Kenya",
+	"KI":"Kiribati",
+	"KR":"Republic of Korea",
+	"KW":"Kuwait",
+	"KG":"Kyrgyzstan",
+	"LA":"Lao Peoples Democratic Republic",
+	"LV":"Latvia",
+	"LB":"Lebanon",
+	"LS":"Lesotho",
+	"LR":"Liberia",
+	"LY":"Libyan Arab Jamahiriya",
+	"LT":"Lithuania",
+	"LU":"Luxembourg",
+	"MK":"The Former Yugoslav Republic of Macedonia",
+	"MG":"Madagascar",
+	"MW":"Malawi",
+	"MY":"Malaysia",
+	"MV":"Maldives",
+	"ML":"Mali",
+	"MT":"Malta",
+	"MH":"Marshal Islands",
+	"MR":"Mauritania",
+	"MU":"Mauritius",
+	"MX":"Mexico",
+	"FM":"Federated States of Micronesia",
+	"MD":"Republic of Moldova",
+	"MC":"Monaco",
+	"MN":"Mongolia",
+	"MA":"Morocco",
+	"MZ":"Mozambique",
+	"MM":"Myanmar",
+	"NA":"Namibia",
+	"NR":"Nauru",
+	"NP":"Nepal",
+	"NL":"Netherlands",
+	"AN":"Netherlands Antilles",
+	"NZ":"New Zealand",
+	"NI":"Nicaragua",
+	"NE":"Niger",
+	"NG":"Nigeria",
+	"KP":"Democratic People's Republic of Korea",
+	"NO":"Norway",
+	"OM":"Oman",
+	"PK":"Pakistan",
+	"PW":"Palau",
+	"PS":"Occupied Palestinian Territory",
+	"PA":"Panama",
+	"PG":"Papua New Guinea",
+	"PY":"Paraguay",
+	"PE":"Peru",
+	"PH":"Philippines",
+	"PL":"Poland",
+	"PT":"Portugal",
+	"QA":"Qatar",
+	"RO":"Romania",
+	"RU":"Russian Federation",
+	"RW":"Rwanda",
+	"KN":"Saint Kitts and Nevis",
+	"LC":"Saint Lucia",
+	"VC":"Saint Vincent and the Grenadines",
+	"WS":"Samoa",
+	"SM":"San Marino",
+	"ST":"Sao Tome And Principe",
+	"SA":"Saudi Arabia",
+	"SN":"Senegal",
+	"CS":"Serbia and Montenegro",
+	"SC":"Seychelles",
+	"SL":"Sierra Leone",
+	"SG":"Singapore",
+	"SK":"Slovakia",
+	"SI":"Slovenia",
+	"SB":"Solomon Islands",
+	"SO":"Somalia",
+	"ZA":"South Africa",
+	"ES":"Spain",
+	"LK":"Sri Lanka",
+	"SD":"Sudan",
+	"SR":"Surinam",
+	"SZ":"Swaziland",
+	"SE":"Sweden",
+	"CH":"Switzerland",
+	"SY":"Syrian Arab Republic",
+	"TJ":"Tajikistan",
+	"TZ":"United Republic of Tanzania",
+	"TH":"Thailand",
+	"TL":"Timor - Leste",
+	"TG":"Togo",
+	"TO":"Tonga",
+	"TT":"Trinidad and Tobago",
+	"TN":"Tunisia",
+	"TR":"Turkey",
+	"TM":"Turkmenistan",
+	"TV":"Tuvala",
+	"UG":"Uganda",
+	"UA":"Ukraine",
+	"AE":"United Arab Emirates",
+	"GB":"United Kingdom",
+	"US":"United States",
+	"UY":"Uruguay",
+	"UZ":"Uzbekistan",
+	"VU":"Vanuatu",
+	"VA":"Vatican City",
+	"VE":"Venezuela",
+	"VN":"Viet Nam",
+	"YE":"Yemen",
+	"ZM":"Zambia",
+	"ZW":"Zimbabwe",
+	"DD":"East Germany",
+	"CS":"Serbia and Montenegro",
+	"RU":"Soviet Union",
+	"NC":"New Caledonia",
+	"ZY":"None (self recruited)",
+	"ZZ":"None (third party support)",
+	"TW":"Taiwan (Province of China)",
+	"SU":"Soviet Union",
+	"YU":"Yugoslavia",
+	"XX":"Multiple recruitment",
+	"EU":"European Union"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C0.CH.json b/schemas/lib/imma.old/code_tables/ICOADS.C0.CH.json
new file mode 100644
index 0000000000000000000000000000000000000000..173f07f7d5052512baaa2d3c530d19afc14d61cf
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C0.CH.json
@@ -0,0 +1,13 @@
+{
+	"0":"No Cirrus, Cirrocumulus or Cirrostratus",
+	"1":"Cirrus in the form of filaments, strands or hooks, not progressively invading the sky",
+	"2":"Dense Cirrus, 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 with sproutings in the form of small turrets or battlements, or Cirrus having the appearance of cumuliform tufts",
+	"3":"Dense Cirrus, often in the form of an anvil, being the remains of the upper parts of Cumulonimbus",
+	"4":"Cirrus in the form of hooks or of filaments, or both, progressively invading the sky; they generally become denser as a whole",
+	"5":"Cirrus (often in bands converging towards one point or two opposite points of the horizon) and Cirrostratus, or Cirrostratus alone; in either case, they are progressively invading the sky, and generally growing denser as a whole, but the continuous veil does not reach 45 degrees above the horizon.",
+	"6":"Cirrus (often in bands converging towards one point or two opposite points of the horizon) and Cirrostratus, or Cirrostratus alone; in either case, they are progressively invading the sky, and generally growing denser as a whole; the continuous veil extends more than 45 degrees above the horizon, without the sky being totally covered",
+	"7":"Veil of Cirrostratus covering the celestial dome",
+	"8":"Cirrostratus not progressively invading the sky and not completely covering the celestial dome",
+	"9":"Cirrocumulus alone, or Cirrocumulus accompanied by Cirrus or Cirrostratus, or both, but Cirrocumulus is predominant",
+	"10":"Cirrus, Cirrocumulus and Cirrostratus invisible owing to darkness, fog, blowing dust or sand, or other similar phenomena, or more often because of the presence of a continuous layer of lower clouds"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C0.CL.json b/schemas/lib/imma.old/code_tables/ICOADS.C0.CL.json
new file mode 100644
index 0000000000000000000000000000000000000000..173f07f7d5052512baaa2d3c530d19afc14d61cf
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C0.CL.json
@@ -0,0 +1,13 @@
+{
+	"0":"No Cirrus, Cirrocumulus or Cirrostratus",
+	"1":"Cirrus in the form of filaments, strands or hooks, not progressively invading the sky",
+	"2":"Dense Cirrus, 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 with sproutings in the form of small turrets or battlements, or Cirrus having the appearance of cumuliform tufts",
+	"3":"Dense Cirrus, often in the form of an anvil, being the remains of the upper parts of Cumulonimbus",
+	"4":"Cirrus in the form of hooks or of filaments, or both, progressively invading the sky; they generally become denser as a whole",
+	"5":"Cirrus (often in bands converging towards one point or two opposite points of the horizon) and Cirrostratus, or Cirrostratus alone; in either case, they are progressively invading the sky, and generally growing denser as a whole, but the continuous veil does not reach 45 degrees above the horizon.",
+	"6":"Cirrus (often in bands converging towards one point or two opposite points of the horizon) and Cirrostratus, or Cirrostratus alone; in either case, they are progressively invading the sky, and generally growing denser as a whole; the continuous veil extends more than 45 degrees above the horizon, without the sky being totally covered",
+	"7":"Veil of Cirrostratus covering the celestial dome",
+	"8":"Cirrostratus not progressively invading the sky and not completely covering the celestial dome",
+	"9":"Cirrocumulus alone, or Cirrocumulus accompanied by Cirrus or Cirrostratus, or both, but Cirrocumulus is predominant",
+	"10":"Cirrus, Cirrocumulus and Cirrostratus invisible owing to darkness, fog, blowing dust or sand, or other similar phenomena, or more often because of the presence of a continuous layer of lower clouds"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C0.CM.json b/schemas/lib/imma.old/code_tables/ICOADS.C0.CM.json
new file mode 100644
index 0000000000000000000000000000000000000000..5be2e93025b6ae4eb090e6b071c0e56ef8816727
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C0.CM.json
@@ -0,0 +1,13 @@
+{
+	"0":"No Altocumulus, Altostratus or Nimbostratus",
+	"1":"Altostratus, the greater part of which is semitransparent; through this part the sun or moon may be weakly visible, as through ground glass",
+	"2":"Altostratus, the greater part of which is sufficiently dense to hide the sun or moon, or Nimbostratus",
+	"3":"Altocumulus, the greater part of which is semitransparent; the various elements of the cloud change only slowly and are all at a single level",
+	"4":"Patches (often in the form of almonds or fish) of Altocumulus, the greater part of which is semi-transparent; the clouds occur at one or more levels and the elements are continually changing in appearance",
+	"5":"Altocumulus clouds generally thicken as a whole; Semi-transparent Altocumulus in bands, or Altocumulus, in one or more fairly continuous layer (semi-transparent or opaque), progresively invading the sky; these Altocumulus clouds generally thicken as a whole",
+	"6":"Altocumulus resulting from the spreading out of Cumulus (or Cumulonimbus)",
+	"7":"Altocumulus in two or more layers, usually opaque in places, and not progressively invading the sky; or opaque layer of Altocumulus, not progressively invading the sky; or Altocumulus together with Altostratus or Nimbostratus",
+	"8":"Altocumulus with sproutings in the form of small towers or battlements, or Altocumulus having the appearance of cumuliform tufts",
+	"9":"Altocumulus of a chaotic sky, generally at several levels",
+	"10":"Altocumulus, Altostratus and Nimbostratus invisible owing to darkness, fog, blowing dust or sand, or other similar phenomena, or more often because of the presence of a continuous layer of lower clouds"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C0.DI.json b/schemas/lib/imma.old/code_tables/ICOADS.C0.DI.json
new file mode 100644
index 0000000000000000000000000000000000000000..602e98c7bbea6e080a8edbca7aa406a169c4e5a7
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C0.DI.json
@@ -0,0 +1,9 @@
+{
+	"0":"36-point compass",
+	"1":"32-point compass",
+	"2":"16 of 36-point compass",
+	"3":"16 of 32-point compass",
+	"4":"8-point compass",
+	"5":"360-point compass",
+	"6":"high resolution data (e.g., tenths of degrees)"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C0.DPTI.json b/schemas/lib/imma.old/code_tables/ICOADS.C0.DPTI.json
new file mode 100644
index 0000000000000000000000000000000000000000..d4c202debdd620363998660ebc5e8bb2968d4e5b
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C0.DPTI.json
@@ -0,0 +1,6 @@
+{
+	"0":"measured",
+	"1":"computed",
+	"2":"iced measured",
+	"3":"iced computed"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C0.DS.json b/schemas/lib/imma.old/code_tables/ICOADS.C0.DS.json
new file mode 100644
index 0000000000000000000000000000000000000000..641395cbd24c10246eb7eb772be7138e54b69722
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C0.DS.json
@@ -0,0 +1,12 @@
+{
+	"0":"0",
+	"1":"45",
+	"2":"90",
+	"3":"135",
+	"4":"180",
+	"5":"225",
+	"6":"270",
+	"7":"315",
+	"8":"360",
+	"9":"NULL"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C0.H.json b/schemas/lib/imma.old/code_tables/ICOADS.C0.H.json
new file mode 100644
index 0000000000000000000000000000000000000000..3da316fa76f727118b7f160e08a718050c2917de
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C0.H.json
@@ -0,0 +1,13 @@
+{
+	"0":"0",
+	"1":"50",
+	"2":"100",
+	"3":"200",
+	"4":"300",
+	"5":"600",
+	"6":"1000",
+	"7":"1500",
+	"8":"2000",
+	"9":"2500",
+	"10":"NULL"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C0.HI.json b/schemas/lib/imma.old/code_tables/ICOADS.C0.HI.json
new file mode 100644
index 0000000000000000000000000000000000000000..a753ac92127518f395ac7be1d9fe124bcef4839a
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C0.HI.json
@@ -0,0 +1,4 @@
+{
+	"0":"estimated",
+	"1":"measured"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C0.II.json b/schemas/lib/imma.old/code_tables/ICOADS.C0.II.json
new file mode 100644
index 0000000000000000000000000000000000000000..aaa4b3017cc7187c3ac25de2416dd37cdeebbde6
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C0.II.json
@@ -0,0 +1,14 @@
+{
+	"0":"ID present, but unknown type",
+	"1":"ship, Ocean Station Vessel (OSV), or ice station callsign",
+	"2":"generic ID (e.g., SHIP, BUOY, RIGG, PLAT)",
+	"3":"WMO 5-digit buoy number",
+	"4":"other buoy number (e.g., Argos or national buoy number)",
+	"5":"Coastal-Marine Automated Network (C-MAN) ID (assigned by US NDBC or other organizations)",
+	"6":"station name or number",
+	"7":"oceanographic platform/cruise number",
+	"8":"fishing vessel psuedo-ID",
+	"9":"national ship number",
+	"10":"composite information from early ship data",
+	"11":"7-digit buoy ID (proposed)"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C0.IM.json b/schemas/lib/imma.old/code_tables/ICOADS.C0.IM.json
new file mode 100644
index 0000000000000000000000000000000000000000..cb8234807238b031bb0d82c6d43dbd56fda7b8dd
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C0.IM.json
@@ -0,0 +1,4 @@
+{
+	"0":"version 0 (2010, http://icoads.noaa.gov/e-doc/imma/R2.5-imma.pdf)",
+	"1":"version 1 (2016)"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C0.IT.json b/schemas/lib/imma.old/code_tables/ICOADS.C0.IT.json
new file mode 100644
index 0000000000000000000000000000000000000000..8f315bea43b67d73fc2a473fbe8783e8de56fe2b
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C0.IT.json
@@ -0,0 +1,12 @@
+{
+	"0":"tenths degC",
+	"1":"half degC",
+	"2":"whole degC",
+	"3":"whole or tenths degC (mixed precision among temperature fields)",
+	"4":"tenths degF",
+	"5":"half degF",
+	"6":"whole degF",
+	"7":"whole or tenths degF (mixed precision among temperature fields)",
+	"8":"high resolution data (e.g., hundredths degC)",
+	"9":"other"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C0.LI.json b/schemas/lib/imma.old/code_tables/ICOADS.C0.LI.json
new file mode 100644
index 0000000000000000000000000000000000000000..7d57a7b2070a44f215cfedd0630b0535b6b5b638
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C0.LI.json
@@ -0,0 +1,9 @@
+{
+	"0":"degrees and tenths",
+	"1":"whole degrees",
+	"2":"mixed precision",
+	"3":"interpolated",
+	"4":"degrees and minutes",
+	"5":"high resolution data (e.g., degrees to seconds)",
+	"6":"other"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C0.NID.json b/schemas/lib/imma.old/code_tables/ICOADS.C0.NID.json
new file mode 100644
index 0000000000000000000000000000000000000000..4644e2166f1caee78efcc3460485ddba9ae1a3e7
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C0.NID.json
@@ -0,0 +1,102 @@
+{
+    "0": "",
+    "1": "",
+    "2": "",
+    "3": "",
+    "4": "",
+    "5": "",
+    "6": "",
+    "7": "",
+    "8": "",
+    "9": "",
+    "10": "",
+    "11": "",
+    "12": "",
+    "13": "",
+    "14": "",
+    "15": "",
+    "16": "",
+    "17": "",
+    "18": "",
+    "19": "",
+    "20": "",
+    "21": "",
+    "22": "",
+    "23": "",
+    "24": "",
+    "25": "",
+    "26": "",
+    "27": "",
+    "28": "",
+    "29": "",
+    "30": "",
+    "31": "",
+    "32": "",
+    "33": "",
+    "34": "",
+    "35": "",
+    "36": "",
+    "37": "",
+    "38": "",
+    "39": "",
+    "40": "",
+    "41": "",
+    "42": "",
+    "43": "",
+    "44": "",
+    "45": "",
+    "46": "",
+    "47": "",
+    "48": "",
+    "49": "",
+    "50": "",
+    "51": "",
+    "52": "",
+    "53": "",
+    "54": "",
+    "55": "",
+    "56": "",
+    "57": "",
+    "58": "",
+    "59": "",
+    "60": "",
+    "61": "",
+    "62": "",
+    "63": "",
+    "64": "",
+    "65": "",
+    "66": "",
+    "67": "",
+    "68": "",
+    "69": "",
+    "70": "",
+    "71": "",
+    "72": "",
+    "73": "",
+    "74": "",
+    "75": "",
+    "76": "",
+    "77": "",
+    "78": "",
+    "79": "",
+    "80": "",
+    "81": "",
+    "82": "",
+    "83": "",
+    "84": "",
+    "85": "",
+    "86": "",
+    "87": "",
+    "88": "",
+    "89": "",
+    "90": "",
+    "91": "",
+    "92": "",
+    "93": "",
+    "94": "",
+    "95": "",
+    "96": "",
+    "97": "",
+    "98": "",
+    "99": ""
+}
\ No newline at end of file
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C0.SD.json b/schemas/lib/imma.old/code_tables/ICOADS.C0.SD.json
new file mode 100644
index 0000000000000000000000000000000000000000..1ba7eee29511907f89e80f69550fda8820456248
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C0.SD.json
@@ -0,0 +1,41 @@
+{
+  "0":"waves from 0 degrees",
+  "1":"waves from 10",
+  "2":"waves from 20 degrees",
+  "3":"waves from 30 degrees",
+  "4":"waves from 40 degrees",
+  "5":"waves from 50 degrees",
+  "6":"waves from 60 degrees",
+  "7":"waves from 70 degrees",
+  "8":"waves from 80 degrees",
+  "9":"waves from 90 degrees",
+  "10":"waves from 100 degrees",
+  "11":"waves from 110 degrees",
+  "12":"waves from 120 degrees",
+  "13":"waves from 130 degrees",
+  "14":"waves from 140 degrees",
+  "15":"waves from 150 degrees",
+  "16":"waves from 160 degrees",
+  "17":"waves from 170 degrees",
+  "18":"waves from 180 degrees",
+  "19":"waves from 190 degrees",
+  "20":"waves from 200 degrees",
+  "21":"waves from 210 degrees",
+  "22":"waves from 220 degrees",
+  "23":"waves from 230 degrees",
+  "24":"waves from 240 degrees",
+  "25":"waves from 250 degrees",
+  "26":"waves from 260 degrees",
+  "27":"waves from 270 degrees",
+  "28":"waves from 280 degrees",
+  "29":"waves from 290 degrees",
+  "30":"waves from 300 degrees",
+  "31":"waves from 310 degrees",
+  "32":"waves from 320 degrees",
+  "33":"waves from 330 degrees",
+  "34":"waves from 340 degrees",
+  "35":"waves from 350 degrees",
+  "36":"waves from 360 degrees",
+  "37":"waves confused, direction indeterminate (WH ≤ 4.75 m)",
+  "38":"waves confused, direction indeterminate (WH > 4.75 m; or irrespective of wave height, corresponding to 99 in WMO Code 0877"
+  }
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C0.SI.json b/schemas/lib/imma.old/code_tables/ICOADS.C0.SI.json
new file mode 100644
index 0000000000000000000000000000000000000000..ffb99e7c7db78c842c192d09843dc6c420dcd1f2
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C0.SI.json
@@ -0,0 +1,14 @@
+{
+	"0":"BU",
+	"1":"C",
+	"2":"TT",
+	"3":"HC",
+	"4":"HT",
+	"5":"RAD",
+	"6":"BTT",
+	"7":"OT",
+	"9":"NULL",
+	"10":"NULL",
+	"11":"NULL",
+	"12":"NULL"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C0.TI.json b/schemas/lib/imma.old/code_tables/ICOADS.C0.TI.json
new file mode 100644
index 0000000000000000000000000000000000000000..58bece48f1c791da34e471062fa50a3deafc9767
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C0.TI.json
@@ -0,0 +1,7 @@
+{
+	"0":"nearest whole hour",
+	"1":"hour to tenths",
+	"2":"hour plus minutes",
+	"3":"high resolution (e.g., hour to hundredths)",
+	"4":"Daily (assumed local solar midday)"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C0.VI.json b/schemas/lib/imma.old/code_tables/ICOADS.C0.VI.json
new file mode 100644
index 0000000000000000000000000000000000000000..58bece48f1c791da34e471062fa50a3deafc9767
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C0.VI.json
@@ -0,0 +1,7 @@
+{
+	"0":"nearest whole hour",
+	"1":"hour to tenths",
+	"2":"hour plus minutes",
+	"3":"high resolution (e.g., hour to hundredths)",
+	"4":"Daily (assumed local solar midday)"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C0.VS.json b/schemas/lib/imma.old/code_tables/ICOADS.C0.VS.json
new file mode 100644
index 0000000000000000000000000000000000000000..ff88b16f715b9948b41ea835b918761df1e59c15
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C0.VS.json
@@ -0,0 +1,28 @@
+{
+  "range_key(1750,1967)":
+  {
+    "0":"0 knots;[0.0,0.0,0.0] ms-1",
+    "1":"1-3 knots;[0.51444,1.02888,1.54332] ms-1",
+    "2":"4-6 knots;[2.05776,2.5722,3.08664] ms-1",
+    "3":"7-9 knots;[3.60108,4.11552,4.62996] ms-1",
+    "4":"10-12 knots;[5.1444,5.65884,6.17328] ms-1",
+    "5":"13-15 knots;[6.68772,7.20216,7.7166] ms-1",
+    "6":"16-18 knots;[8.23104,8.74548,9.25992] ms-1",
+    "7":"19-21 knots;[9.77436,10.2888,10.8032] ms-1",
+    "8":"22-24 knots;[11.3177,11.8321,12.3466] ms-1",
+    "9":"over 24 knots;[12.3466,12.861,null] ms-1"
+  },
+  "range_key(1968,yyyy)":
+  {
+    "0":"0 knots;[0.0,0.0,0.0] ms-1",
+    "1":"1-5 knots;[0.51444,1.54332,2.5722] ms-1",
+    "2":"6-10 knots;[3.08664,4.11552,5.1444] ms-1",
+    "3":"11-15 knots;[5.65884,6.68772,7.7166] ms-1",
+    "4":"16-20 knots;[8.23104,9.25992,10.2888] ms-1",
+    "5":"21-25 knots;[10.8032,11.8321,12.861] ms-1",
+    "6":"26-30 knots;[13.3754,14.4043,15.4332] ms-1",
+    "7":"31-35 knots;[15.9476,16.9765,18.0054] ms-1",
+    "8":"36-40 knots;[18.5198,19.5487,20.5776] ms-1",
+    "9":"over 40 knots;[21.092,22.1209,null] ms-1"
+  }
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C0.VS.keys b/schemas/lib/imma.old/code_tables/ICOADS.C0.VS.keys
new file mode 100644
index 0000000000000000000000000000000000000000..a64ecc5bac176caef5fe11a56e5784682e24c01f
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C0.VS.keys
@@ -0,0 +1,3 @@
+{
+  "('core','VS')" : ["('core','YR')","('core','VS')"]
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C0.VV.json b/schemas/lib/imma.old/code_tables/ICOADS.C0.VV.json
new file mode 100644
index 0000000000000000000000000000000000000000..09d127f6acefb02390ad55876131acbdd54877e8
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C0.VV.json
@@ -0,0 +1,12 @@
+{
+	"90":"50",
+	"91":"50",
+	"92":"200",
+	"93":"500",
+	"94":"1000",
+	"95":"2000",
+	"96":"4000",
+	"97":"10000",
+	"98":"20000",
+	"99":"50000"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C0.W1.json b/schemas/lib/imma.old/code_tables/ICOADS.C0.W1.json
new file mode 100644
index 0000000000000000000000000000000000000000..270266ebf8a482a6d05d458f847d7360272ca18d
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C0.W1.json
@@ -0,0 +1,12 @@
+{
+	"0":"cloud covering one half or less of the sky throughout the period",
+	"1":"cloud covering more than one half of the sky during part of the period and covering one half or less during part of the period",
+	"2":"cloud covering more than one half of the sky throughout the period",
+	"3":"sandstorm, dust storm or blowing snow",
+	"4":"fog, ice fog, or thick haze (US includes thick smoke)",
+	"5":"drizzle",
+	"6":"rain",
+	"7":"snow, or rain and snow mixed",
+	"8":"shower",
+	"9":"thunderstorm with or without precipitation"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C0.WBTI.json b/schemas/lib/imma.old/code_tables/ICOADS.C0.WBTI.json
new file mode 100644
index 0000000000000000000000000000000000000000..d4c202debdd620363998660ebc5e8bb2968d4e5b
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C0.WBTI.json
@@ -0,0 +1,6 @@
+{
+	"0":"measured",
+	"1":"computed",
+	"2":"iced measured",
+	"3":"iced computed"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C0.WD.json b/schemas/lib/imma.old/code_tables/ICOADS.C0.WD.json
new file mode 100644
index 0000000000000000000000000000000000000000..3b4f1db6e4123ad5875940e5c68abeab65d47538
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C0.WD.json
@@ -0,0 +1,41 @@
+{
+    "0":"waves from 0 degrees",
+    "1":"waves from 10",
+    "2":"waves from 20 degrees",
+    "3":"waves from 30 degrees",
+    "4":"waves from 40 degrees",
+    "5":"waves from 50 degrees",
+    "6":"waves from 60 degrees",
+    "7":"waves from 70 degrees",
+    "8":"waves from 80 degrees",
+    "9":"waves from 90 degrees",
+    "10":"waves from 100 degrees",
+    "11":"waves from 110 degrees",
+    "12":"waves from 120 degrees",
+    "13":"waves from 130 degrees",
+    "14":"waves from 140 degrees",
+    "15":"waves from 150 degrees",
+    "16":"waves from 160 degrees",
+    "17":"waves from 170 degrees",
+    "18":"waves from 180 degrees",
+    "19":"waves from 190 degrees",
+    "20":"waves from 200 degrees",
+    "21":"waves from 210 degrees",
+    "22":"waves from 220 degrees",
+    "23":"waves from 230 degrees",
+    "24":"waves from 240 degrees",
+    "25":"waves from 250 degrees",
+    "26":"waves from 260 degrees",
+    "27":"waves from 270 degrees",
+    "28":"waves from 280 degrees",
+    "29":"waves from 290 degrees",
+    "30":"waves from 300 degrees",
+    "31":"waves from 310 degrees",
+    "32":"waves from 320 degrees",
+    "33":"waves from 330 degrees",
+    "34":"waves from 340 degrees",
+    "35":"waves from 350 degrees",
+    "36":"waves from 360 degrees",
+    "37":"waves confused, direction indeterminate (WH ≤ 4.75 m)",
+    "38":"waves confused, direction indeterminate (WH > 4.75 m; or irrespective of wave height, corresponding to 99 in WMO Code 0877"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C0.WI.json b/schemas/lib/imma.old/code_tables/ICOADS.C0.WI.json
new file mode 100644
index 0000000000000000000000000000000000000000..af5258b9d33574f3a27fab3b4479ebb8e55e9134
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C0.WI.json
@@ -0,0 +1,11 @@
+{
+	"0":"meter per second, estimated",
+	"1":"meter per second, obtained from anemometer (measured)",
+	"2":"estimated (original units unknown)",
+	"3":"knot, estimated",
+	"4":"knot, obtained from anemometer (measured)",
+	"5":"Beaufort force (based on documentation)",
+	"6":"estimated (original units unknown) or unknown method ",
+	"7":"measured (original units unknown)",
+	"8":"high-resolution measurement (e.g., hundredths of a meter per second)"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C0.WW.json b/schemas/lib/imma.old/code_tables/ICOADS.C0.WW.json
new file mode 100644
index 0000000000000000000000000000000000000000..6786a95e1c213f8f81547caab5fd8f4f4425c489
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C0.WW.json
@@ -0,0 +1,102 @@
+{
+	"0":"Cloud development not observed or not observable - Characteristic change of the state of sky during the past hour",
+	"1":"Clouds generally dissolving or becoming less developed - Characteristic change of the state of sky during the past hour",
+	"2":"State of sky on the whole unchanged - Characteristic change of the state of sky during the past hour",
+	"3":"Clouds generally forming or developing - Characteristic change of the state of sky during the past hour",
+	"4":"Visibility reduced by smoke, e.g. veldt or forest fires, industrial smoke or volcanic ashes",
+	"5":"Haze",
+	"6":"Widespread dust in suspension in the air, not raised by wind at or near the station at the time of observation",
+	"7":"Dust or sand raised by wind at or near the station at the time of observation, but no welldeveloped 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":"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":"Duststorm or sandstorm within sight at the time of observation, or at the station during the preceding hour",
+	"10":"Mist",
+	"11":"Patches - shallow fog or ice fog at the station, whether on land or sea, not deeper than about 2 metres on land or 10 metres at sea",
+	"12":"More or less continuous - shallow fog or ice fog at the station, whether on land or sea, not deeper than about 2 metres on land or 10 metres at sea",
+	"13":"Lightning visible, no thunder heard",
+	"14":"Precipitation within sight, not reaching the ground or the surface of the sea",
+	"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":"Precipitation within sight, reaching the ground or the surface of the sea, near to, but not at the station",
+	"17":"Thunderstorm, but no precipitation at the time of observation",
+	"18":"Squalls - at or within sight of the station during the preceding hour but not at the time of observation",
+	"19":"Funnel cloud(s)2 - at or within sight of the station during the preceding hour but not at the time of observation",
+	"20":"Drizzle (not freezing) or snow grains - not falling as showers",
+	"21":"Rain (not freezing) - not falling as showers",
+	"22":"Snow - not falling as showers",
+	"23":"Rain and snow or ice pellets - not falling as showers",
+	"24":"Freezing drizzle or freezing rain - not falling as showers",
+	"25":"Shower(s) of rain - not falling as showers",
+	"26":"Shower(s) of snow, or of rain and snow ",
+	"27":"Shower(s) of hail, or of rain and hail",
+	"28":"Fog or ice fog",
+	"29":"Thunderstorm (with or without precipitation",
+	"30":"Slight or moderate duststorm or sandstorm - has decreased during the preceding hour",
+	"31":"Slight or moderate duststorm or sandstorm - no appreciable change during the preceeding hour",
+	"32":"Slight or moderate duststorm or sandstorm - has begun or increased during the preceding hour",
+	"33":"Severe duststorm or sandstorm - has decreased during the preceding hour",
+	"34":"Severe duststorm or sandstorm - no appreciable change during the preceding hour",
+	"35":"Severe duststorm or sandstorm - has begun or has increased during the preceding hour",
+	"36":"Slight or moderate drifting snow - generally low (below eye level)",
+	"37":"Heavy drifting snow - generally low (below eye level)",
+	"38":"Slight or moderate drifting snow - generally high (above eye level)",
+	"39":"Heavy drifting snow - generally high (above eye level)",
+	"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":"Fog or ice fog in patches",
+	"42":"Fog or ice fog, sky visible - has become thinner during the preceding hour",
+	"43":"Fog or ice fog, sky invisible - has become thinner during the preceding hour",
+	"44":"Fog or ice fog, sky visible - no appreciable change during the preceding hour",
+	"45":"Fog or ice fog, sky invisible - no appreciable change during the preceding hour",
+	"46":"Fog or ice fog, sky visible - has begun or has become thicker during the preceding hour",
+	"47":"Fog or ice fog, sky invisible",
+	"48":"Fog, depositing rime, sky visible",
+	"49":"Fog, depositing rime, sky invisible",
+	"50":"Drizzle, not freezing, intermittent - slight at the time of observation",
+	"51":"Drizzle, not freezing, continuous - slight at the time of observation",
+	"52":"Drizzle, not freezing, intermittent - moderate at the time of observation",
+	"53":"Drizzle, not freezing, continuous - moderate at the time of observation",
+	"54":"Drizzle, not freezing, intermittent - heavy (dense) at the time of observation",
+	"55":"Drizzle, not freezing, continuous - heavy (dense) at the time of observation",
+	"56":"Drizzle, freezing, slight",
+	"57":"Drizzle, freezing, moderate or heavy (dense)",
+	"58":"Drizzle and rain, slight",
+	"59":"Drizzle and rain, moderate or heavy",
+	"60":"Rain, not freezing, intermittent - slight at time of observation",
+	"61":"Rain, not freezing, continuous - slight at time of observation",
+	"62":"Rain, not freezing, intermittent - moderate at time of observation",
+	"63":"Rain, not freezing, continuous - moderate at time of observation",
+	"64":"Rain, not freezing, intermittent - heavy at time of observation",
+	"65":"Rain, not freezing, continuous - heavy at time of observation",
+	"66":"Rain, freezing, slight",
+	"67":"Rain, freezing, moderate or heavy",
+	"68":"Rain or drizzle and snow, slight",
+	"69":"Rain or drizzle and snow, moderate or heavy",
+	"70":"Intermittent fall of snowflakes - slight at time of observation",
+	"71":"Continuous fall of snowflakes - slight at time of observation",
+	"72":"Intermittent fall of snowflakes - moderate at time of observation",
+	"73":"Continuous fall of snowflakes - moderate at time of observation",
+	"74":"Intermittent fall of snowflakes - heavy at time of observation",
+	"75":"Continuous fall of snowflakes - heavy at time of observation",
+	"76":"Diamond dust (with or without fog)",
+	"77":"Snow grains (with or without fog)",
+	"78":"Isolated star-like snow crystals (with or without fog)",
+	"79":"Ice pellets",
+	"80":"Rain shower(s), slight",
+	"81":"Rain shower(s), moderate or heavy",
+	"82":"Rain shower(s), violent",
+	"83":"Shower(s) of rain and snow mixed, slight",
+	"84":"Shower(s) of rain and snow mixed, moderate or heavy",
+	"85":"Snow shower(s), slight",
+	"86":"Snow shower(s), moderate or heavy",
+	"87":"Shower(s) of snow pellets or small hail, with or without rain or rain and snow mixed - slight",
+	"88":"Shower(s) of snow pellets or small hail, with or without rain or rain and snow mixed - moderate or heavy",
+	"89":"Shower(s) of hail, with or without rain or rain and snow mixed, not associated with thunder - slight",
+	"90":"Shower(s) of hail, with or without rain or rain and snow mixed, not associated with thunder - moderate",
+	"91":"Slight rain at time of observation - Thunderstorm during the preceding hour but not at time of observation",
+	"92":"Moderate or heavy rain at time of observation - Thunderstorm during the preceding hour but not at time of observation",
+	"93":"Slight snow, or rain and snow mixed or hail3 at time of observation - Thunderstorm during the preceding hour but not at time of observation",
+	"94":"Moderate or heavy snow, or rain and snow mixed or hail3 at time of observation of observation - Thunderstorm during the preceding hour but not at time of observation",
+	"95":"Thunderstorm, slight or moderate, without hail3, but with rain and/or snow at time of observation - Thunderstorm at time of observation",
+	"96":"Thunderstorm, slight or moderate, with hail3 at time of observation - Thunderstorm at time of observation",
+	"97":"Thunderstorm, heavy, without hail3, but with rain and/or snow at time of observation - Thunderstorm at time of observation",
+	"98":"Thunderstorm combined with duststorm or sandstorm at time of observation - Thunderstorm at time of observation",
+	"99":"Thunderstorm, heavy, with hail3 at time of observation - Thunderstorm at time of observation"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C1.DCK.json b/schemas/lib/imma.old/code_tables/ICOADS.C1.DCK.json
new file mode 100644
index 0000000000000000000000000000000000000000..542a60cebb76cf386e2618be6f4f8c86026319a6
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C1.DCK.json
@@ -0,0 +1,147 @@
+{
+	"110":"US Navy Marine",
+	"116":"US Merchant Marine",
+	"117":"US Navy Hourlies",
+	"118":"Japanese Ships No. 1 (Kobe Collection Data keyed in 1961)",
+	"119":"Japanese Ships No. 2 (Kobe Collection Data keyed in 1961)",
+	"128":"International Marine (US- or foreign-keyed ship data)",
+	"143":"Pacific Marine Environmental Laboratory (PMEL) Buoys",
+	"144":"TAO/TRITON and PIRATA Buoys (from PMEL and JAMSTEC)",
+	"145":"PMEL (Daily) Equatorial Moorings and Island Stations",
+	"146":"Global Tropical Moored Buoy Array (GTMBA) from PMEL via NOC",
+	"150":"Pacific (US Responsibility) HSST Netherlands Receipts",
+	"151":"Pacific (US Responsibility) HSST German Receipts",
+	"152":"Pacific (US Responsibility) HSST UK Receipts",
+	"155":"Indian (Netherlands Responsibility) HSST",
+	"156":"Atlantic (German Responsibility) HSST",
+	"184":"Great Britain Marine (194 extension)",
+	"185":"USSR Marine IGY",
+	"186":"USSR Ice Stations",
+	"187":"Japanese Whaling Fleet",
+	"188":"Norwegian Antarctic Whaling Factory Ships",
+	"189":"Netherlands Marine",
+	"192":"Deutsche Seewarte Marine",
+	"193":"Netherlands Marine",
+	"194":"Great Britain Marine",
+	"195":"US Navy Ships Logs",
+	"196":"Deutsche Seewarte Marine (192 extension)",
+	"197":"Danish (and Other) Marine (Polar)",
+	"201":"All Ships (1930 code)",
+	"202":"All Ships (1921 code)",
+	"203":"Selected Ships (1930 code)",
+	"204":"British Navy (HM) Ships (1930 code)",
+	"205":"Scottish Fishery Cruisers MARIDS (1930 code)",
+	"206":"Ocean Weather Stations (OWS) (1930 code)",
+	"207":"Selected Ships (1930 code)",
+	"208":"Light Vessels",
+	"209":"Selected Ships (including some foreign ships)",
+	"210":"OWS (including Dutch 'J')",
+	"211":"Scottish Fishery Cruisers MARIDS",
+	"212":"Light Vessels",
+	"213":"Selected Ships",
+	"214":"OWS",
+	"215":"German Marine",
+	"216":"UK Merchant Ship Logbooks (METFORMS; keyed in 1996)",
+	"218":"US OWS",
+	"221":"MARIDS and Trawlers",
+	"222":"Light Vessels",
+	"223":"Selected Ships",
+	"224":"OWS",
+	"225":"Norwegian Format",
+	"226":"OWS (1949 code)",
+	"227":"Selected Ships",
+	"229":"British Navy (HM) Ships",
+	"230":"International Maritime Met. Punched Card (IMMPC) Data",
+	"233":"Selected Ships",
+	"234":"OWS",
+	"235":"RIGG, PLAT, Automatic Weather-Observing System (AWS; buoy)",
+	"239":"British Navy (HM) Ships",
+	"241":"MetO GTS Receipts (primarily SHIP code; from MDB format)",
+	"242":"MetO GTS Receipts (SHIP code; raw messages from MetDb)",
+	"245":"Royal Navy Ship's Logs 1938-47 (keyed by 2007)",
+	"246":"Atmospheric Circ. Reconstrucitons over the Earth (ACRE) digitized Date: Print or Published Expeditions (held at Met Office)",
+	"247":"Atmospheric Circ. Reconstructions over the Earth (ACRE) digitized data: Challenger Expedition",
+	"248":"English East India Co. (EEIC) Ship Logs",
+	"249":"Extended WW1 UK Royal Navy Ship's Logs (OldWeather)",
+	"254":"Int. Maritime Met. (IMM) Data (foreign or unknown origin)",
+	"255":"Undocumented TDF-11 Decks or MDB Series",
+	"281":"US Navy Monthly Aerological Record (MAR)",
+	"500":"Gulf Offshore Weather Observing Network (GOWON) (plat data)",
+	"555":"US Navy Fleet Num. Met. and Oceano. Center (FNMOC; Monterey) Telecom.",
+	"666":"Tuna Boats",
+	"667":"Inter-American Tropical Tuna Commission (IATTC)",
+	"700":"UK Met. Office GTS BUFR Data",
+	"701":"US Maury Collection",
+	"702":"Norwegian Logbook Collection",
+	"703":"US Lightship Collections",
+	"704":"US Marine Meteorological Journals Collection (1878-94)",
+	"705":"US Merchant Marine Collection (1912-46) (500 series)",
+	"706":"US Merchant Marine Collection (1912-46) (600 series)",
+	"707":"US Merchant Marine Collection (1912-46) (700 series)",
+	"708":"US Navy Marine (US keyed ship data; hourly METAR format",
+	"709":"US Navy Marine (IMMA formatted by US Navy)",
+	"710":"US Arctic Logbooks (OldWeather",
+	"711":"Weather Detective Crowdsourcing",
+	"714":"Canadian Oceanography and Scientific Data (OSD; formerly ISDM/MEDS) Buoys",
+	"715":"German Deep Drifter Data (via ISDM; originally from IfM/Univ. Kiel)",
+	"720":"Deutscher Wetterdienst (DWD) Marine Meteorological Archive",
+	"721":"German Maury collection",
+	"730":"Climatological Database for the World's Oceans (CLIWOC)",
+	"731":"Russian S.O. Makarov Collection",
+	"732":"Russian Marine Met. Data Set (MORMET) (received at NCAR)",
+	"733":"Russian AARI North Pole (NP) Stations",
+	"734":"Arctic Drift Stations",
+	"735":"Russian Research Vessel (R/V) Digitization",
+	"736":"Byrd Antarctic Expedition (keyed by Hollings Scholars)",
+	"740":"Research Vessel (R/V) Data Quality-Evaluated by FSU/COAPS",
+	"749":"First GARP Global Experiment (FGGE) Level IIb",
+	"750":"Australian Navy Vessels: SST data (1972 - 77)",
+	"761":"Japanese Whaling Ship Data (CDMP/MIT digitization)",
+	"762":"Japanese Kobe Collection Data (keyed after decks 118-119)",
+	"780":"NOAA / NCEI World Ocean Database (WOD) (and formerly Atlas, WOA)",
+	"781":"Chinese/Global Ocean Data Archeology and Rescue (GODAR) Ships",
+	"782":"Global Ocean Suface Underway Data (GOSUD)",
+	"792":"US Natl. Cntrs. for Environ. Pred. (NCEP) BUFR GTS: Ship Data",
+	"793":"NCEP BUFR GTS: Buoy Data (transmitted in FM 13 'SHIP' code)",
+	"794":"NCEP BUFR GTS: Buoy Data (transmitted in FM 18 'BUOY' code)",
+	"795":"NCEP BUFR GTS: Coastal-Marine Automated Network (C-MAN code) Data",
+	"796":"NCEP BUFR GTS: Miscellaneous (OSV, plat, and rig) Data",
+	"797":"NCEP BUFR GTS: CREX code",
+	"849":"First GARP Global Experiment (FGGE)",
+	"850":"German FGGE",
+	"874":"Shipboard Environmental (Data) Acquisition System (SEAS)",
+	"875":"US TurboWin (e-Logbook) Voluntary Observing Ship (VOS) Receipts",
+	"876":"NDBC Data (High Capability Buoy; HCB)",
+	"877":"NDBC Data (Limited Capability Buoy; LCB)",
+	"878":"NDBC Data (Prototype Environmental Buoy; PEB)",
+	"879":"NDBC Data (5-meter Continental Shelf Buoys)",
+	"880":"NDBC Data (10-meter Continental Shelf Buoys)",
+	"881":"NDBC Data (Offshore Platforms)",
+	"882":"NDBC Data",
+	"883":"US National Data Buoy Center (NDBC) Data (latest version from NCDC)",
+	"888":"US Air Force Global Weather Central (GWC)",
+	"889":"Autodin (US Dept. of Defense Automated Digital Network)",
+	"890":"US National Meteorological Center (NMC, now NCEP) Data (obsolete)",
+	"891":"US National Oceanographic Data Center (NODC) Surface Data",
+	"892":"US Natl. Cntrs. for Environ. Pred. (NCEP) Ship Data",
+	"893":"NCEP Moored Buoy Data",
+	"894":"NCEP Drifting Buoy Data",
+	"895":"NCEP Coastal-Marine Automated Network (C-MAN) Data",
+	"896":"NCEP Miscellaneous (OSV, plat, and rig) Data",
+	"897":"Eltanin",
+	"898":"Japanese",
+	"899":"South African Whaling",
+	"900":"Australian",
+	"901":"FOSDIC Reconstructions (card images from 16mm film)",
+	"902":"Great Britain Marine (184 extension)",
+	"926":"International Maritime Meteorological (IMM) Data",
+	"927":"International Marine (US- or foreign-keyed ship data)",
+	"928":"Same as 927 including Ocean Station Vessels (OSV)",
+	"992":"NCEI GTS: Ship Data",
+	"993":"NCEI GTS: Buoy Data (transmitted in FM 13 'SHIP' code)",
+	"994":"NCEI GTS: Buoy Data (transmitted in FM 18 'BUOY' code)",
+	"995":"NCEI GTS: Coastal-Marine Automated Network (C-MAN code) Data",
+	"996":"NCEI GTS: Miscellaneous (OSV, plat, and rig) Data",
+	"997":"NCEI GTS: CREX code",
+	"999":"US Air Force Environ. Technical Applications Center (ETAC)"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C1.DUPC.json b/schemas/lib/imma.old/code_tables/ICOADS.C1.DUPC.json
new file mode 100644
index 0000000000000000000000000000000000000000..2f8197a60065281afadb08955748fec0e992db1a
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C1.DUPC.json
@@ -0,0 +1,5 @@
+{
+	"0":"GTS and logbook match with SLP and SST match",
+	"1":"GTS and logbook match without SLP and SST match",
+	"2":"no GTS and logbook match was encountered"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C1.DUPS.json b/schemas/lib/imma.old/code_tables/ICOADS.C1.DUPS.json
new file mode 100644
index 0000000000000000000000000000000000000000..b2547c916241645973d71504eb10c1cb99474e6a
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C1.DUPS.json
@@ -0,0 +1,17 @@
+{
+	"0":"Unique",
+	"1":"Best duplicate",
+	"2":"Best duplicate with substitution",
+	"3":"Worse duplicate, uncertain: uncertain weather element match with hour cross",
+	"4":"Worse duplicate, uncertain: uncertain weather element match with no cross",
+	"5":"Worse duplicate, uncertain: uncertain weather element match with day cross",
+	"6":"Worse duplicate, uncertain: uncertain time / space with ID mismatch (unused until 1950)",
+	"7":"Worse duplicate, uncertain: certain weather element match with hour cross",
+	"8":"Worse duplicate, certain: certain weather element match with no cross",
+	"9":"Worse duplicate, certain: combined DUPS 4 and 6",
+	"10":"Worse duplicate, certain: combined DUPS 6 and 8",
+	"11":"Worse duplicate, certain: time / space / ID match",
+	"12":"Worse duplicate, certain: combined DUPS 4 and 11",
+	"13":"Worse duplicate, certain: combined DUPS 8 and 11",
+	"14":"Automatic data rejection"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C1.LZ.json b/schemas/lib/imma.old/code_tables/ICOADS.C1.LZ.json
new file mode 100644
index 0000000000000000000000000000000000000000..876928a403efb4800790a420327313abc4229022
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C1.LZ.json
@@ -0,0 +1,3 @@
+{
+	"1":"landlocked"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C1.NCDC.json b/schemas/lib/imma.old/code_tables/ICOADS.C1.NCDC.json
new file mode 100644
index 0000000000000000000000000000000000000000..cab1e50739f3f1f41a8a52199d0711134b2de546
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C1.NCDC.json
@@ -0,0 +1,12 @@
+{
+	"1":"0",
+	"2":"1",
+	"3":"1",
+	"4":"2",
+	"5":"2",
+	"6":"2",
+	"7":"3",
+	"8":"3",
+	"9":"3",
+	"10":"3"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C1.ND.json b/schemas/lib/imma.old/code_tables/ICOADS.C1.ND.json
new file mode 100644
index 0000000000000000000000000000000000000000..7a9ad993bb4e1bbeea7eac401f96e99eb4e5a1f7
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C1.ND.json
@@ -0,0 +1,4 @@
+{
+	"1":"Report time is local nighttime",
+	"2":"Report time is local daytime"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C1.PB.json b/schemas/lib/imma.old/code_tables/ICOADS.C1.PB.json
new file mode 100644
index 0000000000000000000000000000000000000000..6f9b80de6aac199bf688b55ad15d71afa0cfbe69
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C1.PB.json
@@ -0,0 +1,5 @@
+{
+	"0":"questionable SLP: level 0: individual platform (unused)",
+	"1":"questionable SLP: level 1: deck",
+	"2":"questionable SLP: level 2: deck"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C1.PT.json b/schemas/lib/imma.old/code_tables/ICOADS.C1.PT.json
new file mode 100644
index 0000000000000000000000000000000000000000..25537ea4927809fedea4a258bdfb358a71de001f
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C1.PT.json
@@ -0,0 +1,26 @@
+{
+	"0":"US Navy or deck log, or unknown",
+	"1":"merchant ship or foreign military",
+	"2":"ocean station vessel - off station or station proximity unknown",
+	"3":"ocean station vessel - on station",
+	"4":"lightship",
+	"5":"ship",
+	"6":"moored buoy",
+	"7":"drifting buoy",
+	"8":"ice buoy [note: currently unused]",
+	"9":"ice station (manned, including ships overwintering in ice)",
+	"10":"oceanographic station data (bottle and low-resolution CTD/XCTD data)",
+	"11":"mechanical/digital/micro bathythermograph (MBT)",
+	"12":"expendable bathythermograph (XBT)",
+	"13":"Coastal-Marine Automated Network (C-MAN) (NDBC operated)",
+	"14":"other coastal/island station",
+	"15":"fixed (or mobile) ocean platform (plat, rig)",
+	"16":"tide gauge",
+	"17":"high-resolution Conductivity-Temp.-Depth (CTD)/Expendable CTD (XCTD)",
+	"18":"profiling float",
+	"19":"undulating oceanographic recorder",
+	"20":"autonomous pinneped bathythermograph",
+	"21":"glider",
+	"30":"sledge",
+	"31":"CREX CMAN/Tide gauge"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C1.SID.json b/schemas/lib/imma.old/code_tables/ICOADS.C1.SID.json
new file mode 100644
index 0000000000000000000000000000000000000000..8d1716ebb3278a889096c8c72ea90cb60065539f
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C1.SID.json
@@ -0,0 +1,165 @@
+{
+	"0":"Reserved",
+	"1":"Atlas",
+	"2":"HSST Pacific",
+	"3":"HSST Indian",
+	"4":"HSST Atlantic",
+	"5":"Old TDF-11 Supplement B",
+	"6":"Old TDF-11 Supplement C",
+	"7":"Monterey Telecommunications",
+	"8":"Ocean Station Vessels (OSV)",
+	"9":"OSV Supplement",
+	"10":"MSQ 486 and 105 Omissions",
+	"11":"National Oceanographic Data Center (NODC) Surface",
+	"12":"NODC Surface Supplement",
+	"13":"Eltanin",
+	"14":"Japanese",
+	"15":"South African Whaling",
+	"16":"Australian",
+	"17":"International Maritime Meteorological (IMM) Data",
+	"18":"1970s Decade",
+	"19":"IMM 1970s",
+	"20":"OSV Z (1970s)",
+	"21":"Australian (1970s)",
+	"22":"NCDC: 1980-84 Annual Receipts",
+	"23":"1970s Mislocated Data",
+	"24":"Buoy Data",
+	"25":"NCDC: 1980-84 Annual Receipts (delayed data)",
+	"26":"NCDC: 1980-84 Annual Receipts (corrections; 1975)",
+	"27":"NCDC: 1985 Receipts (annual + delayed)",
+	"28":"NCDC: 1985 Receipts (duplicates)",
+	"29":"NCDC: US Nat. Met. Center (NMC, now NCEP) Reconversion (1980-92)",
+	"30":"NCDC: 1980-84 Period of Record",
+	"31":"Corrected Canadian Data",
+	"32":"NCDC: Annual Receipts (starting in 1986)",
+	"33":"NCDC: Annual Receipts (duplicates; starting in 1986)",
+	"34":"NCDC: 1986 Receipts (delayed)",
+	"35":"NCDC: 1987 Receipts (delayed)",
+	"36":"NCDC: 1988 Receipts (delayed)",
+	"37":"NCDC: 1989 Receipts (delayed)",
+	"38":"NCDC: 1990 Receipts (delayed)",
+	"39":"NCDC: 1991 Receipts (delayed)",
+	"40":"NCDC: 1992 Receipts (delayed)",
+	"41":"NCDC: 1993 Receipts (delayed)",
+	"42":"NCDC: 1994 Receipts (delayed)",
+	"43":"NCDC: 1995 Receipts (delayed)",
+	"44":"NCDC: 1996 Receipts (delayed)",
+	"45":"NCDC: 1997 Receipts (delayed)",
+	"46":"International Maritime Met. (IMM) Tape Archive (1982-): ebcdic",
+	"47":"International Maritime Met. (IMM) Tape Archive (1982-): ascii",
+	"48":"NODC/OCL 1994 World Ocean Atlas (WOA94; Mar. 93 NODC archive data)",
+	"49":"NODC/OCL 1994 World Ocean Atlas (WOA94; non-NODC archive)",
+	"50":"US National Data Buoy Center (NDBC) Data",
+	"51":"Russian AARI North Pole (NP) Stations (revised; from EWG CD-ROM)",
+	"52":"Russian AARI North Pole (NP) Stations (earlier; from Polar Science Cntr)",
+	"53":"First GARP Global Experiment (FGGE) Level IIb: Surface Marine Data",
+	"54":"FGGE Level IIb: Oceanographic Data",
+	"55":"FGGE Level IIb: Drifting Buoy Data",
+	"56":"Russian S.O. Makarov Collection",
+	"57":"Russian Marine Meteorological Data Set (MORMET) (rec'd at NCAR)",
+	"58":"French International Maritime Met. (IMM) Uncorrected (1954-88)",
+	"59":"UK IMM Corrections (1982-89)",
+	"60":"French International Maritime Met. (IMM) Corrected (1954-88)",
+	"61":"Canadian Oceanography and Scientific Data (OSD; formerly ISDM/MEDS) Buoys",
+	"62":"OSD (formerly ISDM/MEDS) World Ocean Circulation Experiment (WOCE) Buoys",
+	"63":"Canadian ISDM (formerly MEDS) Buoys (July 2005 archive extended Dec. 2008)",
+	"64":"Russian Research Vessel (R/V) Digitization: Marine Surface",
+	"65":"Russian Research Vessel (R/V) Digitization: Marine Actinometric",
+	"66":"Pacific Marine Environmental Lab. (PMEL) TOGA/TAO Buoys",
+	"67":"PMEL (Daily) Equatorial Moorings and Island Stations",
+	"68":"Arctic Drift Stations",
+	"69":"US Maury Collection",
+	"70":"Inter-American Tropical Tuna Comm. (IATTC) Porpoise Obs. Logs",
+	"71":"IATTC Fishing Logs",
+	"72":"IMM Tape Archive from WMO Global Collecting Centre (GCC) (1994 format)",
+	"73":"NCDC Marine Obs. Processing System (MOPS): Pre-MOPS (TD-9973)",
+	"74":"NCDC MOPS: Duplicate File (TD-9974)",
+	"75":"NCDC MOPS: Original Observations (TD-9980)",
+	"76":"NCDC MOPS: Supplementary or Correction Data",
+	"77":"NCDC: US National Cntrs. for Environ. Pred. (NCEP) Reconversion (1994-97)",
+	"78":"NCDC: US-keyed Logbook Data Reconversion (TD-9972; keyed during 1996-97)",
+	"79":"US Air Force Global Weather Central (GWC): DATSAV2 format",
+	"80":"US Navy FNMOC Monterey Telecom: NCAR: Kunia (OPCON) format",
+	"81":"US Navy FNMOC Monterey Telecom: NCAR: NEDN format",
+	"82":"US Navy FNMOC Monterey Telecom: NCAR: Surface Ship (SPOT) format",
+	"83":"US Navy FNMOC Monterey Telecom: NCDC: Surface Ship (SPOT) format (TD-9769)",
+	"84":"US Merchant Marine Collection (1912-46): Full Quality Control (QC)",
+	"85":"US Merchant Marine Collection (1912-46): Partial QC",
+	"86":"Pacific Marine Environ. Lab. (PMEL) TOGA/TAO Buoys: RAM Data",
+	"87":"Pacific Marine Environ. Lab. (PMEL) TOGA/TAO Buoys: SPOT Data",
+	"88":"NODC/OCL 1998 World Ocean Database (WOD98; Mar. 94 NODC archive data)",
+	"89":"NODC/OCL 1998 World Ocean Database (WOD98; non-NODC archive)",
+	"90":"UK Met. Ofc. (MetO) Main Marine Data Bank (MDB): Flatfile 1 (no cardimage)",
+	"91":"MetO MDB: Flatfile 1A (Flatfile plus cardimage data)",
+	"92":"MetO MDB: Flatfile 1B (no Flatfile match; data derived from cardimage)",
+	"93":"MetO Historical Metforms (1935-39): Flatfile 1C (data from cardimage)",
+	"94":"MetO GTS Receipts (primarily SHIP code; from MDB format)",
+	"95":"Japanese Kobe Collection Data (IMMT format; 2003 Edition)",
+	"96":"Norwegian Logbook Collection",
+	"97":"Japanese Kobe Collection Data (IMMT format; 1998 Edition)",
+	"98":"US Merchant Marine Collection (1912-46): Full QC (CLICOM system)",
+	"99":"Japanese Kobe Collection Data (IMMT format; 2001 Edition)",
+	"100":"NCEP BUFR GTS: Operational Tanks: Converted from Original Message",
+	"101":"NCEP BUFR GTS: Operational Tanks: Converted from BUFR",
+	"102":"NCEP BUFR GTS: Dumped Data: Converted from Original Message",
+	"103":"NCEP BUFR GTS: Dumped Data: Converted from BUFR",
+	"109":"US Navy Marine (US-keyed ship data; hourly METAR format",
+	"110":"UK Met. Office VOSClim GTS BUFR Data",
+	"111":"Shipboard Environmental (Data) Acquisition System (SEAS)",
+	"112":"IMM Tape Archive from WMO GCC (IMMT-2 or IMMT-3 format)",
+	"113":"International Marine (US-keyed ship data)",
+	"114":"NCEI GTS",
+	"115":"Japanese Whaling Ship Data (CDMP digitization)",
+	"116":"Japanese Whaling Ship Data (MIT digitization)",
+	"117":"PMEL TAO/TRITON and PIRATA Research Archive Hourly Average Data",
+	"118":"PMEL TAO/TRITON and PIRATA Research Archive 10-Minute Average Data",
+	"119":"JAMSTEC TRITON Hourly Average Data",
+	"120":"PMEL TAO/TRITON and PIRATA Research Archive Hourly Average SLP Data",
+	"121":"US National Data Buoy Center (NDBC) Data (obtained from NCDC 2005-2012)",
+	"122":"US NDBC data (NODC f291 archive version translated by NCDC 2008)",
+	"124":"Climatological Database for the World's Oceans (CLIWOC; Release 2.0)",
+	"125":"US Marine Meteorological Journals Collection (1878-94)",
+	"126":"Royal Navy Ship's Logs 1938-47 (keyed by 2007)",
+	"127":"Antarctic Expeditions: Print./Published (held at Met Office)",
+	"128":"North Polar Expedition of the Fram Strait (digitised by Environment Canada",
+	"129":"Byrd Antarctic Expedition (keyed by Hollings Scholars)",
+	"130":"Research Vessel (R/V) Data Quality-Evaluated by FSU/COAPS: WOCE ver.3.0",
+	"131":"Research Vessel (R/V) Data Quality-Evaluated by FSU/COAPS: SAMOS",
+	"132":"Research Vessel (R/V) Data Quality-Evaluated by FSU/COAPS: Other",
+	"133":"Climatological Database for the World's Oceans (CLIWOC; Release 2.1)",
+	"134":"Deutscher Wetterdienst (DWD) Marine Meteorological Archive: Compo Subset",
+	"135":"DWD Marine Meteorological Archive: Newly Digitized Data",
+	"136":"DWD Marine Meteorological Archive: HISTOR Data",
+	"137":"NODC/OCL 2005 World Ocean Database (WOD05) updated through 13 Dec. 2007",
+	"138":"ACRE Data: Challenger Expedition",
+	"139":"German Deep Drifter Data (via ISDM; originally from IfM/Univ. Kiel)",
+	"140":"US Navy Hourlies: Deck 117 in TD-1100 format",
+	"141":"US Navy Hourlies: Original card deck 117 format (from FOSDIC)",
+	"142":"US Navy Hourlies: Original card deck 117 format (from DSI1117)",
+	"143":"Chinese/Global Ocean Data Archeology and Rescue (GODAR) Ships",
+	"144":"US Lightship collection: Woods Hole Oceanographic Institution",
+	"145":"US Lightship Collection: National Archives and Records Administration",
+	"146":"UK Met Office and NOC: VOSClim-compliant GTS BUFR Data: Historical ship/buoy (FM13)",
+	"147":"UK Met Office and NOC: VOSClim-compliant GTS BUFR Data: Historical buoy (FM18)",
+	"148":"English East India Company (EEIC) Ship Logs (containing insturmental data)",
+	"149":"NOAA/NCEI 2013 World Ocean Database (WOD13) updated through 24-02-2015",
+	"150":"Shipboard Environmental (data) Acquisition System (SEAS9.1): IMMT5 format",
+	"151":"US TurboWin (TurboWin 5.0)(e-Logbook) VOS Receipts: IMMT-4 format",
+	"152":"German Maury Collection",
+	"156":"Australian Navy Vssels: SST Data (1972 0 1977)",
+	"157":"US Navy Marine (IMMA formatted by US Navy)",
+	"158":"US TurboWin+ (e-logbook) VOS Receipts: IMMT-5",
+	"159":"Global Ocean Surface Underway Data (GOSUD v2) from NCEI in WOD format received 19 May 2015",
+	"160":"DWD Marine Meteorological Archive: HISTOR Data (receipts in 2015)",
+	"161":"DWD German Light Vessels (receipts in 2014)",
+	"162":"GOSUDv3 real-time data from NCEI in WOD format received 30 April 2015",
+	"163":"GOSUD v3 near real time data from NCEI in WOD format received 30 April 2015",
+	"164":"GOSUD delayed-mode French research vessels and sailing ship data from NCEI in WOD format received 30 April 2015",
+	"165":"World War I (WW1) UK Royal Navy Logbooks (OldWeather) (1914-1923)(Accessed 29 May 2015)",
+	"166":"US Navy Arctic Logbooks (OldWeather) (Accessed 29 May 2015)",
+	"167":"ACRE Historical Digitised (expeditionary and other spreadsheets) - Translated by UK Met Office",
+	"168":"ACRE Historical Digitised (expeditionary and other spreadsheets) - Translated by NCEI",
+	"169":"Global Tropical Moored Buoy Array (GTMBA) from PMEL RT via NOC",
+	"170":"Global Tropicak Moored Buoy Arrat (GTMBA) from PMEL DM via NOC",
+	"171":"Australian Abstract Logs (Wragge Collection) from Weather Detective Crowdsourcing (accessed 29 May 2015)"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C1.SX.json b/schemas/lib/imma.old/code_tables/ICOADS.C1.SX.json
new file mode 100644
index 0000000000000000000000000000000000000000..c17f22017177abd8581a92b1eeb465dba90beaae
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C1.SX.json
@@ -0,0 +1,3 @@
+{
+	"1":"period converted from code into whole seconds"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C1.TC.json b/schemas/lib/imma.old/code_tables/ICOADS.C1.TC.json
new file mode 100644
index 0000000000000000000000000000000000000000..91dcab7e4f3a61398cf360ec483666222d4f9a15
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C1.TC.json
@@ -0,0 +1,5 @@
+{
+	"0":"not track checked",
+	"1":"track checked",
+	"2":"Unknown"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C1.TRIM.json b/schemas/lib/imma.old/code_tables/ICOADS.C1.TRIM.json
new file mode 100644
index 0000000000000000000000000000000000000000..6cc622945d574efe8d584a133fb0f66af3fb706c
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C1.TRIM.json
@@ -0,0 +1,14 @@
+{
+	"1":"Within 2.8 sigma limits (g - 2.8*s1 <= a1 <= g + 2.8*s5)",
+	"2":"Less than 2.8 sigma lower limit (g - 3.5*s1 <= a1 < g - 2.8*s1)",
+	"3":"Greater than 2.8 sigma upper limit (g + 2.8*s5 < a1 <= g + 3.5*s5)",
+	"4":"Less than 3.5 sigma lower limit (g - 4.5*s1 <= a1 < g - 3.5*s1)",
+	"5":"Greater than 3.5 sigma upper limit (g + 3.5*s5 < a1 <= g + 4.5*s5)",
+	"6":"Less than 4.5 sigma lower limit (a1 < g - 4.5*s1)",
+	"7":"Greater than 4.5 sigma upper limit (a1 > g + 4.5*s5)",
+	"11":"Limits missing (ocean/coastal box); MEDS data correct (SF/PF only)",
+	"12":"Limits missing (ocean/coastal box) ",
+	"13":"Landlocked 2-degree box",
+	"14":"Data unusable (SF, AF, and PF, only; see Table 2)",
+	"15":"Data missing or not computable (see Table 2)"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C1.WX.json b/schemas/lib/imma.old/code_tables/ICOADS.C1.WX.json
new file mode 100644
index 0000000000000000000000000000000000000000..c17f22017177abd8581a92b1eeb465dba90beaae
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C1.WX.json
@@ -0,0 +1,3 @@
+{
+	"1":"period converted from code into whole seconds"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C5.AWSI.json b/schemas/lib/imma.old/code_tables/ICOADS.C5.AWSI.json
new file mode 100644
index 0000000000000000000000000000000000000000..7942a4956a1cb285842d7de6b68f7116d1827003
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C5.AWSI.json
@@ -0,0 +1,5 @@
+{
+	"0":"No AWS",
+	"1":"AWS",
+	"2":"AWS plus manual observations"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C5.FM.json b/schemas/lib/imma.old/code_tables/ICOADS.C5.FM.json
new file mode 100644
index 0000000000000000000000000000000000000000..09ad7f2148fe407ae22a688726e0961d7e78de2e
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C5.FM.json
@@ -0,0 +1,15 @@
+{
+	"0":"0",
+	"1":"1",
+	"2":"2",
+	"3":"3",
+	"4":"4",
+	"5":"5",
+	"6":"6",
+	"7":"7",
+	"8":"8",
+	"9":"9",
+	"10":"A",
+	"11":"B",
+	"12":"C"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C5.IC1.json b/schemas/lib/imma.old/code_tables/ICOADS.C5.IC1.json
new file mode 100644
index 0000000000000000000000000000000000000000..656f8ee13ce02cb2a75dfb1e0bc18cfd1abf623a
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C5.IC1.json
@@ -0,0 +1,13 @@
+{
+	"2":"0",
+	"2":"1",
+	"2":"2",
+	"2":"3 ",
+	"2":"4 ",
+	"2":"5 ",
+	"2":"6",
+	"2":"7",
+	"2":"8 ",
+	"2":"9",
+	"2":"10"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C5.IC2.json b/schemas/lib/imma.old/code_tables/ICOADS.C5.IC2.json
new file mode 100644
index 0000000000000000000000000000000000000000..1f38dcb000d5e564553f79d510abeb87db82dff0
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C5.IC2.json
@@ -0,0 +1,13 @@
+{
+	"2":"0",
+	"2":"1",
+	"2":"2",
+	"2":"3",
+	"2":"4",
+	"2":"5",
+	"2":"6",
+	"2":"7",
+	"2":"8",
+	"2":"9",
+	"2":"10"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C5.IC3.json b/schemas/lib/imma.old/code_tables/ICOADS.C5.IC3.json
new file mode 100644
index 0000000000000000000000000000000000000000..1f38dcb000d5e564553f79d510abeb87db82dff0
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C5.IC3.json
@@ -0,0 +1,13 @@
+{
+	"2":"0",
+	"2":"1",
+	"2":"2",
+	"2":"3",
+	"2":"4",
+	"2":"5",
+	"2":"6",
+	"2":"7",
+	"2":"8",
+	"2":"9",
+	"2":"10"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C5.IC4.json b/schemas/lib/imma.old/code_tables/ICOADS.C5.IC4.json
new file mode 100644
index 0000000000000000000000000000000000000000..1f38dcb000d5e564553f79d510abeb87db82dff0
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C5.IC4.json
@@ -0,0 +1,13 @@
+{
+	"2":"0",
+	"2":"1",
+	"2":"2",
+	"2":"3",
+	"2":"4",
+	"2":"5",
+	"2":"6",
+	"2":"7",
+	"2":"8",
+	"2":"9",
+	"2":"10"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C5.IC5.json b/schemas/lib/imma.old/code_tables/ICOADS.C5.IC5.json
new file mode 100644
index 0000000000000000000000000000000000000000..1f38dcb000d5e564553f79d510abeb87db82dff0
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C5.IC5.json
@@ -0,0 +1,13 @@
+{
+	"2":"0",
+	"2":"1",
+	"2":"2",
+	"2":"3",
+	"2":"4",
+	"2":"5",
+	"2":"6",
+	"2":"7",
+	"2":"8",
+	"2":"9",
+	"2":"10"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C5.IMMV.json b/schemas/lib/imma.old/code_tables/ICOADS.C5.IMMV.json
new file mode 100644
index 0000000000000000000000000000000000000000..fd4c0c1e65c0edbf5e43117b5229f2c55b54298b
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C5.IMMV.json
@@ -0,0 +1,8 @@
+{
+	"0":"IMMT version just prior to version number being included",
+	"1":"IMMT-1 (in effect from 2 Nov. 1994)",
+	"2":"IMMT-2 (in effect from Jan. 2003)",
+	"3":"IMMT-3 (in effect from Jan. 2007)",
+	"4":"IMMT-4 (in effect from Jan. 2011)",
+	"5":"IMMT-5 (in effect from June 2012)"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C5.IR.json b/schemas/lib/imma.old/code_tables/ICOADS.C5.IR.json
new file mode 100644
index 0000000000000000000000000000000000000000..99145727e94e10497541b1eeb4d5d3ed21137a54
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C5.IR.json
@@ -0,0 +1,7 @@
+{
+	"0":"Precipitation data are reported in Sections 1 and 3; Group 6RRRtr is included in both sections",
+	"1":"Precipitation data are reported in Section 1; Group 6RRRtr is included",
+	"2":"Precipitation data are reported in Section 3; Group 6RRRtr is included",
+	"3":"Precipitation data are reported in none of the two Sections 1 and 3; Group 6RRRtr is omitted (precipitation amount = 0)",
+	"4":"Precipitation data are reported in none of the two Sections 1 and 3; Group 6RRRtr is omitted (precipitation amount not available)"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C5.IS.json b/schemas/lib/imma.old/code_tables/ICOADS.C5.IS.json
new file mode 100644
index 0000000000000000000000000000000000000000..4b98268bd7edfec0dcef844e5101b33d1f4fa47c
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C5.IS.json
@@ -0,0 +1,7 @@
+{
+	"1":"icing from ocean spray",
+	"2":"icing from fog",
+	"3":"icing from spray and fog",
+	"4":"icing from rain",
+	"5":"icing from spray and rain"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C5.IX.json b/schemas/lib/imma.old/code_tables/ICOADS.C5.IX.json
new file mode 100644
index 0000000000000000000000000000000000000000..5c812596f0657a3e770d82123db3514ee86e8050
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C5.IX.json
@@ -0,0 +1,9 @@
+{
+	"1":"manned included",
+	"2":"manned omitted (no significant phenomenon to report)",
+	"3":"manned omitted (no observation, data not available)",
+	"4":"automatic included [using WMO Codes 4677 and 4561]",
+	"5":"automatic omitted (no significant phenomenon to report)",
+	"6":"automatic omitted (no observation, data not available)",
+	"7":"automatic included using WMO Codes 4680 and 4531"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C5.MQCS.json b/schemas/lib/imma.old/code_tables/ICOADS.C5.MQCS.json
new file mode 100644
index 0000000000000000000000000000000000000000..56bde5038c8ed31c6abf6a4596c14f57f82670d2
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C5.MQCS.json
@@ -0,0 +1,12 @@
+{
+	"0":"No quality control (QC) has been performed on this element",
+	"1":"QC has been performed; element appears to be correct",
+	"2":"QC has been performed; element appears to be inconsistent with other elements",
+	"3":"QC has been performed; element appears to be doubtful",
+	"4":"QC has been performed; element appears to be erroneous",
+	"5":"The value has been changed as a result of QC",
+	"6":"The original flag is set (1) (correct) and the value will be classified by MQCS as inconsistent, dubious, erroneous or missing",
+	"7":"The original flag is set (5) (amended) and the value will be classified by MQCS as inconsistent, dubious, erroneous or missing",
+	"8":"[reserved]",
+	"9":"The value of the element is missing"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C5.MQCSv.json b/schemas/lib/imma.old/code_tables/ICOADS.C5.MQCSv.json
new file mode 100644
index 0000000000000000000000000000000000000000..2a7d303c79ba019d86f2bc4c2856a59f1bda637b
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C5.MQCSv.json
@@ -0,0 +1,9 @@
+{
+	"1":"MQCS- I (Original version, Feb. 1989): CMM-X",
+	"2":"MQCS-II (Version 2, March 1997) CMM-XII",
+	"3":"MQCS-III (Version 3, April 2000) SGMC-VIII",
+	"4":"MQCS-IV (Version 4, June 2001): JCOMM-I",
+	"5":"MQCS-V (Version 5, July 2004): ETMC-I",
+	"6":"MQCS-VI (Version 6, January 2011): JCOMM-III",
+	"7":"MQCS-VII (Version 7, June 2012): JCOMM-IV"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C5.OP.json b/schemas/lib/imma.old/code_tables/ICOADS.C5.OP.json
new file mode 100644
index 0000000000000000000000000000000000000000..b076ab7d3930ac2af6f7cfa6334696a7af43e782
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C5.OP.json
@@ -0,0 +1,12 @@
+{
+	"0":"unknown",
+	"1":"selected ship",
+	"2":"supplementary ship",
+	"3":"auxiliary ship",
+	"4":"registered VOSClim ship",
+	"5":"fixed sea station (e.g., rig or platform)",
+	"6":"coastal station",
+	"7":"[reserved]",
+	"8":"[reserved]",
+	"9":"others / data buoy"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C5.OS.json b/schemas/lib/imma.old/code_tables/ICOADS.C5.OS.json
new file mode 100644
index 0000000000000000000000000000000000000000..f10e38b831204ed6162c431b40b520b96d475065
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C5.OS.json
@@ -0,0 +1,9 @@
+{
+	"0":"unknown",
+	"1":"logbook (paper)",
+	"2":"national telecommunication channels",
+	"3":"national publications",
+	"4":"logbook (electronic)",
+	"5":"global telecommunication channels (GTS)",
+	"6":"international publications"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C5.RHI.json b/schemas/lib/imma.old/code_tables/ICOADS.C5.RHI.json
new file mode 100644
index 0000000000000000000000000000000000000000..5a97d17ccc67ed31d4321fa38475d7fdbe272e06
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C5.RHI.json
@@ -0,0 +1,7 @@
+{
+	"0":"Relative humidity in tenths of Percentage, measured and originally reported",
+	"1":"Relative humidity in whole Percentage, measured and originally reported",
+	"2":"[Reserved]",
+	"3":"Relative humidity in tenths of Percentage, computed",
+	"4":"Relative humidity in whole Percentage, computed"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C5.RRR.json b/schemas/lib/imma.old/code_tables/ICOADS.C5.RRR.json
new file mode 100644
index 0000000000000000000000000000000000000000..efb1ed34264a83dd892db6c794e86527ab9b0c4f
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C5.RRR.json
@@ -0,0 +1,1002 @@
+{
+	"0":"0",
+	"1":"1",
+	"2":"2",
+	"3":"3",
+	"4":"4",
+	"5":"5",
+	"6":"6",
+	"7":"7",
+	"8":"8",
+	"9":"9",
+	"10":"10",
+	"11":"11",
+	"12":"12",
+	"13":"13",
+	"14":"14",
+	"15":"15",
+	"16":"16",
+	"17":"17",
+	"18":"18",
+	"19":"19",
+	"20":"20",
+	"21":"21",
+	"22":"22",
+	"23":"23",
+	"24":"24",
+	"25":"25",
+	"26":"26",
+	"27":"27",
+	"28":"28",
+	"29":"29",
+	"30":"30",
+	"31":"31",
+	"32":"32",
+	"33":"33",
+	"34":"34",
+	"35":"35",
+	"36":"36",
+	"37":"37",
+	"38":"38",
+	"39":"39",
+	"40":"40",
+	"41":"41",
+	"42":"42",
+	"43":"43",
+	"44":"44",
+	"45":"45",
+	"46":"46",
+	"47":"47",
+	"48":"48",
+	"49":"49",
+	"50":"50",
+	"51":"51",
+	"52":"52",
+	"53":"53",
+	"54":"54",
+	"55":"55",
+	"56":"56",
+	"57":"57",
+	"58":"58",
+	"59":"59",
+	"60":"60",
+	"61":"61",
+	"62":"62",
+	"63":"63",
+	"64":"64",
+	"65":"65",
+	"66":"66",
+	"67":"67",
+	"68":"68",
+	"69":"69",
+	"70":"70",
+	"71":"71",
+	"72":"72",
+	"73":"73",
+	"74":"74",
+	"75":"75",
+	"76":"76",
+	"77":"77",
+	"78":"78",
+	"79":"79",
+	"80":"80",
+	"81":"81",
+	"82":"82",
+	"83":"83",
+	"84":"84",
+	"85":"85",
+	"86":"86",
+	"87":"87",
+	"88":"88",
+	"89":"89",
+	"90":"90",
+	"91":"91",
+	"92":"92",
+	"93":"93",
+	"94":"94",
+	"95":"95",
+	"96":"96",
+	"97":"97",
+	"98":"98",
+	"99":"99",
+	"100":"100",
+	"101":"101",
+	"102":"102",
+	"103":"103",
+	"104":"104",
+	"105":"105",
+	"106":"106",
+	"107":"107",
+	"108":"108",
+	"109":"109",
+	"110":"110",
+	"111":"111",
+	"112":"112",
+	"113":"113",
+	"114":"114",
+	"115":"115",
+	"116":"116",
+	"117":"117",
+	"118":"118",
+	"119":"119",
+	"120":"120",
+	"121":"121",
+	"122":"122",
+	"123":"123",
+	"124":"124",
+	"125":"125",
+	"126":"126",
+	"127":"127",
+	"128":"128",
+	"129":"129",
+	"130":"130",
+	"131":"131",
+	"132":"132",
+	"133":"133",
+	"134":"134",
+	"135":"135",
+	"136":"136",
+	"137":"137",
+	"138":"138",
+	"139":"139",
+	"140":"140",
+	"141":"141",
+	"142":"142",
+	"143":"143",
+	"144":"144",
+	"145":"145",
+	"146":"146",
+	"147":"147",
+	"148":"148",
+	"149":"149",
+	"150":"150",
+	"151":"151",
+	"152":"152",
+	"153":"153",
+	"154":"154",
+	"155":"155",
+	"156":"156",
+	"157":"157",
+	"158":"158",
+	"159":"159",
+	"160":"160",
+	"161":"161",
+	"162":"162",
+	"163":"163",
+	"164":"164",
+	"165":"165",
+	"166":"166",
+	"167":"167",
+	"168":"168",
+	"169":"169",
+	"170":"170",
+	"171":"171",
+	"172":"172",
+	"173":"173",
+	"174":"174",
+	"175":"175",
+	"176":"176",
+	"177":"177",
+	"178":"178",
+	"179":"179",
+	"180":"180",
+	"181":"181",
+	"182":"182",
+	"183":"183",
+	"184":"184",
+	"185":"185",
+	"186":"186",
+	"187":"187",
+	"188":"188",
+	"189":"189",
+	"190":"190",
+	"191":"191",
+	"192":"192",
+	"193":"193",
+	"194":"194",
+	"195":"195",
+	"196":"196",
+	"197":"197",
+	"198":"198",
+	"199":"199",
+	"200":"200",
+	"201":"201",
+	"202":"202",
+	"203":"203",
+	"204":"204",
+	"205":"205",
+	"206":"206",
+	"207":"207",
+	"208":"208",
+	"209":"209",
+	"210":"210",
+	"211":"211",
+	"212":"212",
+	"213":"213",
+	"214":"214",
+	"215":"215",
+	"216":"216",
+	"217":"217",
+	"218":"218",
+	"219":"219",
+	"220":"220",
+	"221":"221",
+	"222":"222",
+	"223":"223",
+	"224":"224",
+	"225":"225",
+	"226":"226",
+	"227":"227",
+	"228":"228",
+	"229":"229",
+	"230":"230",
+	"231":"231",
+	"232":"232",
+	"233":"233",
+	"234":"234",
+	"235":"235",
+	"236":"236",
+	"237":"237",
+	"238":"238",
+	"239":"239",
+	"240":"240",
+	"241":"241",
+	"242":"242",
+	"243":"243",
+	"244":"244",
+	"245":"245",
+	"246":"246",
+	"247":"247",
+	"248":"248",
+	"249":"249",
+	"250":"250",
+	"251":"251",
+	"252":"252",
+	"253":"253",
+	"254":"254",
+	"255":"255",
+	"256":"256",
+	"257":"257",
+	"258":"258",
+	"259":"259",
+	"260":"260",
+	"261":"261",
+	"262":"262",
+	"263":"263",
+	"264":"264",
+	"265":"265",
+	"266":"266",
+	"267":"267",
+	"268":"268",
+	"269":"269",
+	"270":"270",
+	"271":"271",
+	"272":"272",
+	"273":"273",
+	"274":"274",
+	"275":"275",
+	"276":"276",
+	"277":"277",
+	"278":"278",
+	"279":"279",
+	"280":"280",
+	"281":"281",
+	"282":"282",
+	"283":"283",
+	"284":"284",
+	"285":"285",
+	"286":"286",
+	"287":"287",
+	"288":"288",
+	"289":"289",
+	"290":"290",
+	"291":"291",
+	"292":"292",
+	"293":"293",
+	"294":"294",
+	"295":"295",
+	"296":"296",
+	"297":"297",
+	"298":"298",
+	"299":"299",
+	"300":"300",
+	"301":"301",
+	"302":"302",
+	"303":"303",
+	"304":"304",
+	"305":"305",
+	"306":"306",
+	"307":"307",
+	"308":"308",
+	"309":"309",
+	"310":"310",
+	"311":"311",
+	"312":"312",
+	"313":"313",
+	"314":"314",
+	"315":"315",
+	"316":"316",
+	"317":"317",
+	"318":"318",
+	"319":"319",
+	"320":"320",
+	"321":"321",
+	"322":"322",
+	"323":"323",
+	"324":"324",
+	"325":"325",
+	"326":"326",
+	"327":"327",
+	"328":"328",
+	"329":"329",
+	"330":"330",
+	"331":"331",
+	"332":"332",
+	"333":"333",
+	"334":"334",
+	"335":"335",
+	"336":"336",
+	"337":"337",
+	"338":"338",
+	"339":"339",
+	"340":"340",
+	"341":"341",
+	"342":"342",
+	"343":"343",
+	"344":"344",
+	"345":"345",
+	"346":"346",
+	"347":"347",
+	"348":"348",
+	"349":"349",
+	"350":"350",
+	"351":"351",
+	"352":"352",
+	"353":"353",
+	"354":"354",
+	"355":"355",
+	"356":"356",
+	"357":"357",
+	"358":"358",
+	"359":"359",
+	"360":"360",
+	"361":"361",
+	"362":"362",
+	"363":"363",
+	"364":"364",
+	"365":"365",
+	"366":"366",
+	"367":"367",
+	"368":"368",
+	"369":"369",
+	"370":"370",
+	"371":"371",
+	"372":"372",
+	"373":"373",
+	"374":"374",
+	"375":"375",
+	"376":"376",
+	"377":"377",
+	"378":"378",
+	"379":"379",
+	"380":"380",
+	"381":"381",
+	"382":"382",
+	"383":"383",
+	"384":"384",
+	"385":"385",
+	"386":"386",
+	"387":"387",
+	"388":"388",
+	"389":"389",
+	"390":"390",
+	"391":"391",
+	"392":"392",
+	"393":"393",
+	"394":"394",
+	"395":"395",
+	"396":"396",
+	"397":"397",
+	"398":"398",
+	"399":"399",
+	"400":"400",
+	"401":"401",
+	"402":"402",
+	"403":"403",
+	"404":"404",
+	"405":"405",
+	"406":"406",
+	"407":"407",
+	"408":"408",
+	"409":"409",
+	"410":"410",
+	"411":"411",
+	"412":"412",
+	"413":"413",
+	"414":"414",
+	"415":"415",
+	"416":"416",
+	"417":"417",
+	"418":"418",
+	"419":"419",
+	"420":"420",
+	"421":"421",
+	"422":"422",
+	"423":"423",
+	"424":"424",
+	"425":"425",
+	"426":"426",
+	"427":"427",
+	"428":"428",
+	"429":"429",
+	"430":"430",
+	"431":"431",
+	"432":"432",
+	"433":"433",
+	"434":"434",
+	"435":"435",
+	"436":"436",
+	"437":"437",
+	"438":"438",
+	"439":"439",
+	"440":"440",
+	"441":"441",
+	"442":"442",
+	"443":"443",
+	"444":"444",
+	"445":"445",
+	"446":"446",
+	"447":"447",
+	"448":"448",
+	"449":"449",
+	"450":"450",
+	"451":"451",
+	"452":"452",
+	"453":"453",
+	"454":"454",
+	"455":"455",
+	"456":"456",
+	"457":"457",
+	"458":"458",
+	"459":"459",
+	"460":"460",
+	"461":"461",
+	"462":"462",
+	"463":"463",
+	"464":"464",
+	"465":"465",
+	"466":"466",
+	"467":"467",
+	"468":"468",
+	"469":"469",
+	"470":"470",
+	"471":"471",
+	"472":"472",
+	"473":"473",
+	"474":"474",
+	"475":"475",
+	"476":"476",
+	"477":"477",
+	"478":"478",
+	"479":"479",
+	"480":"480",
+	"481":"481",
+	"482":"482",
+	"483":"483",
+	"484":"484",
+	"485":"485",
+	"486":"486",
+	"487":"487",
+	"488":"488",
+	"489":"489",
+	"490":"490",
+	"491":"491",
+	"492":"492",
+	"493":"493",
+	"494":"494",
+	"495":"495",
+	"496":"496",
+	"497":"497",
+	"498":"498",
+	"499":"499",
+	"500":"500",
+	"501":"501",
+	"502":"502",
+	"503":"503",
+	"504":"504",
+	"505":"505",
+	"506":"506",
+	"507":"507",
+	"508":"508",
+	"509":"509",
+	"510":"510",
+	"511":"511",
+	"512":"512",
+	"513":"513",
+	"514":"514",
+	"515":"515",
+	"516":"516",
+	"517":"517",
+	"518":"518",
+	"519":"519",
+	"520":"520",
+	"521":"521",
+	"522":"522",
+	"523":"523",
+	"524":"524",
+	"525":"525",
+	"526":"526",
+	"527":"527",
+	"528":"528",
+	"529":"529",
+	"530":"530",
+	"531":"531",
+	"532":"532",
+	"533":"533",
+	"534":"534",
+	"535":"535",
+	"536":"536",
+	"537":"537",
+	"538":"538",
+	"539":"539",
+	"540":"540",
+	"541":"541",
+	"542":"542",
+	"543":"543",
+	"544":"544",
+	"545":"545",
+	"546":"546",
+	"547":"547",
+	"548":"548",
+	"549":"549",
+	"550":"550",
+	"551":"551",
+	"552":"552",
+	"553":"553",
+	"554":"554",
+	"555":"555",
+	"556":"556",
+	"557":"557",
+	"558":"558",
+	"559":"559",
+	"560":"560",
+	"561":"561",
+	"562":"562",
+	"563":"563",
+	"564":"564",
+	"565":"565",
+	"566":"566",
+	"567":"567",
+	"568":"568",
+	"569":"569",
+	"570":"570",
+	"571":"571",
+	"572":"572",
+	"573":"573",
+	"574":"574",
+	"575":"575",
+	"576":"576",
+	"577":"577",
+	"578":"578",
+	"579":"579",
+	"580":"580",
+	"581":"581",
+	"582":"582",
+	"583":"583",
+	"584":"584",
+	"585":"585",
+	"586":"586",
+	"587":"587",
+	"588":"588",
+	"589":"589",
+	"590":"590",
+	"591":"591",
+	"592":"592",
+	"593":"593",
+	"594":"594",
+	"595":"595",
+	"596":"596",
+	"597":"597",
+	"598":"598",
+	"599":"599",
+	"600":"600",
+	"601":"601",
+	"602":"602",
+	"603":"603",
+	"604":"604",
+	"605":"605",
+	"606":"606",
+	"607":"607",
+	"608":"608",
+	"609":"609",
+	"610":"610",
+	"611":"611",
+	"612":"612",
+	"613":"613",
+	"614":"614",
+	"615":"615",
+	"616":"616",
+	"617":"617",
+	"618":"618",
+	"619":"619",
+	"620":"620",
+	"621":"621",
+	"622":"622",
+	"623":"623",
+	"624":"624",
+	"625":"625",
+	"626":"626",
+	"627":"627",
+	"628":"628",
+	"629":"629",
+	"630":"630",
+	"631":"631",
+	"632":"632",
+	"633":"633",
+	"634":"634",
+	"635":"635",
+	"636":"636",
+	"637":"637",
+	"638":"638",
+	"639":"639",
+	"640":"640",
+	"641":"641",
+	"642":"642",
+	"643":"643",
+	"644":"644",
+	"645":"645",
+	"646":"646",
+	"647":"647",
+	"648":"648",
+	"649":"649",
+	"650":"650",
+	"651":"651",
+	"652":"652",
+	"653":"653",
+	"654":"654",
+	"655":"655",
+	"656":"656",
+	"657":"657",
+	"658":"658",
+	"659":"659",
+	"660":"660",
+	"661":"661",
+	"662":"662",
+	"663":"663",
+	"664":"664",
+	"665":"665",
+	"666":"666",
+	"667":"667",
+	"668":"668",
+	"669":"669",
+	"670":"670",
+	"671":"671",
+	"672":"672",
+	"673":"673",
+	"674":"674",
+	"675":"675",
+	"676":"676",
+	"677":"677",
+	"678":"678",
+	"679":"679",
+	"680":"680",
+	"681":"681",
+	"682":"682",
+	"683":"683",
+	"684":"684",
+	"685":"685",
+	"686":"686",
+	"687":"687",
+	"688":"688",
+	"689":"689",
+	"690":"690",
+	"691":"691",
+	"692":"692",
+	"693":"693",
+	"694":"694",
+	"695":"695",
+	"696":"696",
+	"697":"697",
+	"698":"698",
+	"699":"699",
+	"700":"700",
+	"701":"701",
+	"702":"702",
+	"703":"703",
+	"704":"704",
+	"705":"705",
+	"706":"706",
+	"707":"707",
+	"708":"708",
+	"709":"709",
+	"710":"710",
+	"711":"711",
+	"712":"712",
+	"713":"713",
+	"714":"714",
+	"715":"715",
+	"716":"716",
+	"717":"717",
+	"718":"718",
+	"719":"719",
+	"720":"720",
+	"721":"721",
+	"722":"722",
+	"723":"723",
+	"724":"724",
+	"725":"725",
+	"726":"726",
+	"727":"727",
+	"728":"728",
+	"729":"729",
+	"730":"730",
+	"731":"731",
+	"732":"732",
+	"733":"733",
+	"734":"734",
+	"735":"735",
+	"736":"736",
+	"737":"737",
+	"738":"738",
+	"739":"739",
+	"740":"740",
+	"741":"741",
+	"742":"742",
+	"743":"743",
+	"744":"744",
+	"745":"745",
+	"746":"746",
+	"747":"747",
+	"748":"748",
+	"749":"749",
+	"750":"750",
+	"751":"751",
+	"752":"752",
+	"753":"753",
+	"754":"754",
+	"755":"755",
+	"756":"756",
+	"757":"757",
+	"758":"758",
+	"759":"759",
+	"760":"760",
+	"761":"761",
+	"762":"762",
+	"763":"763",
+	"764":"764",
+	"765":"765",
+	"766":"766",
+	"767":"767",
+	"768":"768",
+	"769":"769",
+	"770":"770",
+	"771":"771",
+	"772":"772",
+	"773":"773",
+	"774":"774",
+	"775":"775",
+	"776":"776",
+	"777":"777",
+	"778":"778",
+	"779":"779",
+	"780":"780",
+	"781":"781",
+	"782":"782",
+	"783":"783",
+	"784":"784",
+	"785":"785",
+	"786":"786",
+	"787":"787",
+	"788":"788",
+	"789":"789",
+	"790":"790",
+	"791":"791",
+	"792":"792",
+	"793":"793",
+	"794":"794",
+	"795":"795",
+	"796":"796",
+	"797":"797",
+	"798":"798",
+	"799":"799",
+	"800":"800",
+	"801":"801",
+	"802":"802",
+	"803":"803",
+	"804":"804",
+	"805":"805",
+	"806":"806",
+	"807":"807",
+	"808":"808",
+	"809":"809",
+	"810":"810",
+	"811":"811",
+	"812":"812",
+	"813":"813",
+	"814":"814",
+	"815":"815",
+	"816":"816",
+	"817":"817",
+	"818":"818",
+	"819":"819",
+	"820":"820",
+	"821":"821",
+	"822":"822",
+	"823":"823",
+	"824":"824",
+	"825":"825",
+	"826":"826",
+	"827":"827",
+	"828":"828",
+	"829":"829",
+	"830":"830",
+	"831":"831",
+	"832":"832",
+	"833":"833",
+	"834":"834",
+	"835":"835",
+	"836":"836",
+	"837":"837",
+	"838":"838",
+	"839":"839",
+	"840":"840",
+	"841":"841",
+	"842":"842",
+	"843":"843",
+	"844":"844",
+	"845":"845",
+	"846":"846",
+	"847":"847",
+	"848":"848",
+	"849":"849",
+	"850":"850",
+	"851":"851",
+	"852":"852",
+	"853":"853",
+	"854":"854",
+	"855":"855",
+	"856":"856",
+	"857":"857",
+	"858":"858",
+	"859":"859",
+	"860":"860",
+	"861":"861",
+	"862":"862",
+	"863":"863",
+	"864":"864",
+	"865":"865",
+	"866":"866",
+	"867":"867",
+	"868":"868",
+	"869":"869",
+	"870":"870",
+	"871":"871",
+	"872":"872",
+	"873":"873",
+	"874":"874",
+	"875":"875",
+	"876":"876",
+	"877":"877",
+	"878":"878",
+	"879":"879",
+	"880":"880",
+	"881":"881",
+	"882":"882",
+	"883":"883",
+	"884":"884",
+	"885":"885",
+	"886":"886",
+	"887":"887",
+	"888":"888",
+	"889":"889",
+	"890":"890",
+	"891":"891",
+	"892":"892",
+	"893":"893",
+	"894":"894",
+	"895":"895",
+	"896":"896",
+	"897":"897",
+	"898":"898",
+	"899":"899",
+	"900":"900",
+	"901":"901",
+	"902":"902",
+	"903":"903",
+	"904":"904",
+	"905":"905",
+	"906":"906",
+	"907":"907",
+	"908":"908",
+	"909":"909",
+	"910":"910",
+	"911":"911",
+	"912":"912",
+	"913":"913",
+	"914":"914",
+	"915":"915",
+	"916":"916",
+	"917":"917",
+	"918":"918",
+	"919":"919",
+	"920":"920",
+	"921":"921",
+	"922":"922",
+	"923":"923",
+	"924":"924",
+	"925":"925",
+	"926":"926",
+	"927":"927",
+	"928":"928",
+	"929":"929",
+	"930":"930",
+	"931":"931",
+	"932":"932",
+	"933":"933",
+	"934":"934",
+	"935":"935",
+	"936":"936",
+	"937":"937",
+	"938":"938",
+	"939":"939",
+	"940":"940",
+	"941":"941",
+	"942":"942",
+	"943":"943",
+	"944":"944",
+	"945":"945",
+	"946":"946",
+	"947":"947",
+	"948":"948",
+	"949":"949",
+	"950":"950",
+	"951":"951",
+	"952":"952",
+	"953":"953",
+	"954":"954",
+	"955":"955",
+	"956":"956",
+	"957":"957",
+	"958":"958",
+	"959":"959",
+	"960":"960",
+	"961":"961",
+	"962":"962",
+	"963":"963",
+	"964":"964",
+	"965":"965",
+	"966":"966",
+	"967":"967",
+	"968":"968",
+	"969":"969",
+	"970":"970",
+	"971":"971",
+	"972":"972",
+	"973":"973",
+	"974":"974",
+	"975":"975",
+	"976":"976",
+	"977":"977",
+	"978":"978",
+	"979":"979",
+	"980":"980",
+	"981":"981",
+	"982":"982",
+	"983":"983",
+	"984":"984",
+	"985":"985",
+	"986":"986",
+	"987":"987",
+	"988":"988",
+	"989":"989",
+	"990":"0",
+	"991":"0.1",
+	"992":"0.2",
+	"993":"0.3",
+	"994":"0.4",
+	"995":"0.5",
+	"996":"0.6",
+	"997":"0.7",
+	"998":"0.8",
+	"999":"0.9"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C5.RS.json b/schemas/lib/imma.old/code_tables/ICOADS.C5.RS.json
new file mode 100644
index 0000000000000000000000000000000000000000..48b17cca95696b140923a86f5f7f53c22ec19fbe
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C5.RS.json
@@ -0,0 +1,7 @@
+{
+	"0":"ice not building up",
+	"1":"ice building up slowly",
+	"2":"ice building up rapidly",
+	"3":"ice melting or breaking up slowly",
+	"4":"ice melting or breaking up rapidly"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C5.TR.json b/schemas/lib/imma.old/code_tables/ICOADS.C5.TR.json
new file mode 100644
index 0000000000000000000000000000000000000000..98ddbd7eeded9030e77412ace6463e10e2f07aa8
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C5.TR.json
@@ -0,0 +1,12 @@
+{
+	"0":"undefined",
+	"1":"Total precipitation during the 6 hours preceding the observation",
+	"2":"Total precipitation during the 12 hours preceding the observation",
+	"3":"Total precipitation during the 18 hours preceding the observation",
+	"4":"Total precipitation during the 24 hours preceding the observation",
+	"5":"Total precipitation during the 1 hour preceding the observation",
+	"6":"Total precipitation during the 2 hours preceding the observation",
+	"7":"Total precipitation during the 3 hours preceding the observation",
+	"8":"Total precipitation during the 9 hours preceding the observation",
+	"9":"Total precipitation during the 15 hours preceding the observation"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C5.W2.json b/schemas/lib/imma.old/code_tables/ICOADS.C5.W2.json
new file mode 100644
index 0000000000000000000000000000000000000000..270266ebf8a482a6d05d458f847d7360272ca18d
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C5.W2.json
@@ -0,0 +1,12 @@
+{
+	"0":"cloud covering one half or less of the sky throughout the period",
+	"1":"cloud covering more than one half of the sky during part of the period and covering one half or less during part of the period",
+	"2":"cloud covering more than one half of the sky throughout the period",
+	"3":"sandstorm, dust storm or blowing snow",
+	"4":"fog, ice fog, or thick haze (US includes thick smoke)",
+	"5":"drizzle",
+	"6":"rain",
+	"7":"snow, or rain and snow mixed",
+	"8":"shower",
+	"9":"thunderstorm with or without precipitation"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C5.WMI.json b/schemas/lib/imma.old/code_tables/ICOADS.C5.WMI.json
new file mode 100644
index 0000000000000000000000000000000000000000..aadd9d14d1c48577a20f7969fc55cb9cab4e75e0
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C5.WMI.json
@@ -0,0 +1,12 @@
+{
+	"0":"wind sea and swell estimated shipborne wave recorder",
+	"1":"wind sea and swell measured shipborne wave recorder",
+	"2":"mixed wave measured, swell estimated shipborne wave recorder",
+	"3":"other combinations measured and estimated shipborne wave recorder",
+	"4":"wind sea and swell measured buoy",
+	"5":"mixed wave measured, swell estimated buoy",
+	"6":"other combinations measured and estimated buoy",
+	"7":"wind sea and swell measured other measurement system",
+	"8":"mixed wave measured, swell estimated other measurement system",
+	"9":"other combinations measured and estimated other measurement system"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C7.COUNTRY.json b/schemas/lib/imma.old/code_tables/ICOADS.C7.COUNTRY.json
new file mode 100644
index 0000000000000000000000000000000000000000..d9ec138fe198628d95ba1a547db3b7aae75beb69
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C7.COUNTRY.json
@@ -0,0 +1,259 @@
+{
+	"0":"Netherlands",
+	"1":"Norway",
+	"2":"US",
+	"3":"UK",
+	"4":"France",
+	"5":"Denmark",
+	"6":"Italy",
+	"7":"India",
+	"8":"Hong Kong",
+	"9":"New Zealand",
+	"00":"Netherlands",
+	"01":"Norway",
+	"02":"US",
+	"03":"UK",
+	"04":"France",
+	"05":"Denmark",
+	"06":"Italy",
+	"07":"India",
+	"08":"Hong Kong",
+	"09":"New Zealand",
+	"10":"Ireland",
+	"11":"Philippines",
+	"12":"Egypt",
+	"13":"Canada",
+	"14":"Belgium",
+	"15":"South Africa",
+	"16":"Australia",
+	"17":"Japan",
+	"18":"Pakistan",
+	"19":"Argentina",
+	"20":"Sweden",
+	"21":"Federal Republic of Germany",
+	"22":"Iceland",
+	"23":"Israel",
+	"24":"Malaysia",
+	"25":"USSR",
+	"26":"Finland",
+	"27":"Rep. of Korea",
+	"28":"New Caledonia",
+	"29":"Portugal",
+	"30":"Spain",
+	"31":"Thailand",
+	"32":"Yugoslavia",
+	"33":"Poland",
+	"34":"Brazil",
+	"35":"Singapore",
+	"36":"Kenya",
+	"37":"Tanzania",
+	"38":"Uganda",
+	"39":"Mexico",
+	"40":"German Democractic Republic",
+	"AF":"Afghanistan",
+	"AL":"Albania",
+	"DZ":"Algeria",
+	"AD":"Andorra",
+	"AO":"Angola",
+	"AG":"Antigua and Barbuda",
+	"AR":"Argentina",
+	"AM":"Armenia",
+	"AW":"Aruba",
+	"AU":"Australia",
+	"AT":"Austria",
+	"AZ":"Azerbaijan",
+	"BS":"Bahamas",
+	"BH":"Bahrain",
+	"BD":"Bangladesh",
+	"BB":"Barbados",
+	"BY":"Belarus",
+	"BE":"Belgium",
+	"BZ":"Belize",
+	"BJ":"Benin",
+	"BT":"Bhutan",
+	"BO":"Bolivia",
+	"BA":"Bosnia and Herzegovina",
+	"BW":"Botswana",
+	"BR":"Brazil",
+	"BN":"Brunei Darussalam",
+	"BG":"Bulgaria",
+	"BF":"Burkina Faso",
+	"BI":"Burundi",
+	"KH":"Cambodia",
+	"CM":"Cameroon",
+	"CA":"Canada",
+	"CV":"Cape Verde",
+	"CF":"Central African Republic",
+	"TD":"Chad",
+	"CL":"Chile",
+	"CN":"China",
+	"CO":"Columbia",
+	"KM":"Comoros",
+	"CG":"Congo",
+	"CD":"The Democratic Republic of the Congo",
+	"CR":"Costa Rica",
+	"CI":"Cote d'Ivoire",
+	"HR":"Croatia",
+	"CU":"Cuba",
+	"CY":"Cyprus",
+	"CZ":"Czech Republic",
+	"DK":"Denmark",
+	"DJ":"Djibouti",
+	"DM":"Dominica",
+	"DO":"Dominican Republic",
+	"EC":"Ecuador",
+	"EG":"Egypt",
+	"SV":"El Salvador",
+	"GQ":"Equatorial Guinea",
+	"ER":"Eritrea",
+	"EE":"Estonia",
+	"ET":"Ethiopia",
+	"FJ":"Fiji",
+	"FI":"Finland",
+	"FR":"France",
+	"GA":"Gabon",
+	"GM":"Gambia",
+	"GE":"Georgia",
+	"DE":"Germany",
+	"GH":"Ghana",
+	"GR":"Greece",
+	"GD":"Grenada",
+	"GT":"Guatemala",
+	"GN":"Guinea",
+	"GW":"Guinea Bissau",
+	"GY":"Guyana",
+	"HT":"Haiti",
+	"HN":"Honduras",
+	"HK":"Hong Kong",
+	"HU":"Hungary",
+	"IS":"Iceland",
+	"IN":"India",
+	"ID":"Indonesia",
+	"IR":"Islamic Republic of Iran",
+	"IQ":"Iraq",
+	"IE":"Ireland",
+	"IL":"Israel",
+	"IT":"Italy",
+	"JM":"Jamaica",
+	"JP":"Japan",
+	"JO":"Jordan",
+	"KZ":"Kazakhstan",
+	"KE":"Kenya",
+	"KI":"Kiribati",
+	"KR":"Republic of Korea",
+	"KW":"Kuwait",
+	"KG":"Kyrgyzstan",
+	"LA":"Lao Peoples Democratic Republic",
+	"LV":"Latvia",
+	"LB":"Lebanon",
+	"LS":"Lesotho",
+	"LR":"Liberia",
+	"LY":"Libyan Arab Jamahiriya",
+	"LT":"Lithuania",
+	"LU":"Luxembourg",
+	"MK":"The Former Yugoslav Republic of Macedonia",
+	"MG":"Madagascar",
+	"MW":"Malawi",
+	"MY":"Malaysia",
+	"MV":"Maldives",
+	"ML":"Mali",
+	"MT":"Malta",
+	"MH":"Marshal Islands",
+	"MR":"Mauritania",
+	"MU":"Mauritius",
+	"MX":"Mexico",
+	"FM":"Federated States of Micronesia",
+	"MD":"Republic of Moldova",
+	"MC":"Monaco",
+	"MN":"Mongolia",
+	"MA":"Morocco",
+	"MZ":"Mozambique",
+	"MM":"Myanmar",
+	"NA":"Namibia",
+	"NR":"Nauru",
+	"NP":"Nepal",
+	"NL":"Netherlands",
+	"AN":"Netherlands Antilles",
+	"NZ":"New Zealand",
+	"NI":"Nicaragua",
+	"NE":"Niger",
+	"NG":"Nigeria",
+	"KP":"Democratic People's Republic of Korea",
+	"NO":"Norway",
+	"OM":"Oman",
+	"PK":"Pakistan",
+	"PW":"Palau",
+	"PS":"Occupied Palestinian Territory",
+	"PA":"Panama",
+	"PG":"Papua New Guinea",
+	"PY":"Paraguay",
+	"PE":"Peru",
+	"PH":"Philippines",
+	"PL":"Poland",
+	"PT":"Portugal",
+	"QA":"Qatar",
+	"RO":"Romania",
+	"RU":"Russian Federation",
+	"RW":"Rwanda",
+	"KN":"Saint Kitts and Nevis",
+	"LC":"Saint Lucia",
+	"VC":"Saint Vincent and the Grenadines",
+	"WS":"Samoa",
+	"SM":"San Marino",
+	"ST":"Sao Tome And Principe",
+	"SA":"Saudi Arabia",
+	"SN":"Senegal",
+	"CS":"Serbia and Montenegro",
+	"SC":"Seychelles",
+	"SL":"Sierra Leone",
+	"SG":"Singapore",
+	"SK":"Slovakia",
+	"SI":"Slovenia",
+	"SB":"Solomon Islands",
+	"SO":"Somalia",
+	"ZA":"South Africa",
+	"ES":"Spain",
+	"LK":"Sri Lanka",
+	"SD":"Sudan",
+	"SR":"Surinam",
+	"SZ":"Swaziland",
+	"SE":"Sweden",
+	"CH":"Switzerland",
+	"SY":"Syrian Arab Republic",
+	"TJ":"Tajikistan",
+	"TZ":"United Republic of Tanzania",
+	"TH":"Thailand",
+	"TL":"Timor - Leste",
+	"TG":"Togo",
+	"TO":"Tonga",
+	"TT":"Trinidad and Tobago",
+	"TN":"Tunisia",
+	"TR":"Turkey",
+	"TM":"Turkmenistan",
+	"TV":"Tuvala",
+	"UG":"Uganda",
+	"UA":"Ukraine",
+	"AE":"United Arab Emirates",
+	"GB":"United Kingdom",
+	"US":"United States",
+	"UY":"Uruguay",
+	"UZ":"Uzbekistan",
+	"VU":"Vanuatu",
+	"VA":"Vatican City",
+	"VE":"Venezuela",
+	"VN":"Viet Nam",
+	"YE":"Yemen",
+	"ZM":"Zambia",
+	"ZW":"Zimbabwe",
+	"DD":"East Germany",
+	"CS":"Serbia and Montenegro",
+	"RU":"Soviet Union",
+	"NC":"New Caledonia",
+	"ZY":"None (self recruited)",
+	"ZZ":"None (third party support)",
+	"TW":"Taiwan (Province of China)",
+	"SU":"Soviet Union",
+	"YU":"Yugoslavia",
+	"XX":"Multiple recruitment",
+	"EU":"European Union"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C7.EOH.json b/schemas/lib/imma.old/code_tables/ICOADS.C7.EOH.json
new file mode 100644
index 0000000000000000000000000000000000000000..2314fc39739f5d785b76d806761b4ccc36f0b92f
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C7.EOH.json
@@ -0,0 +1,12 @@
+{
+	"A":"Aspirated (Assmann type)",
+	"S":"Screen (not ventilated)",
+	"HH":"Hand-held digital thermometer / humidity sensor",
+	"RS":"Radiation shield (e.g. cylindrical / Gill multi-plate)",
+	"SG":"Ship's Sling",
+	"SL":"Sling",
+	"SN":"Ship's screen",
+	"US":"Unscreened",
+	"VS":"Screen (ventilated)",
+	"W":"Whirling"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C7.EOT.json b/schemas/lib/imma.old/code_tables/ICOADS.C7.EOT.json
new file mode 100644
index 0000000000000000000000000000000000000000..2314fc39739f5d785b76d806761b4ccc36f0b92f
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C7.EOT.json
@@ -0,0 +1,12 @@
+{
+	"A":"Aspirated (Assmann type)",
+	"S":"Screen (not ventilated)",
+	"HH":"Hand-held digital thermometer / humidity sensor",
+	"RS":"Radiation shield (e.g. cylindrical / Gill multi-plate)",
+	"SG":"Ship's Sling",
+	"SL":"Sling",
+	"SN":"Ship's screen",
+	"US":"Unscreened",
+	"VS":"Screen (ventilated)",
+	"W":"Whirling"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C7.KOV.json b/schemas/lib/imma.old/code_tables/ICOADS.C7.KOV.json
new file mode 100644
index 0000000000000000000000000000000000000000..6f4ceab46b10c68168faf07c16d4ca34abd0453f
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C7.KOV.json
@@ -0,0 +1,34 @@
+{
+	"BA":"Barge",
+	"BC":"Bulk Carrier",
+	"CA":"Cable ship",
+	"CG":"Coast Guard Ship",
+	"CS":"Container Ship",
+	"DR":"Dredger",
+	"FE":"Passenger ferries",
+	"FP":"Floating production and storage units",
+	"FV":"Other Fishing Vessel",
+	"GC":"General Cargo",
+	"GT":"Gas Tanker",
+	"IC":"Icebreaking vessel",
+	"IF":"Inshore Fishing Vessel",
+	"LC":"Livestock carrier",
+	"LT":"Liquid Tanker",
+	"LV":"Light Vessel",
+	"MI":"Mobile installation including mobile offshore drill ships, jack-up rigs and semi-submersibles",
+	"MS":"Military Ship",
+	"OT":"Other",
+	"OW":"Ocean Weather Ship",
+	"PI":"Pipe layer",
+	"PS":"Passenger ships and cruise liners",
+	"RF":"Ro/Ro Ferry",
+	"RR":"Ro/Ro Cargo",
+	"RS":"Refrigerated cargo ships including banana ships",
+	"RV":"Research Vessel",
+	"SA":"Large sailing vessels",
+	"SV":"Support Vessel",
+	"TR":"Trawler",
+	"TU":"Tug",
+	"VC":"Vehicle carriers",
+	"YA":"Yacht / Pleasure Craft"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C7.LOT.json b/schemas/lib/imma.old/code_tables/ICOADS.C7.LOT.json
new file mode 100644
index 0000000000000000000000000000000000000000..073f8610e40c4269d2aadbb81809c3fa81edf7e2
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C7.LOT.json
@@ -0,0 +1,18 @@
+{
+	"1":"Bridge wing port",
+	"2":"Bridge wing starboard",
+	"3":"Bridge wing both sides",
+	"4":"Bridge wing windward side",
+	"5":"Wheelhouse top port",
+	"6":"Wheelhouse top starboard",
+	"7":"Wheelhouse top both",
+	"8":"Wheelhouse top center",
+	"9":"Wheelhouse top windward side",
+	"10":"Mainmast",
+	"11":"Foremast",
+	"12":"Mast on Wheelhouse top",
+	"13":"Main deck port side",
+	"14":"Main deck starboard side",
+	"15":"Main deck both sides",
+	"OT":"Other (specify in footnote)"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C7.OPM.json b/schemas/lib/imma.old/code_tables/ICOADS.C7.OPM.json
new file mode 100644
index 0000000000000000000000000000000000000000..48d6cf285e51269ac1cbde6f492ab4edd0258792
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C7.OPM.json
@@ -0,0 +1,11 @@
+{
+	"10":"Selected ships",
+	"15":"Selected ships (AWS)",
+	"30":"VOSClim",
+	"35":"VOSClim (AWS)",
+	"40":"Supplementary ships",
+	"45":"Supplementary ships (AWS)",
+	"70":"Auxiliary ships",
+	"75":"Auxiliary ships (AWS)",
+	"99":"Unknown"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C7.SIM.json b/schemas/lib/imma.old/code_tables/ICOADS.C7.SIM.json
new file mode 100644
index 0000000000000000000000000000000000000000..ab2712c3615b9f84a4871154fee410379f94b5b0
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C7.SIM.json
@@ -0,0 +1,10 @@
+{
+	"BU":"bucket",
+	"C":"condenser inlet (intake)",
+	"TT":"trailing thermistor",
+	"HC":"hull contact sensor",
+	"HT":"through hull sensor",
+	"RAD":"radiation thermometer",
+	"BTT":"bait tanks thermometer",
+	"OT":"others"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C7.SMV.json b/schemas/lib/imma.old/code_tables/ICOADS.C7.SMV.json
new file mode 100644
index 0000000000000000000000000000000000000000..ce932ad99b8b6751254f799b16af7bbb7ba71b4c
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C7.SMV.json
@@ -0,0 +1,12 @@
+{
+	"0":"NULL",
+	"1":"Output from digitization project, semi-colon delimited format (1955)",
+	"2":"Output from digitization project, semi-colon delimited format (1956)",
+	"3":"Output from digitization project, semi-colon delimited format (1957,1967)",
+	"4":"Output from digitization project, semi-colon delimited format (1968 to 1969)",
+	"5":"Fixed format (1970Ð94)",
+	"6":"Semicolon delimited format (1995 to 2001)",
+	"7":"Semicolon delimited format (2002 to 2007 q1)",
+	"8":"Semicolon delimited format (2007 q2 - 2008)",
+	"9":"Semicolon delimited format (2009 - 2014)"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C7.TOB.json b/schemas/lib/imma.old/code_tables/ICOADS.C7.TOB.json
new file mode 100644
index 0000000000000000000000000000000000000000..d8fc1997da5969b191ca9216aeb5fdd7534f56cf
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C7.TOB.json
@@ -0,0 +1,8 @@
+{
+	"AN":"Aneroid barometer (issued by Port Meteorological Officer or Meteorological Agency)",
+	"DA":"Digital Aneroid Barometer",
+	"MER":"Mercury Barometer",
+	"SAN":"Ship's Aneroid Barometer",
+	"ELE":"electronic digital barometer",
+	"OT":"Other"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C7.TOH.json b/schemas/lib/imma.old/code_tables/ICOADS.C7.TOH.json
new file mode 100644
index 0000000000000000000000000000000000000000..81f07bb29247c85e6b6ccb07d9f7136bd9f7c96a
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C7.TOH.json
@@ -0,0 +1,11 @@
+{
+	"NULL":"NULL",
+	"1":"Hygristor",
+	"2":"Chilled Mirror",
+	"3":"Other",
+	"C":"Capacitance",
+	"E":"Electric",
+	"H":"Hair hygrometer",
+	"P":"Psychrometer",
+	"T":"Torsion"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C7.TOT.json b/schemas/lib/imma.old/code_tables/ICOADS.C7.TOT.json
new file mode 100644
index 0000000000000000000000000000000000000000..f33196a1db3c0960cb2989957324aff9f84f343d
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C7.TOT.json
@@ -0,0 +1,5 @@
+{
+	"ALC":"Alcohol Thermometer",
+	"ELE":"Electric (resistance) Thermometer",
+	"MER":"Dry Bulb Mercury Thermometer"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C95.ASIR.json b/schemas/lib/imma.old/code_tables/ICOADS.C95.ASIR.json
new file mode 100644
index 0000000000000000000000000000000000000000..707b80a24c06bd24a7e01cc892593aad4140c24d
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C95.ASIR.json
@@ -0,0 +1,4 @@
+{
+	"0":"Active",
+	"1":"Inactive"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C95.DPRO.json b/schemas/lib/imma.old/code_tables/ICOADS.C95.DPRO.json
new file mode 100644
index 0000000000000000000000000000000000000000..a517e2d0da83e7df2bde5c89de19ee855e0de945
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C95.DPRO.json
@@ -0,0 +1,6 @@
+{
+	"1":"ECMWF",
+	"2":"NOAA-NCEP",
+	"3":"NASA",
+	"4":"JMA"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C95.DPRP.json b/schemas/lib/imma.old/code_tables/ICOADS.C95.DPRP.json
new file mode 100644
index 0000000000000000000000000000000000000000..827aa71ea992f4bad9edb4f1e4edb83636676a05
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C95.DPRP.json
@@ -0,0 +1,6 @@
+{
+	"1":"ERA-20C",
+	"2":"CFSRv2",
+	"3":"MERRA",
+	"4":"JRA-55"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C95.UFR.json b/schemas/lib/imma.old/code_tables/ICOADS.C95.UFR.json
new file mode 100644
index 0000000000000000000000000000000000000000..fa409f3555040ca1ef15475c9aeb4d34b02007f9
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C95.UFR.json
@@ -0,0 +1,8 @@
+{
+	"1":"Assimilated and used",
+	"2":"Assimilated and rejected",
+	"3":"Blacklisted",
+	"4":"Whitelisted",
+	"5":"Available but not used",
+	"6":"None apply"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C96.ASII.json b/schemas/lib/imma.old/code_tables/ICOADS.C96.ASII.json
new file mode 100644
index 0000000000000000000000000000000000000000..707b80a24c06bd24a7e01cc892593aad4140c24d
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C96.ASII.json
@@ -0,0 +1,4 @@
+{
+	"0":"Active",
+	"1":"Inactive"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C97.ASIE.json b/schemas/lib/imma.old/code_tables/ICOADS.C97.ASIE.json
new file mode 100644
index 0000000000000000000000000000000000000000..707b80a24c06bd24a7e01cc892593aad4140c24d
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C97.ASIE.json
@@ -0,0 +1,4 @@
+{
+	"0":"Active",
+	"1":"Inactive"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C98.IRF.json b/schemas/lib/imma.old/code_tables/ICOADS.C98.IRF.json
new file mode 100644
index 0000000000000000000000000000000000000000..823e73cccb89d9b95314edf2ddd4a74c8e9b63e9
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C98.IRF.json
@@ -0,0 +1,5 @@
+{
+	"0":"Intermediate (i.e. Retain in Intermediate data file, reject from Final dataset)",
+	"1":"Final (i.e. Retain in both Intermediate and Final datasets)",
+	"2":"Reject (i.e. Reject from both Intermediate and Final datasets)"
+}
diff --git a/schemas/lib/imma.old/code_tables/ICOADS.C98.RSA.json b/schemas/lib/imma.old/code_tables/ICOADS.C98.RSA.json
new file mode 100644
index 0000000000000000000000000000000000000000..f664fc2f5a58610e7c17876f12b93152224b69c5
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/ICOADS.C98.RSA.json
@@ -0,0 +1,5 @@
+{
+	"0":"Preliminary (Not yet included in an official ICOADS Release)",
+	"1":"Auxiliary (Records provided in separate data files in addition to ICOADS official Releases and Preliminary data. This also includes new data sources received, but awaiting blending into an official ICOADS Release)",
+	"2":"Full (A record included in an official ICOADS Release)"
+}
diff --git a/schemas/lib/imma.old/code_tables/icoads_3_0.MQCIndicator b/schemas/lib/imma.old/code_tables/icoads_3_0.MQCIndicator
new file mode 100644
index 0000000000000000000000000000000000000000..2c30d584ea6e5fb1b765909fbe667391c175b2a0
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/icoads_3_0.MQCIndicator
@@ -0,0 +1,12 @@
+[
+{"codes":[0],"description":"No quality control (QC) has been performed on this element"},
+{"codes":[1],"description":"QC has been performed; element appears to be correct"},
+{"codes":[2],"description":"QC has been performed; element appears to be inconsistent with other elements"},
+{"codes":[3],"description":"QC has been performed; element appears to be doubtful"},
+{"codes":[4],"description":"QC has been performed; element appears to be erroneous"},
+{"codes":[5],"description":"The value has been changed as a result of QC"},
+{"codes":[6],"description":"The original flag is set (1) (correct) and the value will be classified by MQCS as inconsistent, dubious, erroneous or missing"},
+{"codes":[7],"description":"The original flag is set (5) (amended) and the value will be classified by MQCS as inconsistent, dubious, erroneous or missing"},
+{"codes":[8],"description":"[reserved]"},
+{"codes":[9],"description":"The value of the element is missing"}
+]
diff --git a/schemas/lib/imma.old/code_tables/icoads_3_0.MQCIndicatorGeneral b/schemas/lib/imma.old/code_tables/icoads_3_0.MQCIndicatorGeneral
new file mode 100644
index 0000000000000000000000000000000000000000..18568deeb5d380208f85105f0402b926738bb5bd
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/icoads_3_0.MQCIndicatorGeneral
@@ -0,0 +1,12 @@
+[
+{"codes":[0],"description":"no QC has been performed on this element"},
+{"codes":[1],"description":"QC performed; element appears correct"},
+{"codes":[2],"description":"QC performed; element appears inconsistent with other elements"},
+{"codes":[3],"description":"QC performed; element appears doubtful"},
+{"codes":[4],"description":"QC performed; element appears erroneous"},
+{"codes":[5],"description":"QC performed; element changed (possibly to missing) as a result"},
+{"codes":[6],"description":"QC flag amended: element flagged by CMas correct (1), but according to MQCS still appears suspect (2-4) or missing (9)"},
+{"codes":[7],"description":"QC flag amended: element flagged by CM as changed (5), but according to MQCS still appears suspect (2-4)"},
+{"codes":[8],"description":"[reserved]"},
+{"codes":[9],"description":"element is missing"}
+]
diff --git a/schemas/lib/imma.old/code_tables/icoads_3_0.MQCversion b/schemas/lib/imma.old/code_tables/icoads_3_0.MQCversion
new file mode 100644
index 0000000000000000000000000000000000000000..f3f0655e34eb45cbd3f59197b1b408cd79ef61a7
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/icoads_3_0.MQCversion
@@ -0,0 +1,9 @@
+[
+{"codes":[1],"description":"MQCS- I (Original version, Feb. 1989): CMM-X"},
+{"codes":[2],"description":"MQCS-II (Version 2, March 1997) CMM-XII"},
+{"codes":[3],"description":"MQCS-III (Version 3, April 2000) SGMC-VIII"},
+{"codes":[4],"description":"MQCS-IV (Version 4, June 2001): JCOMM-I"},
+{"codes":[5],"description":"MQCS-V (Version 5, July 2004): ETMC-I"},
+{"codes":[6],"description":"MQCS-VI (Version 6, January 2011): JCOMM-III"},
+{"codes":[7],"description":"MQCS-VII (Version 7, June 2012): JCOMM-IV"}
+]
diff --git a/schemas/lib/imma.old/code_tables/icoads_3_0.SUPDEncoding b/schemas/lib/imma.old/code_tables/icoads_3_0.SUPDEncoding
new file mode 100644
index 0000000000000000000000000000000000000000..10188854fdbfd6e2faedf88ff1659a07079f6f34
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/icoads_3_0.SUPDEncoding
@@ -0,0 +1,5 @@
+[
+{"codes":[0],"description":"base64 encoding"},
+{"codes":[1],"description":"hexadecimal"},
+{"codes":[2],"description":"ASCII"}
+]
diff --git a/schemas/lib/imma.old/code_tables/icoads_3_0.awsi b/schemas/lib/imma.old/code_tables/icoads_3_0.awsi
new file mode 100644
index 0000000000000000000000000000000000000000..aef898d5135bd5e5df5a9e10eeba23c077438b26
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/icoads_3_0.awsi
@@ -0,0 +1,5 @@
+[
+{"codes":[0],"description":"No AWS"},
+{"codes":[1],"description":"AWS"},
+{"codes":[2],"description":"AWS plus manual observations"}
+]
diff --git a/schemas/lib/imma.old/code_tables/icoads_3_0.bsi b/schemas/lib/imma.old/code_tables/icoads_3_0.bsi
new file mode 100644
index 0000000000000000000000000000000000000000..0d33b2281b6edc1674596d888fc6b896a4a5750e
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/icoads_3_0.bsi
@@ -0,0 +1,3 @@
+[
+{"codes":[0],"description":"ICOADS box system"}
+]
diff --git a/schemas/lib/imma.old/code_tables/icoads_3_0.fm b/schemas/lib/imma.old/code_tables/icoads_3_0.fm
new file mode 100644
index 0000000000000000000000000000000000000000..84733ba3ad4059ddb19da928d6b0095512f7f6a7
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/icoads_3_0.fm
@@ -0,0 +1,15 @@
+[
+{"codes":[0],"description":"previous to FM 24-V"},
+{"codes":[1],"description":"FM 24-V"},
+{"codes":[2],"description":"FM 24-VI Ext."},
+{"codes":[3],"description":"FM 13-VII"},
+{"codes":[4],"description":"FM 13-VIII"},
+{"codes":[5],"description":"FM 13-VIII Ext."},
+{"codes":[6],"description":"FM 13-IX"},
+{"codes":[7],"description":"FM 13-IX Ext."},
+{"codes":[8],"description":"FM 13-X"},
+{"codes":[9],"description":"FM 13-XI"},
+{"codes":[10],"description":"FM 13-XII Ext."},
+{"codes":[11],"description":"FM 13-XIII"},
+{"codes":[12],"description":"FM 13-XIV Ext."}
+]
diff --git a/schemas/lib/imma.old/code_tables/icoads_3_0.immv b/schemas/lib/imma.old/code_tables/icoads_3_0.immv
new file mode 100644
index 0000000000000000000000000000000000000000..d5d30a49060f28825517cdf2e0c51fbbb1a38e03
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/icoads_3_0.immv
@@ -0,0 +1,8 @@
+[
+{"codes":[0],"description":"IMMT version just prior to version number being included"},
+{"codes":[1],"description":"IMMT-1 (in effect from 2 Nov. 1994)"},
+{"codes":[2],"description":"IMMT-2 (in effect from Jan. 2003)"},
+{"codes":[3],"description":"IMMT-3 (in effect from Jan. 2007)"},
+{"codes":[4],"description":"IMMT-4 (in effect from Jan. 2011)"},
+{"codes":[5],"description":"IMMT-5 (in effect from June 2012)"}
+]
diff --git a/schemas/lib/imma.old/code_tables/icoads_3_0.is b/schemas/lib/imma.old/code_tables/icoads_3_0.is
new file mode 100644
index 0000000000000000000000000000000000000000..8277af7628af91d9f6be89f1fcb8f9f775373402
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/icoads_3_0.is
@@ -0,0 +1,7 @@
+[
+{"codes":[1],"description":"icing from ocean spray"},
+{"codes":[2],"description":"icing from fog"},
+{"codes":[3],"description":"icing from spray and fog"},
+{"codes":[4],"description":"icing from rain"},
+{"codes":[5],"description":"icing from spray and rain"}
+]
diff --git a/schemas/lib/imma.old/code_tables/icoads_3_0.it b/schemas/lib/imma.old/code_tables/icoads_3_0.it
new file mode 100644
index 0000000000000000000000000000000000000000..65683d7ff8df9b097b5d1001bab1420fccfb0672
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/icoads_3_0.it
@@ -0,0 +1,12 @@
+[
+{"codes":[0],"description":"tenths degC"},
+{"codes":[1],"description":"half degC"},
+{"codes":[2],"description":"whole degC"},
+{"codes":[3],"description":"whole or tenths degC (mixed precision among temperature fields)"},
+{"codes":[4],"description":"tenths degF"},
+{"codes":[5],"description":"half degF"},
+{"codes":[6],"description":"whole degF"},
+{"codes":[7],"description":"whole or tenths degF (mixed precision among temperature fields)"},
+{"codes":[8],"description":"high resolution data (e.g., hundredths degC)"},
+{"codes":[9],"description":"other"}
+]
diff --git a/schemas/lib/imma.old/code_tables/icoads_3_0.ix b/schemas/lib/imma.old/code_tables/icoads_3_0.ix
new file mode 100644
index 0000000000000000000000000000000000000000..37e7045ff03357b7982192e1689b0e22a6a403ab
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/icoads_3_0.ix
@@ -0,0 +1,9 @@
+[
+{"codes":[1],"description":"manned included"},
+{"codes":[2],"description":"manned omitted (no significant phenomenon to report)"},
+{"codes":[3],"description":"manned omitted (no observation, data not available)"},
+{"codes":[4],"description":"automatic included [using WMO Codes 4677 and 4561]"},
+{"codes":[5],"description":"automatic omitted (no significant phenomenon to report)"},
+{"codes":[6],"description":"automatic omitted (no observation, data not available)"},
+{"codes":[7],"description":"automatic included using WMO Codes 4680 and 4531"}
+]
diff --git a/schemas/lib/imma.old/code_tables/icoads_3_0.kov b/schemas/lib/imma.old/code_tables/icoads_3_0.kov
new file mode 100644
index 0000000000000000000000000000000000000000..9e64f5a10294b9436da5ac74bea67acb9486a4d8
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/icoads_3_0.kov
@@ -0,0 +1,34 @@
+[
+{"codes":["BA"],"description":"Barge"},
+{"codes":["BC"],"description":"Bulk Carrier"},
+{"codes":["CA"],"description":"Cable ship"},
+{"codes":["CG"],"description":"Coast Guard Ship"},
+{"codes":["CS"],"description":"Container Ship"},
+{"codes":["DR"],"description":"Dredger"},
+{"codes":["FE"],"description":"Passenger ferries"},
+{"codes":["FP"],"description":"Floating production and storage units"},
+{"codes":["FV"],"description":"Other Fishing Vessel"},
+{"codes":["GC"],"description":"General Cargo"},
+{"codes":["GT"],"description":"Gas Tanker"},
+{"codes":["IC"],"description":"Icebreaking vessel"},
+{"codes":["IF"],"description":"Inshore Fishing Vessel"},
+{"codes":["LC"],"description":"Livestock carrier"},
+{"codes":["LT"],"description":"Liquid Tanker"},
+{"codes":["LV"],"description":"Light Vessel"},
+{"codes":["MI"],"description":"Mobile installation including mobile offshore drill ships, jack-up rigs and semi-submersibles"},
+{"codes":["MS"],"description":"Military Ship"},
+{"codes":["OT"],"description":"Other"},
+{"codes":["OW"],"description":"Ocean Weather Ship"},
+{"codes":["PI"],"description":"Pipe layer"},
+{"codes":["PS"],"description":"Passenger ships and cruise liners"},
+{"codes":["RF"],"description":"Ro\/Ro Ferry"},
+{"codes":["RR"],"description":"Ro\/Ro Cargo"},
+{"codes":["RS"],"description":"Refrigerated cargo ships including banana ships"},
+{"codes":["RV"],"description":"Research Vessel"},
+{"codes":["SA"],"description":"Large sailing vessels"},
+{"codes":["SV"],"description":"Support Vessel"},
+{"codes":["TR"],"description":"Trawler"},
+{"codes":["TU"],"description":"Tug"},
+{"codes":["VC"],"description":"Vehicle carriers"},
+{"codes":["YA"],"description":"Yacht \/ Pleasure Craft"}
+]
diff --git a/schemas/lib/imma.old/code_tables/icoads_3_0.lot b/schemas/lib/imma.old/code_tables/icoads_3_0.lot
new file mode 100644
index 0000000000000000000000000000000000000000..9a6f93ab64840df33de0cf164e1009361ef67489
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/icoads_3_0.lot
@@ -0,0 +1,18 @@
+[
+{"codes":["1"],"description":"Bridge wing port"},
+{"codes":["2"],"description":"Bridge wing starboard"},
+{"codes":["3"],"description":"Bridge wing both sides"},
+{"codes":["4"],"description":"Bridge wing windward side"},
+{"codes":["5"],"description":"Wheelhouse top port"},
+{"codes":["6"],"description":"Wheelhouse top starboard"},
+{"codes":["7"],"description":"Wheelhouse top both"},
+{"codes":["8"],"description":"Wheelhouse top center"},
+{"codes":["9"],"description":"Wheelhouse top windward side"},
+{"codes":["10"],"description":"Mainmast"},
+{"codes":["11"],"description":"Foremast"},
+{"codes":["12"],"description":"Mast on Wheelhouse top"},
+{"codes":["13"],"description":"Main deck port side"},
+{"codes":["14"],"description":"Main deck starboard side"},
+{"codes":["15"],"description":"Main deck both sides"},
+{"codes":["OT"],"description":"Other (specify in footnote)"}
+]
diff --git a/schemas/lib/imma.old/code_tables/icoads_3_0.mds b/schemas/lib/imma.old/code_tables/icoads_3_0.mds
new file mode 100644
index 0000000000000000000000000000000000000000..5b2a06e5341e0192f8bbd06486ce138eb05bf639
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/icoads_3_0.mds
@@ -0,0 +1,4 @@
+[
+{"codes":[0],"description":"WMO Publication No. 47"},
+{"codes":[1],"description":"Center for Ocean-Atmospheric Prediction Studies, Tallahassee, USA"}
+]
diff --git a/schemas/lib/imma.old/code_tables/icoads_3_0.op b/schemas/lib/imma.old/code_tables/icoads_3_0.op
new file mode 100644
index 0000000000000000000000000000000000000000..253d153e6cd7f2b4bd2bd5ba26f8987a2be45bb2
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/icoads_3_0.op
@@ -0,0 +1,12 @@
+[
+{"codes":[0],"description":"unknown"},
+{"codes":[1],"description":"selected ship"},
+{"codes":[2],"description":"supplementary ship"},
+{"codes":[3],"description":"auxiliary ship"},
+{"codes":[4],"description":"registered VOSClim ship"},
+{"codes":[5],"description":"fixed sea station (e.g., rig or platform)"},
+{"codes":[6],"description":"coastal station"},
+{"codes":[7],"description":"[reserved]"},
+{"codes":[8],"description":"[reserved]"},
+{"codes":[9],"description":"others \/ data buoy"}
+]
diff --git a/schemas/lib/imma.old/code_tables/icoads_3_0.opm b/schemas/lib/imma.old/code_tables/icoads_3_0.opm
new file mode 100644
index 0000000000000000000000000000000000000000..b053c6ef97aa58baaf2507e9ebc7d6a4a8b38127
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/icoads_3_0.opm
@@ -0,0 +1,11 @@
+[
+{"codes":[10],"description":"Selected ships"},
+{"codes":[15],"description":"Selected ships (AWS)"},
+{"codes":[30],"description":"VOSClim"},
+{"codes":[35],"description":"VOSClim (AWS)"},
+{"codes":[40],"description":"Supplementary ships"},
+{"codes":[45],"description":"Supplementary ships (AWS)"},
+{"codes":[70],"description":"Auxiliary ships"},
+{"codes":[75],"description":"Auxiliary ships (AWS)"},
+{"codes":[99],"description":"Unknown"}
+]
diff --git a/schemas/lib/imma.old/code_tables/icoads_3_0.os b/schemas/lib/imma.old/code_tables/icoads_3_0.os
new file mode 100644
index 0000000000000000000000000000000000000000..39d545bd5e48d87ea8468b8c06c43564027c9724
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/icoads_3_0.os
@@ -0,0 +1,9 @@
+[
+{"codes":[0],"description":"unknown"},
+{"codes":[1],"description":"logbook (paper)"},
+{"codes":[2],"description":"national telecommunication channels"},
+{"codes":[3],"description":"national publications"},
+{"codes":[4],"description":"logbook (electronic)"},
+{"codes":[5],"description":"global telecommunication channels (GTS)"},
+{"codes":[6],"description":"international publications"}
+]
diff --git a/schemas/lib/imma.old/code_tables/icoads_3_0.rhi b/schemas/lib/imma.old/code_tables/icoads_3_0.rhi
new file mode 100644
index 0000000000000000000000000000000000000000..0989919e6add3308484b29493b51dc58119eb93f
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/icoads_3_0.rhi
@@ -0,0 +1,7 @@
+[
+{"codes":[0],"description":"Relative humidity in tenths of Percentage, measured and originally reported"},
+{"codes":[1],"description":"Relative humidity in whole Percentage, measured and originally reported"},
+{"codes":[2],"description":"[Reserved]"},
+{"codes":[3],"description":"Relative humidity in tenths of Percentage, computed"},
+{"codes":[4],"description":"Relative humidity in whole Percentage, computed"}
+]
diff --git a/schemas/lib/imma.old/code_tables/icoads_3_0.rs b/schemas/lib/imma.old/code_tables/icoads_3_0.rs
new file mode 100644
index 0000000000000000000000000000000000000000..6d6b7dbb2136d5c9902fb99ce778891429f89301
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/icoads_3_0.rs
@@ -0,0 +1,7 @@
+[
+{"codes":[0],"description":"ice not building up"},
+{"codes":[1],"description":"ice building up slowly"},
+{"codes":[2],"description":"ice building up rapidly"},
+{"codes":[3],"description":"ice melting or breaking up slowly"},
+{"codes":[4],"description":"ice melting or breaking up rapidly"}
+]
diff --git a/schemas/lib/imma.old/code_tables/icoads_3_0.smv b/schemas/lib/imma.old/code_tables/icoads_3_0.smv
new file mode 100644
index 0000000000000000000000000000000000000000..a68ca8af263fe9fc871ac4ac67547e263b2f043b
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/icoads_3_0.smv
@@ -0,0 +1,12 @@
+[
+{"codes":[0],"description":null},
+{"codes":[1],"description":"Output from digitization project, semi-colon delimited format (1955)"},
+{"codes":[2],"description":"Output from digitization project, semi-colon delimited format (1956)"},
+{"codes":[3],"description":"Output from digitization project, semi-colon delimited format (1957,1967)"},
+{"codes":[4],"description":"Output from digitization project, semi-colon delimited format (1968 to 1969)"},
+{"codes":[5],"description":"Fixed format (1970\u00d094)"},
+{"codes":[6],"description":"Semicolon delimited format (1995 to 2001)"},
+{"codes":[7],"description":"Semicolon delimited format (2002 to 2007 q1)"},
+{"codes":[8],"description":"Semicolon delimited format (2007 q2 - 2008)"},
+{"codes":[9],"description":"Semicolon delimited format (2009 - 2014)"}
+]
diff --git a/schemas/lib/imma.old/code_tables/icoads_3_0.sstMethod_c7 b/schemas/lib/imma.old/code_tables/icoads_3_0.sstMethod_c7
new file mode 100644
index 0000000000000000000000000000000000000000..abc5bdbb5075a5fd7bcfff5cc82ec1453bd09824
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/icoads_3_0.sstMethod_c7
@@ -0,0 +1,14 @@
+[
+{"codes":["BU"],"description":"bucket"},
+{"codes":["C"],"description":"condenser inlet (intake)"},
+{"codes":["TT"],"description":"trailing thermistor"},
+{"codes":["HC"],"description":"hull contact sensor"},
+{"codes":["HT"],"description":"through hull sensor"},
+{"codes":["RAD"],"description":"radiation thermometer"},
+{"codes":["BTT"],"description":"bait tanks thermometer"},
+{"codes":["OT"],"description":"others"},
+{"codes":[null],"description":"unknown or non-bucket"},
+{"codes":[null],"description":"implied bucket [note: applicable to early ICOADS data]"},
+{"codes":[null],"description":"reversing thermometer or mechanical sensor"},
+{"codes":[null],"description":"electronic sensor"}
+]
diff --git a/schemas/lib/imma.old/code_tables/icoads_3_0.thermometerHousing b/schemas/lib/imma.old/code_tables/icoads_3_0.thermometerHousing
new file mode 100644
index 0000000000000000000000000000000000000000..92c22ff003b440ae5e685f2608f9474dda0658ee
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/icoads_3_0.thermometerHousing
@@ -0,0 +1,12 @@
+[
+{"codes":["A"],"description":"Aspirated (Assmann type)"},
+{"codes":["S"],"description":"Screen (not ventilated)"},
+{"codes":["HH"],"description":"Hand-held digital thermometer \/ humidity sensor"},
+{"codes":["RS"],"description":"Radiation shield (e.g. cylindrical \/ Gill multi-plate)"},
+{"codes":["SG"],"description":"Ship's Sling"},
+{"codes":["SL"],"description":"Sling"},
+{"codes":["SN"],"description":"Ship's screen"},
+{"codes":["US"],"description":"Unscreened"},
+{"codes":["VS"],"description":"Screen (ventilated)"},
+{"codes":["W"],"description":"Whirling"}
+]
diff --git a/schemas/lib/imma.old/code_tables/icoads_3_0.tob b/schemas/lib/imma.old/code_tables/icoads_3_0.tob
new file mode 100644
index 0000000000000000000000000000000000000000..95db204e8ff4580d95d4ea8f1d9ad25666f68c32
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/icoads_3_0.tob
@@ -0,0 +1,8 @@
+[
+{"codes":["AN"],"description":"Aneroid barometer (issued by Port Meteorological Officer or Meteorological Agency)"},
+{"codes":["DA"],"description":"Digital Aneroid Barometer"},
+{"codes":["MER"],"description":"Mercury Barometer"},
+{"codes":["SAN"],"description":"Ship's Aneroid Barometer"},
+{"codes":["ELE"],"description":"electronic digital barometer"},
+{"codes":["OT"],"description":"Other"}
+]
diff --git a/schemas/lib/imma.old/code_tables/icoads_3_0.toh b/schemas/lib/imma.old/code_tables/icoads_3_0.toh
new file mode 100644
index 0000000000000000000000000000000000000000..d46c7f7e7ad7aae33cecea332f229fe1c82ab12a
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/icoads_3_0.toh
@@ -0,0 +1,11 @@
+[
+{"codes":[null],"description":null},
+{"codes":["1"],"description":"Hygristor"},
+{"codes":["2"],"description":"Chilled Mirror"},
+{"codes":["3"],"description":"Other"},
+{"codes":["C"],"description":"Capacitance"},
+{"codes":["E"],"description":"Electric"},
+{"codes":["H"],"description":"Hair hygrometer"},
+{"codes":["P"],"description":"Psychrometer"},
+{"codes":["T"],"description":"Torsion"}
+]
diff --git a/schemas/lib/imma.old/code_tables/icoads_3_0.tot b/schemas/lib/imma.old/code_tables/icoads_3_0.tot
new file mode 100644
index 0000000000000000000000000000000000000000..3ece3251642fa4772bae707548bc6ac77bbf92ae
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/icoads_3_0.tot
@@ -0,0 +1,5 @@
+[
+{"codes":["ALC"],"description":"Alcohol Thermometer"},
+{"codes":["ELE"],"description":"Electric (resistance) Thermometer"},
+{"codes":["MER"],"description":"Dry Bulb Mercury Thermometer"}
+]
diff --git a/schemas/lib/imma.old/code_tables/icoads_3_0.tr b/schemas/lib/imma.old/code_tables/icoads_3_0.tr
new file mode 100644
index 0000000000000000000000000000000000000000..0f29693e577bb2614367c3113e63afda10f22492
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/icoads_3_0.tr
@@ -0,0 +1,12 @@
+[
+{"codes":[0],"description":"undefined"},
+{"codes":[1],"description":"Total precipitation during the 6 hours preceding the observation"},
+{"codes":[2],"description":"Total precipitation during the 12 hours preceding the observation"},
+{"codes":[3],"description":"Total precipitation during the 18 hours preceding the observation"},
+{"codes":[4],"description":"Total precipitation during the 24 hours preceding the observation"},
+{"codes":[5],"description":"Total precipitation during the 1 hour preceding the observation"},
+{"codes":[6],"description":"Total precipitation during the 2 hours preceding the observation"},
+{"codes":[7],"description":"Total precipitation during the 3 hours preceding the observation"},
+{"codes":[8],"description":"Total precipitation during the 9 hours preceding the observation"},
+{"codes":[9],"description":"Total precipitation during the 15 hours preceding the observation"}
+]
diff --git a/schemas/lib/imma.old/code_tables/icoads_3_0.vi b/schemas/lib/imma.old/code_tables/icoads_3_0.vi
new file mode 100644
index 0000000000000000000000000000000000000000..27cb65655e00060fd9f5a7be4406d36dda8c4252
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/icoads_3_0.vi
@@ -0,0 +1,5 @@
+[
+{"codes":[0],"description":"estimated (or unknown method of observation)"},
+{"codes":[1],"description":"measured"},
+{"codes":[2],"description":"fog present (obsolete)"}
+]
diff --git a/schemas/lib/imma.old/code_tables/icoads_3_0.vs b/schemas/lib/imma.old/code_tables/icoads_3_0.vs
new file mode 100644
index 0000000000000000000000000000000000000000..3dff050300a9b585246701c9e2d1399ffba37df0
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/icoads_3_0.vs
@@ -0,0 +1,22 @@
+[
+{"codes":[0],"description":"0 knots, < 1968-01-01","aux_info":{"speed lower (ms-1)":0.0,"speed mid (ms-1)":0.0,"speed upper (ms-1)":0.0}},
+{"codes":[1],"description":"1-3 knots, < 1968-01-01","aux_info":{"speed lower (ms-1)":0.51444,"speed mid (ms-1)":1.02888,"speed upper (ms-1)":1.54332}},
+{"codes":[2],"description":"4-6 knots , < 1968-01-01","aux_info":{"speed lower (ms-1)":2.05776,"speed mid (ms-1)":2.5722,"speed upper (ms-1)":3.08664}},
+{"codes":[3],"description":"7-9 knots, < 1968-01-01","aux_info":{"speed lower (ms-1)":3.60108,"speed mid (ms-1)":4.11552,"speed upper (ms-1)":4.62996}},
+{"codes":[4],"description":"10-12 knots, < 1968-01-01","aux_info":{"speed lower (ms-1)":5.1444,"speed mid (ms-1)":5.65884,"speed upper (ms-1)":6.17328}},
+{"codes":[5],"description":"13-15 knots, < 1968-01-01","aux_info":{"speed lower (ms-1)":6.68772,"speed mid (ms-1)":7.20216,"speed upper (ms-1)":7.7166}},
+{"codes":[6],"description":"16-18 knots, < 1968-01-01","aux_info":{"speed lower (ms-1)":8.23104,"speed mid (ms-1)":8.74548,"speed upper (ms-1)":9.25992}},
+{"codes":[7],"description":"19-21 knots, < 1968-01-01","aux_info":{"speed lower (ms-1)":9.77436,"speed mid (ms-1)":10.2888,"speed upper (ms-1)":10.8032}},
+{"codes":[8],"description":"22-24 knots, < 1968-01-01","aux_info":{"speed lower (ms-1)":11.3177,"speed mid (ms-1)":11.8321,"speed upper (ms-1)":12.3466}},
+{"codes":[9],"description":"over 24 knots, < 1968-01-01","aux_info":{"speed lower (ms-1)":12.3466,"speed mid (ms-1)":12.861,"speed upper (ms-1)":null}},
+{"codes":[10],"description":"0 knots, > 1968-01-01","aux_info":{"speed lower (ms-1)":0.0,"speed mid (ms-1)":0.0,"speed upper (ms-1)":0.0}},
+{"codes":[11],"description":"1-5 knots, > 1968-01-01","aux_info":{"speed lower (ms-1)":0.51444,"speed mid (ms-1)":1.54332,"speed upper (ms-1)":2.5722}},
+{"codes":[12],"description":"6-10 knots, > 1968-01-01","aux_info":{"speed lower (ms-1)":3.08664,"speed mid (ms-1)":4.11552,"speed upper (ms-1)":5.1444}},
+{"codes":[13],"description":"11-15 knots, > 1968-01-01","aux_info":{"speed lower (ms-1)":5.65884,"speed mid (ms-1)":6.68772,"speed upper (ms-1)":7.7166}},
+{"codes":[14],"description":"16-20 knots, > 1968-01-01","aux_info":{"speed lower (ms-1)":8.23104,"speed mid (ms-1)":9.25992,"speed upper (ms-1)":10.2888}},
+{"codes":[15],"description":"21-25 knots, > 1968-01-01","aux_info":{"speed lower (ms-1)":10.8032,"speed mid (ms-1)":11.8321,"speed upper (ms-1)":12.861}},
+{"codes":[16],"description":"26-30 knots, > 1968-01-01","aux_info":{"speed lower (ms-1)":13.3754,"speed mid (ms-1)":14.4043,"speed upper (ms-1)":15.4332}},
+{"codes":[17],"description":"31-35 knots, > 1968-01-01","aux_info":{"speed lower (ms-1)":15.9476,"speed mid (ms-1)":16.9765,"speed upper (ms-1)":18.0054}},
+{"codes":[18],"description":"36-40 knots, > 1968-01-01","aux_info":{"speed lower (ms-1)":18.5198,"speed mid (ms-1)":19.5487,"speed upper (ms-1)":20.5776}},
+{"codes":[19],"description":"over 40 knots, > 1968-01-01","aux_info":{"speed lower (ms-1)":21.092,"speed mid (ms-1)":22.1209,"speed upper (ms-1)":null}}
+]
diff --git a/schemas/lib/imma.old/code_tables/icoads_3_0.wmi b/schemas/lib/imma.old/code_tables/icoads_3_0.wmi
new file mode 100644
index 0000000000000000000000000000000000000000..60d04340fe824daa4cc7b8a8f76d8ad949e38e76
--- /dev/null
+++ b/schemas/lib/imma.old/code_tables/icoads_3_0.wmi
@@ -0,0 +1,12 @@
+[
+{"codes":[0],"description":"wind sea and swell estimated shipborne wave recorder"},
+{"codes":[1],"description":"wind sea and swell measured shipborne wave recorder"},
+{"codes":[2],"description":"mixed wave measured, swell estimated shipborne wave recorder"},
+{"codes":[3],"description":"other combinations measured and estimated shipborne wave recorder"},
+{"codes":[4],"description":"wind sea and swell measured buoy"},
+{"codes":[5],"description":"mixed wave measured, swell estimated buoy"},
+{"codes":[6],"description":"other combinations measured and estimated buoy"},
+{"codes":[7],"description":"wind sea and swell measured other measurement system"},
+{"codes":[8],"description":"mixed wave measured, swell estimated other measurement system"},
+{"codes":[9],"description":"other combinations measured and estimated other measurement system"}
+]
diff --git a/schemas/lib/imma.old/imma1.json b/schemas/lib/imma.old/imma1.json
new file mode 100644
index 0000000000000000000000000000000000000000..795203dfcdc95c7f49271b31030bfba758caf467
--- /dev/null
+++ b/schemas/lib/imma.old/imma1.json
@@ -0,0 +1,2240 @@
+{
+    "header": {
+        "format": "fixed_width",
+        "parsing_order": [{"s": ["core"]},{"o": ["c1","c5","c6","c7","c8","c9","c95","c96","c97","c98","c99"]}],
+        "date_parser": {"section": "core","elements": ["YR","MO",  "DY"],"format": ["%Y","%m","%d"]}
+    },
+    "sections": {
+        "core": {
+            "header": {"sentinal": null,"sentinal_length": null,"length": 108},
+            "elements": {
+                "YR": {
+                    "description": "year UTC",
+                    "field_length": 4,
+                    "column_type": "uint16",
+                    "valid_max": 2024,
+                    "valid_min": 1600,
+                    "units": "year"
+                },
+                "MO": {
+                    "description": "month UTC",
+                    "field_length": 2,
+                    "column_type": "uint8",
+                    "valid_max": 12,
+                    "valid_min": 1,
+                    "units": "month"
+                },
+                "DY": {
+                    "description": "day UTC",
+                    "field_length": 2,
+                    "column_type": "uint8",
+                    "valid_max": 31,
+                    "valid_min": 1,
+                    "units": "day"
+                },
+                "HR": {
+                    "description": "hour UTC",
+                    "field_length": 4,
+                    "column_type": "float32",
+                    "valid_max": 23.99,
+                    "valid_min": 0.0,
+                    "scale": 0.01,
+                    "decimal_places": 2,
+                    "units": "hour"
+                },
+                "LAT": {
+                    "description": "latitude",
+                    "field_length": 5,
+                    "column_type": "float32",
+                    "valid_max": 90.0,
+                    "valid_min": -90.0,
+                    "scale": 0.01,
+                    "decimal_places": 2,
+                    "units": "degrees"
+                },
+                "LON": {
+                    "description": "longitude, check/ask two conventions in imma1 doc",
+                    "field_length": 6,
+                    "column_type": "float32",
+                    "valid_max": 359.99,
+                    "valid_min": 0.0,
+                    "scale": 0.01,
+                    "decimal_places": 2,
+                    "units": "degrees"
+                },
+                "IM": {
+                    "description": "IMMA version",
+                    "field_length": 2,
+                    "column_type": "key",
+                    "codetable": "ICOADS.C0.IM"
+                },
+                "ATTC": {
+                    "description": "attm count",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "encoding": "base36",
+                    "valid_max": 35,
+                    "valid_min": 0
+                },
+                "TI": {
+                    "description": "time indicator",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "codetable": "ICOADS.C0.TI"
+                },
+                "LI": {
+                    "description": "lat/lon indicator",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "codetable": "ICOADS.C0.LI"
+                },
+                "DS": {
+                    "description": "ship course",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "codetable": "ICOADS.C0.DS"
+                },
+                "VS": {
+                    "description": "ship speed",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "codetable": "ICOADS.C0.VS"
+                },
+                "NID": {
+                    "description": "national source indic.",
+                    "field_length": 2,
+                    "column_type": "str"
+                },
+                "II": {
+                    "description": "ID indicator",
+                    "field_length": 2,
+                    "column_type": "key",
+                    "codetable": "ICOADS.C0.II"
+                },
+                "ID": {
+                    "description": "identification/callsign",
+                    "field_length": 9,
+                    "column_type": "str"
+                },
+                "C1": {
+                    "description": "country code",
+                    "field_length": 2,
+                    "column_type": "key",
+                    "codetable": "ICOADS.C0.C1"
+                },
+                "DI": {
+                    "description": "wind direction indic.",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "codetable": "ICOADS.C0.DI"
+                },
+                "D": {
+                    "description": "wind direction (true)",
+                    "field_length": 3,
+                    "column_type": "int16",
+                    "valid_max": 362,
+                    "valid_min": 1,
+                    "units": "degrees true"
+                },
+                "WI": {
+                    "description": "wind speed indic.",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "codetable": "ICOADS.C0.WI"
+                },
+                "W": {
+                    "description": "wind speed",
+                    "field_length": 3,
+                    "column_type": "float32",
+                    "valid_max": 99.9,
+                    "valid_min": 0.0,
+                    "scale": 0.1,
+                    "decimal_places": 1,
+                    "units": "metres per second"
+                },
+                "VI": {
+                    "description": "visibility indic. ICOADS.C0.VI not found in new set",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "codetable": "ICOADS.C0.VI"
+                },
+                "VV": {
+                    "description": "visibility",
+                    "field_length": 2,
+                    "column_type": "key",
+                    "codetable": "ICOADS.C0.VV"
+                },
+                "WW": {
+                    "description": "present weather",
+                    "field_length": 2,
+                    "column_type": "key",
+                    "codetable": "ICOADS.C0.WW"
+                },
+                "W1": {
+                    "description": "past weather",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "codetable": "ICOADS.C0.W1"
+                },
+                "SLP": {
+                    "description": "sea level pressure",
+                    "field_length": 5,
+                    "column_type": "float32",
+                    "valid_max": 1074.6,
+                    "valid_min": 870.0,
+                    "scale": 0.1,
+                    "decimal_places": 1,
+                    "units": "hectopascal"
+                },
+                "A": {
+                    "description": "characteristic of PPP",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "codetable": "ICOADS.C0.A"
+                },
+                "PPP": {
+                    "description": "amt. pressure tend.",
+                    "field_length": 3,
+                    "column_type": "float32",
+                    "valid_max": 51.0,
+                    "valid_min": 0.0,
+                    "scale": 0.1,
+                    "decimal_places": 1,
+                    "units": "hectopascal"
+                },
+                "IT": {
+                    "description": "indic. for temperatures",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "codetable": "ICOADS.C0.IT"
+                },
+                "AT": {
+                    "description": "air temperature",
+                    "field_length": 4,
+                    "column_type": "float32",
+                    "valid_max": 99.9,
+                    "valid_min": -99.9,
+                    "scale": 0.1,
+                    "decimal_places": 1,
+                    "units": "degree Celsius"
+                },
+                "WBTI": {
+                    "description": "wet bulb temp. indic.",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "codetable": "ICOADS.C0.WBTI"
+                },
+                "WBT": {
+                    "description": "wet-bulb temperature",
+                    "field_length": 4,
+                    "column_type": "float32",
+                    "valid_max": 99.9,
+                    "valid_min": -99.9,
+                    "scale": 0.1,
+                    "decimal_places": 1,
+                    "units": "degree Celsius"
+                },
+                "DPTI": {
+                    "description": "dew-point temp. indic.",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "codetable": "ICOADS.C0.DPTI"
+                },
+                "DPT": {
+                    "description": "dew-point temperature",
+                    "field_length": 4,
+                    "column_type": "float32",
+                    "valid_max": 99.9,
+                    "valid_min": -99.9,
+                    "scale": 0.1,
+                    "decimal_places": 1,
+                    "units": "degree Celsius"
+                },
+                "SI": {
+                    "description": "SST measurement method, table not like original, nor like in doc",
+                    "field_length": 2,
+                    "column_type": "key",
+                    "codetable": "ICOADS.C0.SI"
+                },
+                "SST": {
+                    "description": "sea surface temperature",
+                    "field_length": 4,
+                    "column_type": "float32",
+                    "valid_max": 99.9,
+                    "valid_min": -99.9,
+                    "scale": 0.1,
+                    "decimal_places": 1,
+                    "units": "degree Celsius"
+                },
+                "N": {
+                    "description": "total cloud amount",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "valid_max": 9,
+                    "valid_min": 0,
+                    "units": "okta"
+                },
+                "NH": {
+                    "description": "lower cloud amount",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "valid_max": 9,
+                    "valid_min": 0,
+                    "units": "eighths of cloud"
+                },
+                "CL": {
+                    "description": "low cloud type",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "encoding": "base36",
+                    "codetable": "ICOADS.C0.CL"
+                },
+                "HI": {
+                    "description": "cloud height indic.",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "codetable": "ICOADS.C0.HI"
+                },
+                "H": {
+                    "description": "cloud height",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "encoding": "base36",
+                    "codetable": "ICOADS.C0.H"
+                },
+                "CM": {
+                    "description": "middle cloud type",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "encoding": "base36",
+                    "codetable": "ICOADS.C0.CM"
+                },
+                "CH": {
+                    "description": "high cloud type",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "encoding": "base36",
+                    "codetable": "ICOADS.C0.CH"
+                },
+                "WD": {
+                    "description": "wave direction",
+                    "field_length": 2,
+                    "column_type": "key",
+                    "codetable": "ICOADS.C0.WD"
+                },
+                "WP": {
+                    "description": "wave period",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "valid_max": 99,
+                    "valid_min": 0,
+                    "units": "second"
+                },
+                "WH": {
+                    "description": "wave height",
+                    "field_length": 2,
+                    "column_type": "float32",
+                    "valid_max": 99.0,
+                    "valid_min": 0.0,
+                    "scale": 0.5,
+                    "decimal_places": 1,
+                    "units": "metre"
+                },
+                "SD": {
+                    "description": "swell direction",
+                    "field_length": 2,
+                    "column_type": "key",
+                    "codetable": "ICOADS.C0.SD"
+                },
+                "SP": {
+                    "description": "swell period",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "valid_max": 99,
+                    "valid_min": 0,
+                    "units": "second"
+                },
+                "SH": {
+                    "description": "swell height",
+                    "field_length": 2,
+                    "column_type": "float32",
+                    "valid_max": 99.0,
+                    "valid_min": 0.0,
+                    "scale": 0.5,
+                    "decimal_places": 1,
+                    "units": "metre"
+                }
+            }
+        },
+        "c1": {
+            "header": {"sentinal": " 165","sentinal_length": 4, "length": 65},
+            "elements": {
+                "ATTI": {
+                    "description": "attm ID",
+                    "field_length": 2,
+                    "column_type": "str"
+                },
+                "ATTL": {
+                    "description": "attm length",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "valid_max": 65,
+                    "valid_min": 65
+                },
+                "BSI": {
+                    "description": "box system indicator. Currently not in use",
+                    "field_length": 1,
+                    "column_type": "int8"
+                },
+                "B10": {
+                    "description": "10 degree box number",
+                    "field_length": 3,
+                    "column_type": "int16",
+                    "valid_max": 648,
+                    "valid_min": 1
+                },
+                "B1": {
+                    "description": "1 degree box number",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "valid_max": 99,
+                    "valid_min": 0
+                },
+                "DCK": {
+                    "description": "deck",
+                    "field_length": 3,
+                    "column_type": "key",
+                    "codetable": "ICOADS.C1.DCK"
+                },
+                "SID": {
+                    "description": "source ID",
+                    "field_length": 3,
+                    "column_type": "key",
+                    "codetable": "ICOADS.C1.SID"
+                },
+                "PT": {
+                    "description": "platform type",
+                    "field_length": 2,
+                    "column_type": "key",
+                    "codetable": "ICOADS.C1.PT"
+                },
+                "DUPS": {
+                    "description": "dup status",
+                    "field_length": 2,
+                    "column_type": "key",
+                    "codetable": "ICOADS.C1.DUPS"
+                },
+                "DUPC": {
+                    "description": "dup check",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "codetable": "ICOADS.C1.DUPC"
+                },
+                "TC": {
+                    "description": "track check",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "codetable": "ICOADS.C1.TC"
+                },
+                "PB": {
+                    "description": "pressure bias",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "codetable": "ICOADS.C1.PB"
+                },
+                "WX": {
+                    "description": "wave period indicator",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "codetable": "ICOADS.C1.WX"
+                },
+                "SX": {
+                    "description": "swell period indicator",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "codetable": "ICOADS.C1.WX"
+                },
+                "C2": {
+                    "description": "2nd country code",
+                    "field_length": 2,
+                    "column_type": "key",
+                    "codetable": "ICOADS.C0.C1"
+                },
+                "SQZ": {
+                    "description": "SST: z flag",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "encoding": "base36",
+                    "valid_max": 35,
+                    "valid_min": 1
+                },
+                "SQA": {
+                    "description": "SST: alpha flag",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "encoding": "base36",
+                    "valid_max": 21,
+                    "valid_min": 1
+                },
+                "AQZ": {
+                    "description": "AT: z flag",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "encoding": "base36"
+                },
+                "AQA": {
+                    "description": "AT: alpha flag",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "encoding": "base36"
+                },
+                "UQZ": {
+                    "description": "U-wind: z flag",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "encoding": "base36"
+                },
+                "UQA": {
+                    "description": "U-wind: alpha flag",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "encoding": "base36"
+                },
+                "VQZ": {
+                    "description": "V-wind: z flag",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "encoding": "base36"
+                },
+                "VQA": {
+                    "description": "V-wind: alpha flag",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "encoding": "base36"
+                },
+                "PQZ": {
+                    "description": "SLP: z flag",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "encoding": "base36"
+                },
+                "PQA": {
+                    "description": "SLP: alpha flag",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "encoding": "base36"
+                },
+                "DQZ": {
+                    "description": "Humidity: z flag",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "encoding": "base36"
+                },
+                "DQA": {
+                    "description": "Humidity: alpha flag",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "encoding": "base36"
+                },
+                "ND": {
+                    "description": "night / day flag",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "codetable": "ICOADS.C1.ND"
+                },
+                "SF": {
+                    "description": "SST flag",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "encoding": "base36",
+                    "codetable": "ICOADS.C1.TRIM"
+                },
+                "AF": {
+                    "description": "AT flag",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "encoding": "base36",
+                    "codetable": "ICOADS.C1.TRIM"
+                },
+                "UF": {
+                    "description": "U-wind flag",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "encoding": "base36",
+                    "codetable": "ICOADS.C1.TRIM"
+                },
+                "VF": {
+                    "description": "V-wind flag",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "encoding": "base36",
+                    "codetable": "ICOADS.C1.TRIM"
+                },
+                "PF": {
+                    "description": "SLP flag",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "encoding": "base36",
+                    "codetable": "ICOADS.C1.TRIM"
+                },
+                "RF": {
+                    "description": "RH (and WBT / DPT) flag",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "encoding": "base36",
+                    "codetable": "ICOADS.C1.TRIM"
+                },
+                "ZNC": {
+                    "description": "report-status flag (ship position)",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "encoding": "base36",
+                    "codetable": "ICOADS.C1.NCDC"
+                },
+                "WNC": {
+                    "description": "wind flag",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "encoding": "base36",
+                    "codetable": "ICOADS.C1.NCDC"
+                },
+                "BNC": {
+                    "description": "visibility (VV) flag",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "encoding": "base36",
+                    "codetable": "ICOADS.C1.NCDC"
+                },
+                "XNC": {
+                    "description": "present weather (WW) flag",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "encoding": "base36",
+                    "codetable": "ICOADS.C1.NCDC"
+                },
+                "YNC": {
+                    "description": "past weather (W1) flag",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "encoding": "base36",
+                    "codetable": "ICOADS.C1.NCDC"
+                },
+                "PNC": {
+                    "description": "SLP flag",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "encoding": "base36",
+                    "codetable": "ICOADS.C1.NCDC"
+                },
+                "ANC": {
+                    "description": "AT flag",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "encoding": "base36",
+                    "codetable": "ICOADS.C1.NCDC"
+                },
+                "GNC": {
+                    "description": "WBT flag",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "encoding": "base36",
+                    "codetable": "ICOADS.C1.NCDC"
+                },
+                "DNC": {
+                    "description": "DPT flag",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "encoding": "base36",
+                    "codetable": "ICOADS.C1.NCDC"
+                },
+                "SNC": {
+                    "description": "SST flag",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "encoding": "base36",
+                    "codetable": "ICOADS.C1.NCDC"
+                },
+                "CNC": {
+                    "description": "cloud flag",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "encoding": "base36",
+                    "codetable": "ICOADS.C1.NCDC"
+                },
+                "ENC": {
+                    "description": "wave flag",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "encoding": "base36",
+                    "codetable": "ICOADS.C1.NCDC"
+                },
+                "FNC": {
+                    "description": "swell flag",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "encoding": "base36",
+                    "codetable": "ICOADS.C1.NCDC"
+                },
+                "TNC": {
+                    "description": "pressure tendency (A and PPP) flag",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "encoding": "base36",
+                    "codetable": "ICOADS.C1.NCDC"
+                },
+                "QCE": {
+                    "description": "external (e.g. OSD)",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "valid_max": 63,
+                    "valid_min": 0
+                },
+                "LZ": {
+                    "description": "2x2 landlocked flag",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "codetable": "ICOADS.C1.LZ"
+                },
+                "QCZ": {
+                    "description": "source exclusion flags",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "valid_max": 31,
+                    "valid_min": 0
+                }
+            }
+        },
+        "c5": {
+            "header": {
+                "sentinal": " 594",
+                "sentinal_length": 4,
+                "length": 94
+            },
+            "elements": {
+                "ATTI": {
+                    "description": "attm ID",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "ignore": true
+                },
+                "ATTL": {
+                    "description": "attm length",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "ignore": true
+                },
+                "OS": {
+                    "description": "observation source",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.os"
+                },
+                "OP": {
+                    "description": "observation platform",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.op"
+                },
+                "FM": {
+                    "description": "FM code version",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "encoding": "base36",
+                    "codetable": "icoads_3_0.fm"
+                },
+                "IMMV": {
+                    "description": "IMMT version",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "encoding": "base36",
+                    "codetable": "icoads_3_0.immv"
+                },
+                "IX": {
+                    "description": "station / weather indic.",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.ix"
+                },
+                "W2": {
+                    "description": "2nd past weather",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.pastWeather"
+                },
+                "WMI": {
+                    "description": "indicicator for wave measurement",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.wmi"
+                },
+                "SD2": {
+                    "description": "direction of secondary swell",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "codetable": "ICOADS.C5.SD2"
+                },
+                "SP2": {
+                    "description": "period of secondary swell",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "codetable": "ICOADS.C5.SP2"
+                },
+                "SH2": {
+                    "description": "height of secondary swell",
+                    "field_length": 2,
+                    "column_type": "float16",
+                    "valid_max": 99.0,
+                    "valid_min": 0.0,
+                    "scale": 0.5,
+                    "precision": "0.1"
+                },
+                "IS": {
+                    "description": "ice accretion on ship",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.is"
+                },
+                "ES": {
+                    "description": "thickness of ice accretion",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "valid_max": 99,
+                    "valid_min": 0
+                },
+                "RS": {
+                    "description": "rate of ice accretion",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.rs"
+                },
+                "IC1": {
+                    "description": "concentration of sea ice",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "encoding": "base36",
+                    "codetable": "ICOADS.C5.IC1"
+                },
+                "IC2": {
+                    "description": "stage of development",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "encoding": "base36",
+                    "codetable": "ICOADS.C5.IC2"
+                },
+                "IC3": {
+                    "description": "ice of land origin",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "encoding": "base36",
+                    "codetable": "ICOADS.C5.IC3"
+                },
+                "IC4": {
+                    "description": "true bearing of ice edge",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "encoding": "base36",
+                    "codetable": "ICOADS.C5.IC4"
+                },
+                "IC5": {
+                    "description": "ice situation / trend",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "encoding": "base36",
+                    "codetable": "ICOADS.C5.IC5"
+                },
+                "IR": {
+                    "description": "indicator for precipation data",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "ICOADS.C5.IR"
+                },
+                "RRR": {
+                    "description": "amount of precipitation",
+                    "field_length": 3,
+                    "column_type": "int16",
+                    "codetable": "ICOADS.C5.RRR"
+                },
+                "TR": {
+                    "description": "duration of period of reference for amount of precipitation",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.tr"
+                },
+                "NU": {
+                    "description": "national use",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "ICOADS.C5.NU"
+                },
+                "QCI": {
+                    "description": "quality control indicator",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.MQCIndicatorGeneral"
+                },
+                "QI1": {
+                    "description": "QC indicator for height of clouds",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.MQCIndicator"
+                },
+                "QI2": {
+                    "description": "QC indicator for visibility",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.MQCIndicator"
+                },
+                "QI3": {
+                    "description": "QC indicator for clouds",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.MQCIndicator"
+                },
+                "QI4": {
+                    "description": "QC indicator for wind direction",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.MQCIndicator"
+                },
+                "QI5": {
+                    "description": "QC indicator for wind speed",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.MQCIndicator"
+                },
+                "QI6": {
+                    "description": "QC indicator for air temperature",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.MQCIndicator"
+                },
+                "QI7": {
+                    "description": "QC indicator for dew-point temperature",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.MQCIndicator"
+                },
+                "QI8": {
+                    "description": "QC indicator for air pressure",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.MQCIndicator"
+                },
+                "QI9": {
+                    "description": "QC indicator for weather",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.MQCIndicator"
+                },
+                "QI10": {
+                    "description": "QC indicator for sea surface temperature",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.MQCIndicator"
+                },
+                "QI11": {
+                    "description": "QC indicator for period of wind waves of of measured waves",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.MQCIndicator"
+                },
+                "QI12": {
+                    "description": "QC indicator for height of wind waves of of measured waves",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.MQCIndicator"
+                },
+                "QI13": {
+                    "description": "QC indicator for swell",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.MQCIndicator"
+                },
+                "QI14": {
+                    "description": "QC indicator for precipitation",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.MQCIndicator"
+                },
+                "QI15": {
+                    "description": "QC indicator for characteristic of pressure tendency",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.MQCIndicator"
+                },
+                "QI16": {
+                    "description": "QC indicator for amount of pressure tendency",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.MQCIndicator"
+                },
+                "QI17": {
+                    "description": "QC indicator for true direction of ship",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.MQCIndicator"
+                },
+                "QI18": {
+                    "description": "QC indicator for ship's average speed",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.MQCIndicator"
+                },
+                "QI19": {
+                    "description": "QC indicator for wet-bulb temperature",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.MQCIndicator"
+                },
+                "QI20": {
+                    "description": "QC indicator for ship's position",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.MQCIndicator"
+                },
+                "QI21": {
+                    "description": "MQCS version",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.MQCversion"
+                },
+                "HDG": {
+                    "description": "ships's heading",
+                    "field_length": 3,
+                    "column_type": "int16",
+                    "valid_max": 360,
+                    "valid_min": 0
+                },
+                "COG": {
+                    "description": "course over ground",
+                    "field_length": 3,
+                    "column_type": "int16",
+                    "valid_max": 360,
+                    "valid_min": 0
+                },
+                "SOG": {
+                    "description": "speed over ground",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "valid_max": 99,
+                    "valid_min": 0
+                },
+                "SLL": {
+                    "description": "max height of cargo above summer load line",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "valid_max": 99,
+                    "valid_min": 0
+                },
+                "SLHH": {
+                    "description": "departure of summer max load line from sea level",
+                    "field_length": 3,
+                    "column_type": "int8",
+                    "valid_max": 99,
+                    "valid_min": -99
+                },
+                "RWD": {
+                    "description": "relative wind direction",
+                    "field_length": 3,
+                    "column_type": "int16",
+                    "valid_max": 360,
+                    "valid_min": 1
+                },
+                "RWS": {
+                    "description": "relative wind speed",
+                    "field_length": 3,
+                    "column_type": "float32",
+                    "valid_max": 99.9,
+                    "valid_min": 0.0,
+                    "scale": 0.1,
+                    "precision": "0.1"
+                },
+                "QI22": {
+                    "description": "QC indicator for ship's heading",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.MQCIndicator"
+                },
+                "QI23": {
+                    "description": "QC indicator for course over ground",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.MQCIndicator"
+                },
+                "QI24": {
+                    "description": "QC indicator for speed over ground",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.MQCIndicator"
+                },
+                "QI25": {
+                    "description": "QC indicator for SLL",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.MQCIndicator"
+                },
+                "QI26": {
+                    "description": "see doc",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.MQCIndicator"
+                },
+                "QI27": {
+                    "description": "QC indicator for SLHH",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.MQCIndicator"
+                },
+                "QI28": {
+                    "description": "QC indicator for relative wind direction",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.MQCIndicator"
+                },
+                "QI29": {
+                    "description": "QC indicator for relative wind speed",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.MQCIndicator"
+                },
+                "RH": {
+                    "description": "relative humidity",
+                    "field_length": 4,
+                    "column_type": "float32",
+                    "valid_max": 100.0,
+                    "valid_min": 0.0,
+                    "scale": 0.1,
+                    "precision": "0.1"
+                },
+                "RHI": {
+                    "description": "relative humidity indicator",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.rhi"
+                },
+                "AWSI": {
+                    "description": "AWS indicator",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.awsi"
+                },
+                "IMONO": {
+                    "description": "IMO number",
+                    "field_length": 7,
+                    "column_type": "int32",
+                    "valid_max": 9999999.0,
+                    "valid_min": 0.0,
+                    "scale": 1
+                }
+            }
+        },
+        "c6": {
+            "header": {
+                "sentinal": " 668",
+                "sentinal_length": 4,
+                "length": 68
+            },
+            "elements": {
+                "ATTI": {
+                    "description": "attm ID",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "ignore": true
+                },
+                "ATTL": {
+                    "description": "attm length",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "ignore": true
+                },
+                "CCCC": {
+                    "description": "collecting center",
+                    "field_length": 4,
+                    "column_type": "str",
+                    "codetable": "ICOADS.C6.CCCC"
+                },
+                "BUID": {
+                    "description": "bulletin ID",
+                    "field_length": 6,
+                    "column_type": "str",
+                    "codetable": "ICOADS.C6.BUID"
+                },
+                "FBSRC": {
+                    "description": "feedback source",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "ICOADS.C6.FBSRC"
+                },
+                "BMP": {
+                    "description": "background SLP",
+                    "field_length": 5,
+                    "column_type": "float32",
+                    "valid_max": 1074.6,
+                    "valid_min": 870.0,
+                    "scale": 0.1,
+                    "precision": "0.1"
+                },
+                "BSWU": {
+                    "description": "background wind U-component",
+                    "field_length": 4,
+                    "column_type": "float32",
+                    "valid_max": 99.9,
+                    "valid_min": -99.9,
+                    "scale": 0.1,
+                    "precision": "0.1"
+                },
+                "SWU": {
+                    "description": "derived wind U-component",
+                    "field_length": 4,
+                    "column_type": "float32",
+                    "valid_max": 99.9,
+                    "valid_min": -99.9,
+                    "scale": 0.1,
+                    "precision": "0.1"
+                },
+                "BSWV": {
+                    "description": "background wind V-component",
+                    "field_length": 4,
+                    "column_type": "float32",
+                    "valid_max": 99.9,
+                    "valid_min": -99.9,
+                    "scale": 0.1,
+                    "precision": "0.1"
+                },
+                "SWV": {
+                    "description": "derived wind V-component",
+                    "field_length": 4,
+                    "column_type": "float32",
+                    "valid_max": 99.9,
+                    "valid_min": -99.9,
+                    "scale": 0.1,
+                    "precision": "0.1"
+                },
+                "BSAT": {
+                    "description": "background air temperature",
+                    "field_length": 4,
+                    "column_type": "float32",
+                    "valid_max": 99.9,
+                    "valid_min": -99.9,
+                    "scale": 0.1,
+                    "precision": "0.1"
+                },
+                "BSRH": {
+                    "description": "background relative humidity",
+                    "field_length": 3,
+                    "column_type": "float32",
+                    "valid_max": 100.0,
+                    "valid_min": 0.0,
+                    "scale": 1.0,
+                    "precision": "1"
+                },
+                "SRH": {
+                    "description": "derived relative humidity",
+                    "field_length": 3,
+                    "column_type": "float32",
+                    "valid_max": 100.0,
+                    "valid_min": 0.0,
+                    "scale": 1.0,
+                    "precision": "1"
+                },
+                "BSST": {
+                    "description": "background SST",
+                    "field_length": 5,
+                    "column_type": "float32",
+                    "valid_max": 99.99,
+                    "valid_min": -99.99,
+                    "scale": 0.01,
+                    "precision": "0.01"
+                },
+                "MST": {
+                    "description": "model surface type",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "ICOADS.C6.ST"
+                },
+                "BMSH": {
+                    "description": "model height of surface",
+                    "field_length": 4,
+                    "column_type": "int16",
+                    "valid_max": 9999,
+                    "valid_min": -999
+                },
+                "BY": {
+                    "description": "background year",
+                    "field_length": 4,
+                    "column_type": "int16",
+                    "valid_max": 9999,
+                    "valid_min": 0
+                },
+                "BM": {
+                    "description": "background month",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "valid_max": 12,
+                    "valid_min": 1
+                },
+                "BD": {
+                    "description": "background day",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "valid_max": 31,
+                    "valid_min": 1
+                },
+                "BH": {
+                    "description": "background hour",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "valid_max": 23,
+                    "valid_min": 0
+                },
+                "BFL": {
+                    "description": "background forecast length",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "valid_max": 99,
+                    "valid_min": 0
+                }
+            }
+        },
+        "c7": {
+            "header": {
+                "sentinal": " 758",
+                "sentinal_length": 4,
+                "length": 58
+            },
+            "elements": {
+                "ATTI": {
+                    "description": "attm ID",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "ignore": true
+                },
+                "ATTL": {
+                    "description": "attm length",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "ignore": true
+                },
+                "MDS": {
+                    "description": "metadata source",
+                    "field_length": 1,
+                    "column_type": "str",
+                    "valid_max": 1.0,
+                    "valid_min": 0.0,
+                    "scale": 1.0,
+                    "precision": null,
+                    "codetable": null
+                },
+                "C1M": {
+                    "description": "recruiting country",
+                    "field_length": 2,
+                    "column_type": "str",
+                    "codetable": "icoads_3_0.country"
+                },
+                "OPM": {
+                    "description": "type of ship (program)",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.opm"
+                },
+                "KOV": {
+                    "description": "kind of vessel",
+                    "field_length": 2,
+                    "column_type": "str",
+                    "codetable": "icoads_3_0.kov"
+                },
+                "COR": {
+                    "description": "country of registry",
+                    "field_length": 2,
+                    "column_type": "str",
+                    "codetable": "icoads_3_0.country"
+                },
+                "TOB": {
+                    "description": "type of barometer",
+                    "field_length": 3,
+                    "column_type": "str",
+                    "codetable": "icoads_3_0.tob"
+                },
+                "TOT": {
+                    "description": "type of thermometer",
+                    "field_length": 3,
+                    "column_type": "str",
+                    "codetable": "icoads_3_0.tot"
+                },
+                "EOT": {
+                    "description": "exposure of thermometer",
+                    "field_length": 2,
+                    "column_type": "str",
+                    "codetable": "ICOADS.C7.EOT"
+                },
+                "LOT": {
+                    "description": "screen location",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.lot"
+                },
+                "TOH": {
+                    "description": "type of hygrometer",
+                    "field_length": 1,
+                    "column_type": "str",
+                    "codetable": "icoads_3_0.toh"
+                },
+                "EOH": {
+                    "description": "exposure of hygrometer",
+                    "field_length": 2,
+                    "column_type": "str",
+                    "codetable": "ICOADS.C7.EOH"
+                },
+                "SIM": {
+                    "description": "SST measurement method",
+                    "field_length": 3,
+                    "column_type": "str",
+                    "codetable": "icoads_3_0.sstMethod_c7"
+                },
+                "LOV": {
+                    "description": "length of vessel",
+                    "field_length": 3,
+                    "column_type": "int16",
+                    "valid_max": 999,
+                    "valid_min": 0
+                },
+                "DOS": {
+                    "description": "depth of SST measurement",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "valid_max": 99,
+                    "valid_min": 0
+                },
+                "HOP": {
+                    "description": "height of visual observing platform",
+                    "field_length": 3,
+                    "column_type": "int16",
+                    "valid_max": 999,
+                    "valid_min": 0
+                },
+                "HOT": {
+                    "description": "height of thermometer",
+                    "field_length": 3,
+                    "column_type": "int16",
+                    "valid_max": 999,
+                    "valid_min": 0
+                },
+                "HOB": {
+                    "description": "height of barometer",
+                    "field_length": 3,
+                    "column_type": "int16",
+                    "valid_max": 999,
+                    "valid_min": 0
+                },
+                "HOA": {
+                    "description": "height of anemometer",
+                    "field_length": 3,
+                    "column_type": "int16",
+                    "valid_max": 999,
+                    "valid_min": 0
+                },
+                "SMF": {
+                    "description": "source metadata file",
+                    "field_length": 5,
+                    "column_type": "int32",
+                    "valid_max": 99999,
+                    "valid_min": 0,
+                    "codetable": "ICOADS.C7.SMF"
+                },
+                "SME": {
+                    "description": "source metadata element",
+                    "field_length": 5,
+                    "column_type": "int32",
+                    "valid_max": 99999.0,
+                    "valid_min": 0.0,
+                    "scale": 1.0,
+                    "precision": null,
+                    "codetable": null
+                },
+                "SMV": {
+                    "description": "source format version",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "valid_max": 99,
+                    "valid_min": 0,
+                    "codetable": "icoads_3_0.smv"
+                }
+            }
+        },
+        "c8": {
+            "header": {
+                "sentinal": " 82U",
+                "sentinal_length": 4,
+                "length": 102
+            },
+            "elements": {
+                "ATTI": {
+                    "description": "attm ID",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "ignore": true
+                },
+                "ATTL": {
+                    "description": "attm length",
+                    "field_length": 2,
+                    "column_type": "int16",
+                    "encoding": "base36",
+                    "ignore": true
+                },
+                "OTV": {
+                    "description": "temperature value",
+                    "field_length": 5,
+                    "column_type": "float32",
+                    "valid_max": 38.999,
+                    "valid_min": -3.0,
+                    "scale": 0.001,
+                    "precision": "0.001"
+                },
+                "OTZ": {
+                    "description": "temperature depth",
+                    "field_length": 4,
+                    "column_type": "float32",
+                    "valid_max": 99.99,
+                    "valid_min": 0.0,
+                    "scale": 0.01,
+                    "precision": "0.01"
+                },
+                "OSV": {
+                    "description": "salinity value",
+                    "field_length": 5,
+                    "column_type": "float32",
+                    "valid_max": 40.999,
+                    "valid_min": 0.0,
+                    "scale": 0.001,
+                    "precision": "0.001"
+                },
+                "OSZ": {
+                    "description": "salinity depth",
+                    "field_length": 4,
+                    "column_type": "float32",
+                    "valid_max": 99.99,
+                    "valid_min": 0.0,
+                    "scale": 0.01,
+                    "precision": "0.01"
+                },
+                "OOV": {
+                    "description": "dissolved oxygen value",
+                    "field_length": 4,
+                    "column_type": "float32",
+                    "valid_max": 12.99,
+                    "valid_min": 0.0,
+                    "scale": 0.01,
+                    "precision": "0.01"
+                },
+                "OOZ": {
+                    "description": "dissolved oxygen depth",
+                    "field_length": 4,
+                    "column_type": "float32",
+                    "valid_max": 99.99,
+                    "valid_min": 0.0,
+                    "scale": 0.01,
+                    "precision": "0.01"
+                },
+                "OPV": {
+                    "description": "phosphate value",
+                    "field_length": 4,
+                    "column_type": "float32",
+                    "valid_max": 30.99,
+                    "valid_min": 0.0,
+                    "scale": 0.01,
+                    "precision": "0.01"
+                },
+                "OPZ": {
+                    "description": "phosphate depth",
+                    "field_length": 4,
+                    "column_type": "float32",
+                    "valid_max": 99.99,
+                    "valid_min": 0.0,
+                    "scale": 0.01,
+                    "precision": "0.01"
+                },
+                "OSIV": {
+                    "description": "silicate value",
+                    "field_length": 5,
+                    "column_type": "float32",
+                    "valid_max": 250.99,
+                    "valid_min": 0.0,
+                    "scale": 0.01,
+                    "precision": "0.01"
+                },
+                "OSIZ": {
+                    "description": "silicate depth",
+                    "field_length": 4,
+                    "column_type": "float32",
+                    "valid_max": 99.99,
+                    "valid_min": 0.0,
+                    "scale": 0.01,
+                    "precision": "0.01"
+                },
+                "ONV": {
+                    "description": "nitrate value",
+                    "field_length": 5,
+                    "column_type": "float32",
+                    "valid_max": 500.99,
+                    "valid_min": 0.0,
+                    "scale": 0.01,
+                    "precision": "0.01"
+                },
+                "ONZ": {
+                    "description": "nitrate depth",
+                    "field_length": 4,
+                    "column_type": "float32",
+                    "valid_max": 99.99,
+                    "valid_min": 0.0,
+                    "scale": 0.01,
+                    "precision": "0.01"
+                },
+                "OPHV": {
+                    "description": "pH value",
+                    "field_length": 3,
+                    "column_type": "float32",
+                    "valid_max": 9.2,
+                    "valid_min": 6.2,
+                    "scale": 0.01,
+                    "precision": "0.01"
+                },
+                "OPHZ": {
+                    "description": "pH depth",
+                    "field_length": 4,
+                    "column_type": "float32",
+                    "valid_max": 99.99,
+                    "valid_min": 0.0,
+                    "scale": 0.01,
+                    "precision": "0.01"
+                },
+                "OCV": {
+                    "description": "total chlorophyll value",
+                    "field_length": 4,
+                    "column_type": "float32",
+                    "valid_max": 50.99,
+                    "valid_min": 0.0,
+                    "scale": 0.01,
+                    "precision": "0.01"
+                },
+                "OCZ": {
+                    "description": "total chlorophyll depth",
+                    "field_length": 4,
+                    "column_type": "float32",
+                    "valid_max": 99.99,
+                    "valid_min": 0.0,
+                    "scale": 0.01,
+                    "precision": "0.01"
+                },
+                "OAV": {
+                    "description": "alkalinity value",
+                    "field_length": 3,
+                    "column_type": "float32",
+                    "valid_max": 3.1,
+                    "valid_min": 0.0,
+                    "scale": 0.01,
+                    "precision": "0.01"
+                },
+                "OAZ": {
+                    "description": "alkalinity depth",
+                    "field_length": 4,
+                    "column_type": "float32",
+                    "valid_max": 99.99,
+                    "valid_min": 0.0,
+                    "scale": 0.01,
+                    "precision": "0.01"
+                },
+                "OPCV": {
+                    "description": "partial pressure of carbon dioxide value",
+                    "field_length": 4,
+                    "column_type": "float32",
+                    "valid_max": 999.0,
+                    "valid_min": 0.0,
+                    "scale": 0.01,
+                    "precision": "0.01"
+                },
+                "OPCZ": {
+                    "description": "partial pressure of carbon dioxide depth",
+                    "field_length": 4,
+                    "column_type": "float32",
+                    "valid_max": 99.99,
+                    "valid_min": 0.0,
+                    "scale": 0.01,
+                    "precision": "0.01"
+                },
+                "ODV": {
+                    "description": "dissolved inorganic carbon value",
+                    "field_length": 2,
+                    "column_type": "float32",
+                    "valid_max": 4.0,
+                    "valid_min": 0.0,
+                    "scale": 0.1,
+                    "precision": "0.1"
+                },
+                "ODZ": {
+                    "description": "dissolved inorganic carbon depth",
+                    "field_length": 4,
+                    "column_type": "float32",
+                    "valid_max": 99.99,
+                    "valid_min": 0.0,
+                    "scale": 0.01,
+                    "precision": "0.01"
+                },
+                "PUID": {
+                    "description": "provider's unique record identification",
+                    "field_length": 10,
+                    "column_type": "object"
+                }
+            }
+        },
+        "c9": {
+            "header": {
+                "sentinal": " 932",
+                "sentinal_length": 4,
+                "length": 32
+            },
+            "elements": {
+                "ATTI": {
+                    "description": "attm ID",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "ignore": true
+                },
+                "ATTL": {
+                    "description": "attm length",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "ignore": true
+                },
+                "CCe": {
+                    "description": "change code",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "encoding": "base36",
+                    "codetable": "ICOADS.C9.CCe"
+                },
+                "WWe": {
+                    "description": "present weather",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.ww"
+                },
+                "Ne": {
+                    "description": "total cloud amount",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "ICOADS.C9.N"
+                },
+                "NHe": {
+                    "description": "lower cloud amount",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "ICOADS.C9.NH"
+                },
+                "He": {
+                    "description": "lower cloud base height",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.h"
+                },
+                "CLe": {
+                    "description": "low cloud type",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.cl"
+                },
+                "CMe": {
+                    "description": "middle cloud type",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.cm"
+                },
+                "CHe": {
+                    "description": "high cloud type",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "icoads_3_0.ch"
+                },
+                "AM": {
+                    "description": "middle cloud amount",
+                    "field_length": 3,
+                    "column_type": "float32",
+                    "valid_max": 8.0,
+                    "valid_min": 0.0,
+                    "scale": 0.01,
+                    "precision": "0.01"
+                },
+                "AH": {
+                    "description": "high cloud amount",
+                    "field_length": 3,
+                    "column_type": "float32",
+                    "valid_max": 8.0,
+                    "valid_min": 0.0,
+                    "scale": 0.01,
+                    "precision": "0.01"
+                },
+                "UM": {
+                    "description": "NOL middle amount",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "valid_max": 8,
+                    "valid_min": 0
+                },
+                "UH": {
+                    "description": "NOL high amount",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "valid_max": 8,
+                    "valid_min": 0
+                },
+                "SBI": {
+                    "description": "sky-brightness indicator",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "ICOADS.C9.SBI"
+                },
+                "SA": {
+                    "description": "solar altitude",
+                    "field_length": 4,
+                    "column_type": "float32",
+                    "valid_max": 90.0,
+                    "valid_min": -90.0,
+                    "scale": 0.1,
+                    "precision": "0.1"
+                },
+                "RI": {
+                    "description": "relative lunar illuminance",
+                    "field_length": 4,
+                    "column_type": "float32",
+                    "valid_max": 1.17,
+                    "valid_min": -1.1,
+                    "scale": 0.01,
+                    "precision": "0.01"
+                }
+            }
+        },
+        "c95": {
+            "header": {
+                "sentinal": "9561",
+                "sentinal_length": 4,
+                "length": 61
+            },
+            "elements": {
+                "ATTI": {
+                    "description": "attm ID",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "ignore": true
+                },
+                "ATTL": {
+                    "description": "attm length",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "ignore": true
+                },
+                "ICNR": {
+                    "description": "input component number",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "valid_max": 99,
+                    "valid_min": 0
+                },
+                "FNR": {
+                    "description": "field number",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "valid_max": 99,
+                    "valid_min": 1
+                },
+                "DPRO": {
+                    "description": "data provider - reanalysis: lead organization",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "codetable": "ICOADS.C95.DPRO"
+                },
+                "DPRP": {
+                    "description": "data provider - reanalysis: project",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "codetable": "ICOADS.C95.DPRP"
+                },
+                "UFR": {
+                    "description": "usage flag - reanalysis",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "ICOADS.C95.UFR"
+                },
+                "MFGR": {
+                    "description": "model-collocated first guess value",
+                    "field_length": 7,
+                    "column_type": "float32",
+                    "valid_max": null,
+                    "valid_min": null,
+                    "scale": 1.0,
+                    "precision": "1"
+                },
+                "MFGSR": {
+                    "description": "model-collocated first guess",
+                    "field_length": 7,
+                    "column_type": "float32",
+                    "valid_max": null,
+                    "valid_min": null,
+                    "scale": 1.0,
+                    "precision": "1"
+                },
+                "MAR": {
+                    "description": "value or repesentative value",
+                    "field_length": 7,
+                    "column_type": "float32",
+                    "valid_max": null,
+                    "valid_min": null,
+                    "scale": 1.0,
+                    "precision": "1"
+                },
+                "MASR": {
+                    "description": "model-collocated analysis spread",
+                    "field_length": 7,
+                    "column_type": "float32",
+                    "valid_max": null,
+                    "valid_min": null,
+                    "scale": 1.0,
+                    "precision": "1"
+                },
+                "BCR": {
+                    "description": "bias corrected value",
+                    "field_length": 7,
+                    "column_type": "float32",
+                    "valid_max": null,
+                    "valid_min": null,
+                    "scale": 1.0,
+                    "precision": "1"
+                },
+                "ARCR": {
+                    "description": "author reference code",
+                    "field_length": 4,
+                    "column_type": "object",
+                    "codetable": "ICOADS.C95.ARCR"
+                },
+                "CDR": {
+                    "description": "creation date",
+                    "field_length": 8,
+                    "column_type": "int32",
+                    "valid_max": null,
+                    "valid_min": 20140101.0
+                },
+                "ASIR": {
+                    "description": "access status indicator",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "ICOADS.C95.ASIR"
+                }
+            }
+        },
+        "c96": {
+            "header": {
+                "sentinal": "9653",
+                "sentinal_length": 4,
+                "length": 53
+            },
+            "elements": {
+                "ATTI": {
+                    "description": "attm ID",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "ignore": true
+                },
+                "ATTL": {
+                    "description": "attm length",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "ignore": true
+                },
+                "ICNI": {
+                    "description": "input component number",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "valid_max": 99,
+                    "valid_min": 1
+                },
+                "FNI": {
+                    "description": "field number",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "valid_max": 99,
+                    "valid_min": 1
+                },
+                "JVAD": {
+                    "description": "scaling factor for VAD",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "encoding": "base36",
+                    "valid_max": 35,
+                    "valid_min": 0
+                },
+                "VAD": {
+                    "description": "value added data",
+                    "field_length": 6,
+                    "column_type": "float32",
+                    "valid_max": null,
+                    "valid_min": null,
+                    "scale": null,
+                    "precision": null,
+                    "codetable": null
+                },
+                "IVAU1": {
+                    "description": "type indicator for VAU1",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "encoding": "base36",
+                    "valid_max": 35,
+                    "valid_min": 1
+                },
+                "JVAU1": {
+                    "description": "scaling factor for VAU1",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "encoding": "base36",
+                    "valid_max": 35,
+                    "valid_min": 0
+                },
+                "VAU1": {
+                    "description": "uncertainty of type IVAU1",
+                    "field_length": 6,
+                    "column_type": "float32",
+                    "valid_max": null,
+                    "valid_min": null,
+                    "scale": null,
+                    "precision": null
+                },
+                "IVAU2": {
+                    "description": "type indicator for VAU2",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "encoding": "base36",
+                    "valid_max": 35,
+                    "valid_min": 0
+                },
+                "JVAU2": {
+                    "description": "scaling factor for VAU2",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "encoding": "base36",
+                    "valid_max": 35,
+                    "valid_min": 0
+                },
+                "VAU2": {
+                    "description": "uncertainty of type IVAU2",
+                    "field_length": 6,
+                    "column_type": "float32",
+                    "valid_max": null,
+                    "valid_min": null,
+                    "scale": null,
+                    "precision": null
+                },
+                "IVAU3": {
+                    "description": "type indicator for VAU3",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "encoding": "base36",
+                    "valid_max": 35,
+                    "valid_min": 0
+                },
+                "JVAU3": {
+                    "description": "scaling factor for VAU3",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "encoding": "base36",
+                    "valid_max": 35,
+                    "valid_min": 0
+                },
+                "VAU3": {
+                    "description": "uncertainty of type IVAU3",
+                    "field_length": 6,
+                    "column_type": "float32",
+                    "valid_max": null,
+                    "valid_min": null,
+                    "scale": null,
+                    "precision": null
+                },
+                "VQC": {
+                    "description": "value added QC flag",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "valid_max": 9,
+                    "valid_min": 1
+                },
+                "ARCI": {
+                    "description": "auther reference code",
+                    "field_length": 4,
+                    "column_type": "object",
+                    "valid_max": null,
+                    "valid_min": null,
+                    "scale": null,
+                    "precision": null,
+                    "codetable": null
+                },
+                "CDI": {
+                    "description": "creation date",
+                    "field_length": 8,
+                    "column_type": "int32",
+                    "valid_max": null,
+                    "valid_min": 20140101.0
+                },
+                "ASII": {
+                    "description": "access status indicator",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "ICOADS.C96.ASII"
+                }
+            }
+        },
+        "c97": {
+            "header": {
+                "sentinal": "9732",
+                "sentinal_length": 4,
+                "length": 32
+            },
+            "elements": {
+                "ATTI": {
+                    "description": "attm ID",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "ignore": true
+                },
+                "ATTL": {
+                    "description": "attm length",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "ignore": true
+                },
+                "ICNE": {
+                    "description": "input component number",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "valid_max": 99,
+                    "valid_min": 0
+                },
+                "FNE": {
+                    "description": "field number",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "valid_max": 99,
+                    "valid_min": 1
+                },
+                "CEF": {
+                    "description": "corrected / erroneous field flag",
+                    "field_length": 1,
+                    "column_type": "float32",
+                    "valid_max": null,
+                    "valid_min": null,
+                    "scale": null,
+                    "precision": null
+                },
+                "ERRD": {
+                    "description": "corrected / erroneous field value",
+                    "field_length": 10,
+                    "column_type": "float32",
+                    "valid_max": null,
+                    "valid_min": null,
+                    "scale": null,
+                    "precision": null
+                },
+                "ARCE": {
+                    "description": "author reference code",
+                    "field_length": 4,
+                    "column_type": "object",
+                    "valid_max": null,
+                    "valid_min": null,
+                    "scale": null,
+                    "precision": null,
+                    "codetable": null
+                },
+                "CDE": {
+                    "description": "creation date",
+                    "field_length": 8,
+                    "column_type": "int32",
+                    "valid_max": null,
+                    "valid_min": 20140101.0
+                },
+                "ASIE": {
+                    "description": "access status indicator",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "codetable": "ICOADS.C97.ASIE"
+                }
+            }
+        },
+        "c98": {
+            "header": {"sentinal": "9815","sentinal_length": 4,  "length": 15},
+            "elements": {
+                "ATTI": {
+                    "description": "attm ID",
+                    "field_length": 2,
+                    "column_type": "str"
+                },
+                "ATTL": {
+                    "description": "attm length",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "valid_max": 15,
+                    "valid_min": 15
+                },
+                "UID": {
+                    "description": "unique report ID",
+                    "field_length": 6,
+                    "column_type": "str"
+                },
+                "RN1": {
+                    "description": "Release no.: primary",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "encoding": "base36",
+                    "valid_max": 35,
+                    "valid_min": 0
+                },
+                "RN2": {
+                    "description": "Release no.: secondary",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "encoding": "base36",
+                    "valid_max": 35,
+                    "valid_min": 0
+                },
+                "RN3": {
+                    "description": "Release no.: tertiary",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "encoding": "base36",
+                    "valid_max": 35,
+                    "valid_min": 0
+                },
+                "RSA": {
+                    "description": "Release status indicator",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "codetable": "ICOADS.C98.RSA"
+                },
+                "IRF": {
+                    "description": "intermediate reject flag",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "codetable": "ICOADS.C98.IRF"
+                }
+            }
+        },
+        "c99": {
+            "header": {"sentinal": "99 0","sentinal_length": 4},
+            "elements": {
+                "sentinal": {
+                    "description": "sentinal",
+                    "column_type": "object",
+                    "field_length": 5,
+                    "ignore": true
+                },
+                "supp": {
+                    "description": "supplemental",
+                    "column_type": "object"
+                }
+            }
+        }
+    }
+}
diff --git a/schemas/lib/imma1/imma1.json b/schemas/lib/imma1/imma1.json
index a28c3385b66c8fb30f702703911b8cd11efafaad..763acca7ff52bc87fbaf6f586399b5686d00d9c5 100644
--- a/schemas/lib/imma1/imma1.json
+++ b/schemas/lib/imma1/imma1.json
@@ -4,7 +4,7 @@
     },
     "sections": {
         "core": {
-            "header": {"sentinal": null,"sentinal_length": null,"length": 108},
+            "header": {"sentinal": null,"length": 108},
             "elements": {
                 "YR": {
                     "description": "year UTC",
@@ -365,7 +365,7 @@
             }
         },
         "c1": {
-            "header": {"sentinal": " 165","sentinal_length": 4, "length": 65},
+            "header": {"sentinal": " 165","length": 65},
             "elements": {
                 "ATTI": {
                     "description": "attm ID",
@@ -705,7 +705,6 @@
         "c5": {
             "header": {
                 "sentinal": " 594",
-                "sentinal_length": 4,
                 "length": 94
             },
             "elements": {
@@ -1129,7 +1128,6 @@
         "c6": {
             "header": {
                 "sentinal": " 668",
-                "sentinal_length": 4,
                 "length": 68
             },
             "elements": {
@@ -1297,7 +1295,6 @@
         "c7": {
             "header": {
                 "sentinal": " 758",
-                "sentinal_length": 4,
                 "length": 58
             },
             "elements": {
@@ -1462,7 +1459,6 @@
         "c8": {
             "header": {
                 "sentinal": " 82U",
-                "sentinal_length": 4,
                 "length": 102
             },
             "elements": {
@@ -1687,7 +1683,6 @@
         "c9": {
             "header": {
                 "sentinal": " 932",
-                "sentinal_length": 4,
                 "length": 32
             },
             "elements": {
@@ -1813,7 +1808,6 @@
         "c95": {
             "header": {
                 "sentinal": "9561",
-                "sentinal_length": 4,
                 "length": 61
             },
             "elements": {
@@ -1930,7 +1924,6 @@
         "c96": {
             "header": {
                 "sentinal": "9653",
-                "sentinal_length": 4,
                 "length": 53
             },
             "elements": {
@@ -2088,7 +2081,6 @@
         "c97": {
             "header": {
                 "sentinal": "9732",
-                "sentinal_length": 4,
                 "length": 32
             },
             "elements": {
@@ -2162,7 +2154,7 @@
             }
         },
         "c98": {
-            "header": {"sentinal": "9815","sentinal_length": 4,  "length": 15},
+            "header": {"sentinal": "9815", "length": 15},
             "elements": {
                 "ATTI": {
                     "description": "attm ID",
@@ -2220,19 +2212,7 @@
             }
         },
         "c99": {
-            "header": {"sentinal": "99 0","sentinal_length": 4},
-            "elements": {
-                "sentinal": {
-                    "description": "sentinal",
-                    "column_type": "object",
-                    "field_length": 5,
-                    "ignore": true
-                },
-                "supp": {
-                    "description": "supplemental",
-                    "column_type": "object"
-                }
-            }
+            "header": {"sentinal": "99 0", "disable_read": true}
         }
     }
 }
diff --git a/schemas/lib/td11.old/code_tables/barometric_tendency.json b/schemas/lib/td11.old/code_tables/barometric_tendency.json
new file mode 100644
index 0000000000000000000000000000000000000000..90e8b060bab45a7c6a4ee32954393ab9e0c1a6a0
--- /dev/null
+++ b/schemas/lib/td11.old/code_tables/barometric_tendency.json
@@ -0,0 +1,11 @@
+{
+  "0":"",
+  "1":"",
+  "2":"",
+  "3":"",
+  "4":"",
+  "5":"",
+  "6":"",
+  "7":"",
+  "8":""
+}
diff --git a/schemas/lib/td11.old/code_tables/card_indicator.json b/schemas/lib/td11.old/code_tables/card_indicator.json
new file mode 100644
index 0000000000000000000000000000000000000000..4fe866bea5e5003918cd8112bf37ac295253c49b
--- /dev/null
+++ b/schemas/lib/td11.old/code_tables/card_indicator.json
@@ -0,0 +1,10 @@
+{
+  " ":"",
+  "0":"",
+  "1":"",
+  "2":"",
+  "3":"",
+  "4":"",
+  "5":"",
+  "}":"Check this: it's a cero overpunch in doc"
+}
diff --git a/schemas/lib/td11.old/code_tables/cloud_amount_oktas.json b/schemas/lib/td11.old/code_tables/cloud_amount_oktas.json
new file mode 100644
index 0000000000000000000000000000000000000000..51b81ecc0881daf775f9ff027c881b059cf5f291
--- /dev/null
+++ b/schemas/lib/td11.old/code_tables/cloud_amount_oktas.json
@@ -0,0 +1,12 @@
+{
+  "0":"",
+  "1":"",
+  "2":"",
+  "3":"",
+  "4":"",
+  "5":"",
+  "6":"",
+  "7":"",
+  "8":"",
+  "9":""
+}
diff --git a/schemas/lib/td11.old/code_tables/cloud_amount_oktas_significant.json b/schemas/lib/td11.old/code_tables/cloud_amount_oktas_significant.json
new file mode 100644
index 0000000000000000000000000000000000000000..51b81ecc0881daf775f9ff027c881b059cf5f291
--- /dev/null
+++ b/schemas/lib/td11.old/code_tables/cloud_amount_oktas_significant.json
@@ -0,0 +1,12 @@
+{
+  "0":"",
+  "1":"",
+  "2":"",
+  "3":"",
+  "4":"",
+  "5":"",
+  "6":"",
+  "7":"",
+  "8":"",
+  "9":""
+}
diff --git a/schemas/lib/td11.old/code_tables/cloud_height_ind.json b/schemas/lib/td11.old/code_tables/cloud_height_ind.json
new file mode 100644
index 0000000000000000000000000000000000000000..a85fe9e84e87d1b97499b59c47c760b796128382
--- /dev/null
+++ b/schemas/lib/td11.old/code_tables/cloud_height_ind.json
@@ -0,0 +1,4 @@
+{
+  " ":"Height not measured",
+  "0":"Height measured"
+}
diff --git a/schemas/lib/td11.old/code_tables/cloud_height_metres.json b/schemas/lib/td11.old/code_tables/cloud_height_metres.json
new file mode 100644
index 0000000000000000000000000000000000000000..51b81ecc0881daf775f9ff027c881b059cf5f291
--- /dev/null
+++ b/schemas/lib/td11.old/code_tables/cloud_height_metres.json
@@ -0,0 +1,12 @@
+{
+  "0":"",
+  "1":"",
+  "2":"",
+  "3":"",
+  "4":"",
+  "5":"",
+  "6":"",
+  "7":"",
+  "8":"",
+  "9":""
+}
diff --git a/schemas/lib/td11.old/code_tables/cloud_height_significant.json b/schemas/lib/td11.old/code_tables/cloud_height_significant.json
new file mode 100644
index 0000000000000000000000000000000000000000..feed20ae63ff8ab227657046eb971aba318d791c
--- /dev/null
+++ b/schemas/lib/td11.old/code_tables/cloud_height_significant.json
@@ -0,0 +1,12 @@
+{
+  "00":" ","01":" ","02":" ","03":" ","04":" ","05":" ","06":" ","07":" ","08":" ","09":" ",
+  "10":" ","11":" ","12":" ","13":" ","14":" ","15":" ","16":" ","17":" ","18":" ","19":" ",
+  "20":" ","21":" ","22":" ","23":" ","24":" ","25":" ","26":" ","27":" ","28":" ","29":" ",
+  "30":" ","31":" ","32":" ","33":" ","34":" ","35":" ","36":" ","37":" ","38":" ","39":" ",
+  "40":" ","41":" ","42":" ","43":" ","44":" ","45":" ","46":" ","47":" ","48":" ","49":" ",
+  "50":" ","51":" ","52":" ","53":" ","54":" ","55":" ","56":" ","57":" ","58":" ","59":" ",
+  "60":" ","61":" ","62":" ","63":" ","64":" ","65":" ","66":" ","67":" ","68":" ","69":" ",
+  "70":" ","71":" ","72":" ","73":" ","74":" ","75":" ","76":" ","77":" ","78":" ","79":" ",
+  "80":" ","81":" ","82":" ","83":" ","84":" ","85":" ","86":" ","87":" ","88":" ","89":" ",
+  "90":" ","91":" ","92":" ","93":" ","94":" ","95":" ","96":" ","97":" ","98":" ","99":" "
+}
diff --git a/schemas/lib/td11.old/code_tables/cloud_type_high.json b/schemas/lib/td11.old/code_tables/cloud_type_high.json
new file mode 100644
index 0000000000000000000000000000000000000000..53388b1c855c11c0fa5cac24553e7dba27c90ef7
--- /dev/null
+++ b/schemas/lib/td11.old/code_tables/cloud_type_high.json
@@ -0,0 +1,13 @@
+{
+  "0":"",
+  "1":"",
+  "2":"",
+  "3":"",
+  "4":"",
+  "5":"",
+  "6":"",
+  "7":"",
+  "8":"",
+  "9":"",
+  "-":""
+}
diff --git a/schemas/lib/td11.old/code_tables/cloud_type_low.json b/schemas/lib/td11.old/code_tables/cloud_type_low.json
new file mode 100644
index 0000000000000000000000000000000000000000..53388b1c855c11c0fa5cac24553e7dba27c90ef7
--- /dev/null
+++ b/schemas/lib/td11.old/code_tables/cloud_type_low.json
@@ -0,0 +1,13 @@
+{
+  "0":"",
+  "1":"",
+  "2":"",
+  "3":"",
+  "4":"",
+  "5":"",
+  "6":"",
+  "7":"",
+  "8":"",
+  "9":"",
+  "-":""
+}
diff --git a/schemas/lib/td11.old/code_tables/cloud_type_middle.json b/schemas/lib/td11.old/code_tables/cloud_type_middle.json
new file mode 100644
index 0000000000000000000000000000000000000000..53388b1c855c11c0fa5cac24553e7dba27c90ef7
--- /dev/null
+++ b/schemas/lib/td11.old/code_tables/cloud_type_middle.json
@@ -0,0 +1,13 @@
+{
+  "0":"",
+  "1":"",
+  "2":"",
+  "3":"",
+  "4":"",
+  "5":"",
+  "6":"",
+  "7":"",
+  "8":"",
+  "9":"",
+  "-":""
+}
diff --git a/schemas/lib/td11.old/code_tables/cloud_type_significant.json b/schemas/lib/td11.old/code_tables/cloud_type_significant.json
new file mode 100644
index 0000000000000000000000000000000000000000..53388b1c855c11c0fa5cac24553e7dba27c90ef7
--- /dev/null
+++ b/schemas/lib/td11.old/code_tables/cloud_type_significant.json
@@ -0,0 +1,13 @@
+{
+  "0":"",
+  "1":"",
+  "2":"",
+  "3":"",
+  "4":"",
+  "5":"",
+  "6":"",
+  "7":"",
+  "8":"",
+  "9":"",
+  "-":""
+}
diff --git a/schemas/lib/td11.old/code_tables/coordinates_quadrants.json b/schemas/lib/td11.old/code_tables/coordinates_quadrants.json
new file mode 100644
index 0000000000000000000000000000000000000000..f633339ba1cf8b0eab589bec3d450d47274efd19
--- /dev/null
+++ b/schemas/lib/td11.old/code_tables/coordinates_quadrants.json
@@ -0,0 +1,6 @@
+{
+  "1":"",
+  "2":"",
+  "3":"",
+  "4":""
+}
diff --git a/schemas/lib/td11.old/code_tables/ice_accretion_rate.json b/schemas/lib/td11.old/code_tables/ice_accretion_rate.json
new file mode 100644
index 0000000000000000000000000000000000000000..428a49bdde3cb2e069d8ef2ed6afecedba0198c5
--- /dev/null
+++ b/schemas/lib/td11.old/code_tables/ice_accretion_rate.json
@@ -0,0 +1,7 @@
+{
+  "0":"",
+  "1":"",
+  "2":"",
+  "3":"",
+  "4":""
+}
diff --git a/schemas/lib/td11.old/code_tables/ice_type.json b/schemas/lib/td11.old/code_tables/ice_type.json
new file mode 100644
index 0000000000000000000000000000000000000000..18ba7955030d73c022d938ba8cb39e049e824fbd
--- /dev/null
+++ b/schemas/lib/td11.old/code_tables/ice_type.json
@@ -0,0 +1,7 @@
+{
+  "1":"",
+  "2":"",
+  "3":"",
+  "4":"",
+  "5":""
+}
diff --git a/schemas/lib/td11.old/code_tables/ocean_weather_station.json b/schemas/lib/td11.old/code_tables/ocean_weather_station.json
new file mode 100644
index 0000000000000000000000000000000000000000..caf4510b2812b6178d98e6f1092df8e152545904
--- /dev/null
+++ b/schemas/lib/td11.old/code_tables/ocean_weather_station.json
@@ -0,0 +1,5 @@
+{
+   "01":" ","02":" ","03":" ","04":" ","05":" ","06":" ","07":" ","08":" ","09":" ",
+   "10":" ","11":" ","12":" ","13":" ","14":" ","15":" ","16":" ","17":" ","18":" ","19":" ",
+   "20":" ","21":" ","22":" ","23":" ","24":" ","25":" ","26":" "
+ }
diff --git a/schemas/lib/td11.old/code_tables/osv_ship_indicator.json b/schemas/lib/td11.old/code_tables/osv_ship_indicator.json
new file mode 100644
index 0000000000000000000000000000000000000000..5b1ee3f6632061c7ae373807cf8ff6f010799aa1
--- /dev/null
+++ b/schemas/lib/td11.old/code_tables/osv_ship_indicator.json
@@ -0,0 +1,7 @@
+{
+  " ":"",
+  "0":"",
+  "2":"",
+  "K":"Check this: it's a two overpunch in doc",
+  "4":""
+}
diff --git a/schemas/lib/td11.old/code_tables/ship_direction.json b/schemas/lib/td11.old/code_tables/ship_direction.json
new file mode 100644
index 0000000000000000000000000000000000000000..37389401eca15a769ed7edbec6524091887fc43e
--- /dev/null
+++ b/schemas/lib/td11.old/code_tables/ship_direction.json
@@ -0,0 +1,12 @@
+{
+  "0":"",
+  "1":"",
+  "2":"",
+  "3":"",
+  "4":"",
+  "5":"",
+  "6":"",
+  "7":"",
+  "8":"",
+  "9":""  
+}
diff --git a/schemas/lib/td11.old/code_tables/ship_speed_knots.json b/schemas/lib/td11.old/code_tables/ship_speed_knots.json
new file mode 100644
index 0000000000000000000000000000000000000000..f1509acb4dcdb76c7676338926eb1a56629bfff6
--- /dev/null
+++ b/schemas/lib/td11.old/code_tables/ship_speed_knots.json
@@ -0,0 +1,28 @@
+{
+  "range_key(1750,1967)":
+  {
+    "0":"0 knots",
+    "1":"1-3 knots",
+    "2":"4-6 knots",
+    "3":"7-9 knots",
+    "4":"10-12 knots",
+    "5":"13-15 knots",
+    "6":"16-18 knots",
+    "7":"19-21 knots",
+    "8":"22-24 knots",
+    "9":">24 knots"
+  },
+  "range_key(1968,yyyy)":
+  {
+    "0":"0 knots",
+    "1":"1-5 knots",
+    "2":"6-10 knots",
+    "3":"11-15 knots",
+    "4":"16-20 knots",
+    "5":"21-25 knots",
+    "6":"26-30 knots",
+    "7":"31-35 knots",
+    "8":"36-40 knots",
+    "9":">40 knots"
+  }
+}
diff --git a/schemas/lib/td11.old/code_tables/ship_speed_knots.keys b/schemas/lib/td11.old/code_tables/ship_speed_knots.keys
new file mode 100644
index 0000000000000000000000000000000000000000..7449193db575b860b53c03b21e1d92f9be06b2ef
--- /dev/null
+++ b/schemas/lib/td11.old/code_tables/ship_speed_knots.keys
@@ -0,0 +1,3 @@
+{
+  "('additional 6','S P D')" : ["('core1','YEAR')","('additional 6','S P D')"]
+}
diff --git a/schemas/lib/td11.old/code_tables/swell_period.json b/schemas/lib/td11.old/code_tables/swell_period.json
new file mode 100644
index 0000000000000000000000000000000000000000..1c69ed69fdb0696db165a051c7701fccab4d936e
--- /dev/null
+++ b/schemas/lib/td11.old/code_tables/swell_period.json
@@ -0,0 +1,30 @@
+{
+  "range_key(1750,1967)":
+  {
+    "0":"20-21 seconds",
+    "1":"over 21 seconds",
+    "2":"5 seconds or less",
+    "3":"6-7 seconds",
+    "4":"8-9 seconds",
+    "5":"10-11 seconds",
+    "6":"12-13 seconds",
+    "7":"14-15 seconds",
+    "8":"16-17 seconds",
+    "9":"18-19 seconds",
+    "-":"calm or no period determined"
+  },
+  "range_key(1968,yyyy)":
+  {
+    "0":"10 seconds",
+    "1":"11 seconds",
+    "2":"12 seconds",
+    "3":"13 seconds",
+    "4":"14 seconds or more",
+    "5":"5 seconds or less",
+    "6":"6 seconds",
+    "7":"7 seconds",
+    "8":"8 seconds",
+    "9":"9 seconds",
+    "-":"calm or period not determined"
+  }
+}
diff --git a/schemas/lib/td11.old/code_tables/swell_period.keys b/schemas/lib/td11.old/code_tables/swell_period.keys
new file mode 100644
index 0000000000000000000000000000000000000000..3c9be36bf8fb2813a1764403d0ae7e339adf68bc
--- /dev/null
+++ b/schemas/lib/td11.old/code_tables/swell_period.keys
@@ -0,0 +1,3 @@
+{
+  "('core1','P E R SWELL')" : ["('core1','YEAR')","('core1','P E R SWELL')"]
+}
diff --git a/schemas/lib/td11.old/code_tables/temperatures_ind.json b/schemas/lib/td11.old/code_tables/temperatures_ind.json
new file mode 100644
index 0000000000000000000000000000000000000000..34d01d879b82bfbdb9745f5268400784622d1f3f
--- /dev/null
+++ b/schemas/lib/td11.old/code_tables/temperatures_ind.json
@@ -0,0 +1,5 @@
+{
+  "1":"",
+  "3":"",
+  "5":""
+}
diff --git a/schemas/lib/td11.old/code_tables/visibility.json b/schemas/lib/td11.old/code_tables/visibility.json
new file mode 100644
index 0000000000000000000000000000000000000000..02efb9872df2dc2eebb32944011a6ca4e51c6f6b
--- /dev/null
+++ b/schemas/lib/td11.old/code_tables/visibility.json
@@ -0,0 +1,6 @@
+{
+  "0":
+  {"90":"<0.05 km","91":"0.05 km","92":"0.2 km","93":"0.5 km","94":"1 km","95":"2 km","96":"4 km","97":"10 km","98":"20 km","99":"50 km or more"},
+  "1":
+  {"90":"<0.05 km","91":"0.05 km","92":"0.2 km","93":"Fog present, no visibility reported","94":"1 km","95":"2 km","96":"4 km","97":"10 km","98":"20 km","99":"50 km or more"}
+}
diff --git a/schemas/lib/td11.old/code_tables/visibility.keys b/schemas/lib/td11.old/code_tables/visibility.keys
new file mode 100644
index 0000000000000000000000000000000000000000..5c13db6d917864028d1d90aab962b1a5682bb125
--- /dev/null
+++ b/schemas/lib/td11.old/code_tables/visibility.keys
@@ -0,0 +1,3 @@
+{
+  "('core1','VIS')" : ["('core1','VIS I')","('core1','VIS')"]
+}
diff --git a/schemas/lib/td11.old/code_tables/visibility_ind.json b/schemas/lib/td11.old/code_tables/visibility_ind.json
new file mode 100644
index 0000000000000000000000000000000000000000..f5d9cfa9fb9547efccb7e1168a33528c887deac5
--- /dev/null
+++ b/schemas/lib/td11.old/code_tables/visibility_ind.json
@@ -0,0 +1,5 @@
+{
+  " ":"Not measured",
+  "0":"Measured",
+  "1":"Fog present"
+}
diff --git a/schemas/lib/td11.old/code_tables/wave_direction_from.json b/schemas/lib/td11.old/code_tables/wave_direction_from.json
new file mode 100644
index 0000000000000000000000000000000000000000..62f8416c91a1aa79df4715e1ec37e2d37afc9c63
--- /dev/null
+++ b/schemas/lib/td11.old/code_tables/wave_direction_from.json
@@ -0,0 +1,6 @@
+{
+  "00":" ","01":" ","02":" ","03":" ","04":" ","05":" ","06":" ","07":" ","08":" ","09":" ",
+  "10":" ","11":" ","12":" ","13":" ","14":" ","15":" ","16":" ","17":" ","18":" ","19":" ",
+  "20":" ","21":" ","22":" ","23":" ","24":" ","25":" ","26":" ","27":" ","28":" ","29":" ",
+  "30":" ","31":" ","32":" ","33":" ","34":" ","35":" ","36":" ","49":" ","99":" "
+}
diff --git a/schemas/lib/td11.old/code_tables/wave_height.json b/schemas/lib/td11.old/code_tables/wave_height.json
new file mode 100644
index 0000000000000000000000000000000000000000..feed20ae63ff8ab227657046eb971aba318d791c
--- /dev/null
+++ b/schemas/lib/td11.old/code_tables/wave_height.json
@@ -0,0 +1,12 @@
+{
+  "00":" ","01":" ","02":" ","03":" ","04":" ","05":" ","06":" ","07":" ","08":" ","09":" ",
+  "10":" ","11":" ","12":" ","13":" ","14":" ","15":" ","16":" ","17":" ","18":" ","19":" ",
+  "20":" ","21":" ","22":" ","23":" ","24":" ","25":" ","26":" ","27":" ","28":" ","29":" ",
+  "30":" ","31":" ","32":" ","33":" ","34":" ","35":" ","36":" ","37":" ","38":" ","39":" ",
+  "40":" ","41":" ","42":" ","43":" ","44":" ","45":" ","46":" ","47":" ","48":" ","49":" ",
+  "50":" ","51":" ","52":" ","53":" ","54":" ","55":" ","56":" ","57":" ","58":" ","59":" ",
+  "60":" ","61":" ","62":" ","63":" ","64":" ","65":" ","66":" ","67":" ","68":" ","69":" ",
+  "70":" ","71":" ","72":" ","73":" ","74":" ","75":" ","76":" ","77":" ","78":" ","79":" ",
+  "80":" ","81":" ","82":" ","83":" ","84":" ","85":" ","86":" ","87":" ","88":" ","89":" ",
+  "90":" ","91":" ","92":" ","93":" ","94":" ","95":" ","96":" ","97":" ","98":" ","99":" "
+}
diff --git a/schemas/lib/td11.old/code_tables/wave_period.json b/schemas/lib/td11.old/code_tables/wave_period.json
new file mode 100644
index 0000000000000000000000000000000000000000..53388b1c855c11c0fa5cac24553e7dba27c90ef7
--- /dev/null
+++ b/schemas/lib/td11.old/code_tables/wave_period.json
@@ -0,0 +1,13 @@
+{
+  "0":"",
+  "1":"",
+  "2":"",
+  "3":"",
+  "4":"",
+  "5":"",
+  "6":"",
+  "7":"",
+  "8":"",
+  "9":"",
+  "-":""
+}
diff --git a/schemas/lib/td11.old/code_tables/weather_past.json b/schemas/lib/td11.old/code_tables/weather_past.json
new file mode 100644
index 0000000000000000000000000000000000000000..37389401eca15a769ed7edbec6524091887fc43e
--- /dev/null
+++ b/schemas/lib/td11.old/code_tables/weather_past.json
@@ -0,0 +1,12 @@
+{
+  "0":"",
+  "1":"",
+  "2":"",
+  "3":"",
+  "4":"",
+  "5":"",
+  "6":"",
+  "7":"",
+  "8":"",
+  "9":""  
+}
diff --git a/schemas/lib/td11.old/code_tables/weather_present.json b/schemas/lib/td11.old/code_tables/weather_present.json
new file mode 100644
index 0000000000000000000000000000000000000000..feed20ae63ff8ab227657046eb971aba318d791c
--- /dev/null
+++ b/schemas/lib/td11.old/code_tables/weather_present.json
@@ -0,0 +1,12 @@
+{
+  "00":" ","01":" ","02":" ","03":" ","04":" ","05":" ","06":" ","07":" ","08":" ","09":" ",
+  "10":" ","11":" ","12":" ","13":" ","14":" ","15":" ","16":" ","17":" ","18":" ","19":" ",
+  "20":" ","21":" ","22":" ","23":" ","24":" ","25":" ","26":" ","27":" ","28":" ","29":" ",
+  "30":" ","31":" ","32":" ","33":" ","34":" ","35":" ","36":" ","37":" ","38":" ","39":" ",
+  "40":" ","41":" ","42":" ","43":" ","44":" ","45":" ","46":" ","47":" ","48":" ","49":" ",
+  "50":" ","51":" ","52":" ","53":" ","54":" ","55":" ","56":" ","57":" ","58":" ","59":" ",
+  "60":" ","61":" ","62":" ","63":" ","64":" ","65":" ","66":" ","67":" ","68":" ","69":" ",
+  "70":" ","71":" ","72":" ","73":" ","74":" ","75":" ","76":" ","77":" ","78":" ","79":" ",
+  "80":" ","81":" ","82":" ","83":" ","84":" ","85":" ","86":" ","87":" ","88":" ","89":" ",
+  "90":" ","91":" ","92":" ","93":" ","94":" ","95":" ","96":" ","97":" ","98":" ","99":" "
+}
diff --git a/schemas/lib/td11.old/code_tables/wind_direction.json b/schemas/lib/td11.old/code_tables/wind_direction.json
new file mode 100644
index 0000000000000000000000000000000000000000..322bf026c58e13d16bccbfcb96128144806397d6
--- /dev/null
+++ b/schemas/lib/td11.old/code_tables/wind_direction.json
@@ -0,0 +1,22 @@
+{
+  " ":
+  {"00":" ","01":" ","02":" ","03":" ","04":" ","05":" ","06":" ","07":" ","08":" ","09":" ",
+   "10":" ","11":" ","12":" ","13":" ","14":" ","15":" ","16":" ","17":" ","18":" ","19":" ",
+   "20":" ","21":" ","22":" ","23":" ","24":" ","25":" ","26":" ","27":" ","28":" ","29":" ",
+   "30":" ","31":" ","32":" ","33":" ","34":" ","35":" ","36":" ","99":" "},
+  "0":
+  {"00":" ","01":" ","02":" ","03":" ","04":" ","05":" ","06":" ","07":" ","08":" ","09":" ",
+   "10":" ","11":" ","12":" ","13":" ","14":" ","15":" ","16":" ","17":" ","18":" ","19":" ",
+   "20":" ","21":" ","22":" ","23":" ","24":" ","25":" ","26":" ","27":" ","28":" ","29":" ",
+   "30":" ","31":" ","32":" ","99":" "},
+  "1":
+  {"00":" ","02":" ","05":" ","07":" ","09":" ",
+   "11":" ","14":" ","16":" ","18":" ",
+   "20":" ","23":" ","25":" ","27":" ","29":" ",
+   "32":" ","34":" ","36":" ","99":" "},
+  "2":
+  {"00":" ","02":" ","04":" ","06":" ","08":" ",
+   "10":" ","12":" ","14":" ","16":" ","18":" ",
+   "20":" ","22":" ","24":" ","26":" ","28":" ",
+   "30":" ","32":" ","99":" "}
+}
diff --git a/schemas/lib/td11.old/code_tables/wind_direction.keys b/schemas/lib/td11.old/code_tables/wind_direction.keys
new file mode 100644
index 0000000000000000000000000000000000000000..7ef5168006120884bb8aecb6b22322042745b9ac
--- /dev/null
+++ b/schemas/lib/td11.old/code_tables/wind_direction.keys
@@ -0,0 +1,3 @@
+{
+  "('core1','WIND DIR')" : ["('core1','WIND DIR I')","('core1','WIND DIR')"]
+}
diff --git a/schemas/lib/td11.old/code_tables/wind_direction_ind.json b/schemas/lib/td11.old/code_tables/wind_direction_ind.json
new file mode 100644
index 0000000000000000000000000000000000000000..3ab840a17e86a2a2368bd772545bf47f5ce8a977
--- /dev/null
+++ b/schemas/lib/td11.old/code_tables/wind_direction_ind.json
@@ -0,0 +1,6 @@
+{
+  " ":"36 point scale",
+  "0":"32 point scale",
+  "1":"16 of 36 point scale",
+  "2":"16 of 32 point scale"
+}
diff --git a/schemas/lib/td11.old/code_tables/wind_speed_ind.json b/schemas/lib/td11.old/code_tables/wind_speed_ind.json
new file mode 100644
index 0000000000000000000000000000000000000000..3784de40a2fb25e652629588b7004b8d4e317e71
--- /dev/null
+++ b/schemas/lib/td11.old/code_tables/wind_speed_ind.json
@@ -0,0 +1,4 @@
+{
+  " ":"Not measured",
+  "0":"Measured"
+}
diff --git a/schemas/lib/td11.old/td11.json b/schemas/lib/td11.old/td11.json
new file mode 100644
index 0000000000000000000000000000000000000000..7170580adb0fc389f55a037f37204d4d594efc41
--- /dev/null
+++ b/schemas/lib/td11.old/td11.json
@@ -0,0 +1,468 @@
+{
+    "header": {
+        "format": "fixed_width",
+        "parsing_order": [
+            {"s": ["core1"]},
+            {"e": [ "additional blank","additional 1",  "additional 6","additional 8"]},
+            {"s": [ "core2","supplemental"]}],
+        "date_parser": {"section": "core1","elements": ["YEAR","MO","DA","HR"],"format": ["%Y","%m","%d","%H"]}
+    },
+    "sections": {
+        "core1": {
+            "header": {"sentinal": null,"sentinal_length": null,"length": 81},
+            "elements": {
+                "CARD DECK": {
+                    "description": "Card deck number",
+                    "field_length": 3,
+                    "column_type": "str"
+                },
+                "MAR SQ": {
+                    "description": "Marsden 10 degree square",
+                    "field_length": 3,
+                    "column_type": "int16",
+                    "valid_max": 936,
+                    "valid_min": 1
+                },
+                "SUB SQ": {
+                    "description": "Marsden 1 degree sub-square",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "valid_max": 99,
+                    "valid_min": 0
+                },
+                "Q": {
+                    "description": "Quadrant",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "codetable": "coordinates_quadrants"
+                },
+                "LAT": {
+                    "description": "Latitude",
+                    "field_length": 3,
+                    "column_type": "float16",
+                    "valid_max": 90.0,
+                    "valid_min": 0.0,
+                    "scale": 0.1,
+                    "decimal_places": 1,
+                    "units": "deg"
+                },
+                "LONG": {
+                    "description": "Longitude",
+                    "field_length": 4,
+                    "column_type": "float16",
+                    "valid_max": 180.0,
+                    "valid_min": 0.0,
+                    "scale": 0.1,
+                    "decimal_places": 1,
+                    "units": "deg"
+                },
+                "YEAR": {
+                    "description": "Year",
+                    "field_length": 4,
+                    "column_type": "int16",
+                    "valid_max": 1999,
+                    "valid_min": 1800,
+                    "units": "a"
+                },
+                "MO": {
+                    "description": "Month",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "valid_max": 12,
+                    "valid_min": 1,
+                    "units": "mon"
+                },
+                "DA": {
+                    "description": "Day",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "valid_max": 31,
+                    "valid_min": 1,
+                    "units": "d"
+                },
+                "HR": {
+                    "description": "Hour GMT",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "valid_max": 23,
+                    "valid_min": 0,
+                    "units": "h"
+                },
+                "WIND DIR I": {
+                    "description": "Wind direction indicator",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "disable_white_strip": true,
+                    "codetable": "wind_direction_ind"
+                },
+                "WIND DIR": {
+                    "description": "Wind direction",
+                    "field_length": 2,
+                    "column_type": "key",
+                    "codetable": "wind_direction"
+                },
+                "WIND SPD I": {
+                    "description": "Wind speed indicator",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "disable_white_strip": true,
+                    "codetable": "wind_speed_ind"
+                },
+                "WIND SPD": {
+                    "description": "Wind speed",
+                    "field_length": 3,
+                    "column_type": "int16",
+                    "valid_min": 0,
+                    "valid_max": 199,
+                    "units": "knots"
+                },
+                "VIS I": {
+                    "description": "Visibility indicator",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "disable_white_strip": true,
+                    "codetable": "visibility_ind"
+                },
+                "VIS": {
+                    "description": "Visibility",
+                    "field_length": 2,
+                    "column_type": "key",
+                    "codetable": "visibility"
+                },
+                "WX": {
+                    "description": "Present weather",
+                    "field_length": 2,
+                    "column_type": "key",
+                    "codetable": "weather_present"
+                },
+                "W": {
+                    "description": "Past weather",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "codetable": "weather_past"
+                },
+                "PRESS": {
+                    "description": "Sea level pressure",
+                    "field_length": 5,
+                    "column_type": "float16",
+                    "valid_max": 1070.0,
+                    "valid_min": 890.0,
+                    "scale": 0.1,
+                    "decimal_places": 1,
+                    "units": "hPa"
+                },
+                "T I": {
+                    "description": "Temperatures indicator",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "codetable": "temperatures_ind"
+                },
+                "AIR TMP": {
+                    "description": "Air temperature",
+                    "field_length": 3,
+                    "column_type": "float16",
+                    "encoding": "signed_overpunch",
+                    "valid_max": 99.9,
+                    "valid_min": -99.9,
+                    "scale": 0.1,
+                    "precision": "0.1"
+                },
+                "WET BLB": {
+                    "description": "Wet bulb temperature",
+                    "field_length": 3,
+                    "column_type": "float16",
+                    "encoding": "signed_overpunch",
+                    "valid_max": 99.9,
+                    "valid_min": -99.9,
+                    "scale": 0.1,
+                    "decimal_places": 1,
+                    "units": "C"
+                },
+                "DEW PT": {
+                    "description": "Dew point temperature",
+                    "field_length": 3,
+                    "column_type": "float16",
+                    "encoding": "signed_overpunch",
+                    "valid_max": 99.9,
+                    "valid_min": -99.9,
+                    "scale": 0.1,
+                    "decimal_places": 1,
+                    "units": "C"
+                },
+                "SEA TMP": {
+                    "description": "Sea surface temperature",
+                    "field_length": 3,
+                    "column_type": "float16",
+                    "encoding": "signed_overpunch",
+                    "valid_max": 99.9,
+                    "valid_min": -99.9,
+                    "scale": 0.1,
+                    "decimal_places": 1,
+                    "units": "C"
+                },
+                "A-S DIFF": {
+                    "description": "Air-sea temperature difference",
+                    "field_length": 3,
+                    "column_type": "float16",
+                    "encoding": "signed_overpunch",
+                    "valid_max": 99.9,
+                    "valid_min": -99.9,
+                    "scale": 0.1,
+                    "decimal_places": 1,
+                    "units": "C"
+                },
+                "CLOUDS N": {
+                    "description": "Total cloud amount",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "codetable": "cloud_amount_oktas"
+                },
+                "CLOUDS Nh": {
+                    "description": "Lower cloud amount",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "codetable": "cloud_amount_oktas"
+                },
+                "CLOUDS CL": {
+                    "description": "Type of low cloud",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "codetable": "cloud_type_low"
+                },
+                "CLOUDS I": {
+                    "description": "Cloud height indicator",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "disable_white_strip": true,
+                    "codetable": "cloud_height_ind"
+                },
+                "CLOUDS h": {
+                    "description": "Cloud height",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "codetable": "cloud_height_metres"
+                },
+                "CLOUDS CM": {
+                    "description": "Type of middle cloud",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "codetable": "cloud_type_middle"
+                },
+                "CLOUDS CH": {
+                    "description": "Type of high cloud",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "codetable": "cloud_type_high"
+                },
+                "WAVE DIR": {
+                    "description": "Direction of waves",
+                    "field_length": 2,
+                    "column_type": "key",
+                    "codetable": "wave_direction_from"
+                },
+                "P E R WAVES": {
+                    "description": "Period of waves",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "codetable": "wave_period"
+                },
+                "WAVE HGT": {
+                    "description": "Height of waves",
+                    "field_length": 2,
+                    "column_type": "key",
+                    "codetable": "wave_height"
+                },
+                "SWL DIR": {
+                    "description": "Direction of swell",
+                    "field_length": 2,
+                    "column_type": "key",
+                    "codetable": "wave_direction_from"
+                },
+                "P E R SWELL": {
+                    "description": "Period of swell",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "codetable": "swell_period"
+                },
+                "SWL HGT": {
+                    "description": "Height of swell",
+                    "field_length": 2,
+                    "column_type": "key",
+                    "codetable": "wave_height"
+                },
+                "OSV NO.": {
+                    "description": "Ocean weather station number",
+                    "field_length": 2,
+                    "column_type": "key",
+                    "codetable": "ocean_weather_station"
+                },
+                "C D": {
+                    "description": "Card indicator",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "disable_white_strip": true,
+                    "codetable": "card_indicator"
+                },
+                "SHP": {
+                    "description": "Osv or ship indicator",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "disable_white_strip": true,
+                    "codetable": "osv_ship_indicator"
+                }
+            }
+        },
+        "additional blank": {
+            "header": {"sentinal": " ", "sentinal_length": 1, "length": 7},
+            "elements": {
+                "ADD 0": {
+                    "description": "No data",
+                    "field_length": 1,
+                    "column_type": "object",
+                    "ignore": true
+                },
+                "Blank": {
+                    "description": "No data",
+                    "field_length": 6,
+                    "column_type": "object",
+                    "ignore": true
+                }
+            }
+        },
+        "additional 1": {
+          "header": {"sentinal": "1",  "sentinal_length": 1,"length": 7},
+            "elements": {
+                "A D D": {
+                    "description": "Additional data indicator",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "ignore": true
+                },
+                "I C E": {
+                    "description": "Type of ice",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "codetable": "ice_type"
+                },
+                "ICE THK": {
+                    "description": "Thickness of ice in centimetres",
+                    "field_length": 2,
+                    "column_type": "int8",
+                    "valid_max": 99,
+                    "valid_min": 0,
+                    "units": "cm"
+                },
+                "ACC": {
+                    "description": "Rate of ice accretion",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "codetable": "ice_accretion_rate"
+                },
+                "Blank": {
+                    "description": "Blank",
+                    "field_length": 2,
+                    "column_type": "object",
+                    "ignore": true
+                }
+            }
+        },
+        "additional 6": {
+            "header": {"sentinal": "6","sentinal_length": 1,"length": 7},
+            "elements": {
+                "A D D": {
+                    "description": "Additional data indicator",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "ignore": true
+                },
+                "D I R": {
+                    "description": "Ship direction",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "codetable": "ship_direction"
+                },
+                "S P D": {
+                    "description": "Ship speed",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "codetable": "ship_speed_knots"
+                },
+                "a": {
+                    "description": "Barometric tendency",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "codetable": "barometric_tendency"
+                },
+                "ppp": {
+                    "description": "Amount of pressure change (3h, tenths of millibars)",
+                    "field_length": 3,
+                    "column_type": "float16",
+                    "valid_max": 29.9,
+                    "valid_min": 0.0,
+                    "scale": 0.1,
+                    "decimal_places": 1,
+                    "units": "hPa"
+                }
+            }
+        },
+        "additional 8": {
+            "header": {"sentinal": "8","sentinal_length": 1,"length": 7},
+            "elements": {
+                "A D D": {
+                    "description": "Additional data indicator",
+                    "field_length": 1,
+                    "column_type": "int8",
+                    "ignore": true
+                },
+                "SIG N": {
+                    "description": "Significant cloud amount",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "codetable": "cloud_amount_oktas_significant"
+                },
+                "SIG T": {
+                    "description": "Significant cloud type",
+                    "field_length": 1,
+                    "column_type": "key",
+                    "codetable": "cloud_type_significant"
+                },
+                "SIG HGT": {
+                    "description": "Significant cloud height",
+                    "field_length": 2,
+                    "column_type": "key",
+                    "codetable": "cloud_height_significant"
+                },
+                "Blank": {
+                    "description": "Blank",
+                    "field_length": 2,
+                    "column_type": "object",
+                    "ignore": true
+                }
+            }
+        },
+        "core2": {
+            "header": {"sentinal": null,"sentinal_length": null,"length": 5},
+            "elements": {
+                "I C E": {
+                    "description": "Ice indicator",
+                    "field_length": 1,
+                    "column_type": "str"
+                },
+                "SHIP NO.": {
+                    "description": "Ship number",
+                    "field_length": 4,
+                    "column_type": "str"
+                }
+            }
+        },
+        "supplemental": {
+            "header": {"sentinal": null,"sentinal_length": null,"length": null},
+            "elements": {
+                "supp": {
+                    "description": "Supplemental data fields",
+                    "column_type": "object"
+                }
+            }
+        }
+    }
+}
diff --git a/schemas/schemas.py b/schemas/schemas.py
index 6391f48f6c85657bf81ecc9a2c5ad82d1eff586d..8a981a03080c9c90fae1798ddc00fc82aef2f7c7 100644
--- a/schemas/schemas.py
+++ b/schemas/schemas.py
@@ -5,6 +5,11 @@ Created on Thu Sep 13 15:14:51 2018
 
 
 Read data file format json schema to dictionary
+
+Add schema validation:
+    - check mandatory are not null
+    - check fixed options
+
 """
 
 
@@ -54,6 +59,22 @@ def copy_template(schema, out_dir = None,out_path = None):
         print('\tValid names are: {}'.format(", ".join(schemas)))
         return
 
+def get_field_layout(field_layout_def,field_layout):
+    if not field_layout_def and not field_layout:
+        return None
+    elif not field_layout:
+        return field_layout_def
+    else:
+        return field_layout
+
+def get_delimiter(delimiter_def,delimiter):
+    if not delimiter_def and not delimiter:
+        return None
+    elif not delimiter_def:
+        return delimiter
+    else:
+        return field_layout
+
 def read_schema(schema_name = None, ext_schema_path = None):
 
     if schema_name:
@@ -65,6 +86,7 @@ def read_schema(schema_name = None, ext_schema_path = None):
     else:
         schema_path = os.path.abspath(ext_schema_path)
         schema_name = os.path.basename(schema_path)
+        
     schema_file = os.path.join(schema_path, schema_name + '.json')
     if not os.path.isfile(schema_file):
         logging.error('Can\'t find input schema file {}'.format(schema_file))
@@ -75,14 +97,31 @@ def read_schema(schema_name = None, ext_schema_path = None):
     #   FILL IN THE INITIAL SCHEMA TO "FULL COMPLEXITY"
     #   EXPLICITY ADD INFO THAT IS IMPLICIT TO GIVEN SITUATIONS/SUBFORMATS
     #   ---------------------------------------------------------------------------
-    # One report per record
+    # One report per record: make sure later changes are reflected in MULTIPLE
+    # REPORTS PER RECORD case below if we ever use it!
     if not schema['header'].get('multiple_reports_per_line'):
+        # Make no section formats be 1 section format
         if not schema.get('sections'):
             schema['sections'] = {properties.dummy_level:{'header':{},'elements':schema.get('elements')}}
             schema['header']['parsing_order'] = [{'s':[properties.dummy_level]}]
             schema.pop('elements',None)
+            schema['sections'][properties.dummy_level]['header']['delimiter'] = schema['header'].get('delimiter')
+            schema['header'].pop('delimiter',None)
+            schema['sections'][properties.dummy_level]['header']['field_layout'] = schema['header'].get('field_layout')
+            schema['header'].pop('field_layout',None)
+        # Make parsing order explicit
         if not schema['header'].get('parsing_order'):# assume sequential
             schema['header']['parsing_order'] = [{'s':list(schema['sections'].keys())}]
+        # Make disable_read and field_layout explicit: this is ruled by delimiter or length being set,
+        # unless explicitly set
+        for section in schema['sections'].keys():
+            if schema['sections'][section]['header'].get('disable_read'):
+                continue
+            else:
+                schema['sections'][section]['header']['disable_read'] = False
+            if not schema['sections'][section]['header'].get('field_layout'):
+                delimiter = schema['sections'][section]['header'].get('delimiter')
+                schema['sections'][section]['header']['field_layout'] = 'delimited' if delimiter else 'fixed_width'   
         return schema
     else:
         # 1X: MULTIPLE REPORTS PER RECORD