diff --git a/libc3/struct.h b/libc3/struct.h
index 2b82808..2730d92 100644
--- a/libc3/struct.h
+++ b/libc3/struct.h
@@ -12,179 +12,28 @@
*/
/**
* @file tag.h
- * @brief Struct type %Module{key: value, ...}
+ * @brief Struct type : %Module{key: value, ...}
*
- * Structure to represent a C structure.
+ * A structure type is defined using defstruct.
+ * There can be only one defstruct per module.
+ * The struct type can be referred to by just the module name.
+ * The rest of the module should contain operations on that struct.
*/
-#ifndef LIBC3_TAG_H
-#define LIBC3_TAG_H
+#ifndef LIBC3_STRUCT_H
+#define LIBC3_STRUCT_H
#include <stdarg.h>
#include <stdio.h>
#include "types.h"
-#define TAG_FIRST (&g_tag_first)
-#define TAG_LAST (&g_tag_last)
+/* Stack-allocation compatible functions, call struct_clean after use. */
+void struct_clean (s_struct *s);
+s_struct * struct_init (s_struct *s);
+s_struct * struct_init_1 (s_struct *s, const s8 *p);
-extern s_tag g_tag_first;
-extern s_tag g_tag_last;
+/* Heap-allocation functions, call struct_delete after use. */
+void struct_delete (s_struct *s);
+s_struct * struct_new (void);
+s_struct * struct_new_1 (const s8 *p);
-/* Stack allocation compatible functions */
-void tag_clean (s_tag *tag);
-s_tag * tag_init (s_tag *tag);
-s_tag * tag_init_1 (s_tag *tag, const s8 *p);
-s_tag * tag_init_array (s_tag *tag, const s_sym *type, uw dimension,
- const uw *dimensions);
-s_tag * tag_init_bool (s_tag *tag, bool p);
-s_tag * tag_init_call (s_tag *tag, const s_call *call);
-s_tag * tag_init_character (s_tag *tag, character c);
-s_tag * tag_init_copy (s_tag *tag, const s_tag *src);
-s_tag * tag_init_ident (s_tag *tag, const s_ident *ident);
-s_tag * tag_init_ident_1 (s_tag *tag, const s8 *p);
-s_tag * tag_init_integer (s_tag *tag, const s_integer *i);
-s_tag * tag_init_integer_1 (s_tag *tag, const s8 *p);
-s_tag * tag_init_integer_zero (s_tag *tag);
-s_tag * tag_init_list (s_tag *tag, s_list *list);
-s_tag * tag_init_list_1 (s_tag *tag, const s8 *p);
-s_tag * tag_init_map (s_tag *tag, uw count);
-s_tag * tag_init_map_1 (s_tag *tag, const s8 *p);
-s_tag * tag_init_str (s_tag *tag, s8 *free, uw size, const s8 *p);
-s_tag * tag_init_str_1 (s_tag *tag, s8 *free, const s8 *p);
-s_tag * tag_init_sym (s_tag *tag, const s_sym *p);
-s_tag * tag_init_sym_1 (s_tag *tag, const s8 *p);
-s_tag * tag_init_time (s_tag *tag);
-s_tag * tag_init_tuple (s_tag *tag, uw count);
-s_tag * tag_init_tuple_2 (s_tag *tag, const s_tag *a, const s_tag *b);
-s_tag * tag_init_var (s_tag *tag);
-s_tag * tag_init_void (s_tag *tag);
-
-/* Numbers */
-s_tag * tag_init_f32 (s_tag *tag, f32 f);
-s_tag * tag_init_f64 (s_tag *tag, f64 f);
-s_tag * tag_init_s8 (s_tag *tag, s8 i);
-s_tag * tag_init_s16 (s_tag *tag, s16 i);
-s_tag * tag_init_s32 (s_tag *tag, s32 i);
-s_tag * tag_init_s64 (s_tag *tag, s64 i);
-s_tag * tag_init_sw (s_tag *tag, sw i);
-s_tag * tag_init_u8 (s_tag *tag, u8 i);
-s_tag * tag_init_u16 (s_tag *tag, u16 i);
-s_tag * tag_init_u32 (s_tag *tag, u32 i);
-s_tag * tag_init_u64 (s_tag *tag, u64 i);
-s_tag * tag_init_uw (s_tag *tag, uw i);
-
-/* Constructors, call tag_delete after use */
-s_tag * tag_new (void);
-s_tag * tag_new_1 (const s8 *p);
-s_tag * tag_new_array (const s_sym *type, uw dimension,
- const uw *dimensions);
-s_tag * tag_new_bool (bool p);
-s_tag * tag_new_character (character c);
-s_tag * tag_new_copy (const s_tag *src);
-s_tag * tag_new_sym (const s_sym *sym);
-s_tag * tag_new_f32 (f32 f);
-s_tag * tag_new_f64 (f64 f);
-s_tag * tag_new_s8 (s8 i);
-s_tag * tag_new_s16 (s16 i);
-s_tag * tag_new_s32 (s32 i);
-s_tag * tag_new_s64 (s64 i);
-s_tag * tag_new_str (s8 *free, uw size, const s8 *p);
-s_tag * tag_new_tuple_2 (s_tag *a, s_tag *b);
-s_tag * tag_new_u8 (u8 i);
-s_tag * tag_new_u16 (u16 i);
-s_tag * tag_new_u32 (u32 i);
-s_tag * tag_new_u64 (u64 i);
-s_tag * tag_new_var (void);
-
-/* Destructor */
-void tag_delete (s_tag *tag);
-
-/* Observers */
-u64 tag_hash_u64 (const s_tag *tag);
-uw tag_hash_uw (const s_tag *tag);
-s_str * tag_inspect (const s_tag *tag, s_str *dest);
-bool tag_ident_is_bound (const s_tag *tag);
-bool tag_is_bound_var (const s_tag *tag);
-bool tag_is_number (const s_tag *tag);
-bool tag_is_unbound_var (const s_tag *tag);
-s8 tag_number_compare (const s_tag *a, const s_tag *b);
-sw tag_size (const s_tag *tag);
-void * tag_to_ffi_pointer (s_tag *tag, const s_sym *type);
-ffi_type tag_to_ffi_type(const s_tag *tag);
-void * tag_to_pointer (s_tag *tag, const s_sym *type);
-const s_sym ** tag_type (const s_tag *tag, const s_sym **type);
-sw tag_type_size (e_tag_type type);
-f_buf_inspect tag_type_to_buf_inspect (e_tag_type type);
-f_buf_inspect_size tag_type_to_buf_inspect_size (e_tag_type type);
-f_buf_parse tag_type_to_buf_parse (e_tag_type type);
-const s8 * tag_type_to_string (e_tag_type type);
-const s_sym * tag_type_to_sym (e_tag_type tag_type);
-
-/* Modifiers */
-s_tag * tag_1 (s_tag *tag, const s8 *p);
-s_tag * tag_array (s_tag *tag, const s_sym *type, uw dimension,
- const uw *dimensions);
-s_tag * tag_bool (s_tag *tag, bool p);
-s_tag * tag_cast_integer_to_s16 (s_tag *tag);
-s_tag * tag_cast_integer_to_s32 (s_tag *tag);
-s_tag * tag_cast_integer_to_s64 (s_tag *tag);
-s_tag * tag_cast_integer_to_s8 (s_tag *tag);
-s_tag * tag_cast_integer_to_u16 (s_tag *tag);
-s_tag * tag_cast_integer_to_u32 (s_tag *tag);
-s_tag * tag_cast_integer_to_u64 (s_tag *tag);
-s_tag * tag_cast_integer_to_u8 (s_tag *tag);
-s_tag * tag_character (s_tag *tag, character c);
-s_tag * tag_f32 (s_tag *tag, f32 f);
-s_tag * tag_f64 (s_tag *tag, f64 f);
-s_tag * tag_ident (s_tag *tag, const s_ident *ident);
-s_tag * tag_ident_1 (s_tag *tag, const s8 *p);
-s_tag * tag_integer (s_tag *tag, const s_integer *x);
-s_tag * tag_integer_1 (s_tag *tag, const s8 *p);
-s_tag * tag_integer_reduce (s_tag *tag);
-s_tag * tag_list (s_tag *tag, s_list *list);
-s_tag * tag_list_1 (s_tag *tag, const s8 *p);
-s_tag * tag_map (s_tag *tag, uw count);
-s_tag * tag_map_1 (s_tag *tag, const s8 *p);
-s_tag * tag_s16 (s_tag *tag, s16 i);
-s_tag * tag_s32 (s_tag *tag, s32 i);
-s_tag * tag_s64 (s_tag *tag, s64 i);
-s_tag * tag_s8 (s_tag *tag, s8 i);
-s_tag * tag_str (s_tag *tag, s8 *free, uw size, const s8 *p);
-s_tag * tag_str_1 (s_tag *tag, s8 *free, const s8 *p);
-s_tag * tag_sym (s_tag *tag, const s_sym *p);
-s_tag * tag_sym_1 (s_tag *tag, const s8 *p);
-s_tag * tag_tuple (s_tag *tag, uw count);
-s_tag * tag_tuple_2 (s_tag *tag, s_tag *a, s_tag *b);
-s_tag * tag_u16 (s_tag *tag, u16 i);
-s_tag * tag_u32 (s_tag *tag, u32 i);
-s_tag * tag_u64 (s_tag *tag, u64 i);
-s_tag * tag_u8 (s_tag *tag, u8 i);
-s_tag * tag_var (s_tag *tag);
-s_tag * tag_void (s_tag *tag);
-
-/* operators */
-s_tag * tag_add (const s_tag *a, const s_tag *b, s_tag *dest);
-bool * tag_and (const s_tag *a, const s_tag *b, bool *dest);
-s_tag * tag_band (const s_tag *a, const s_tag *b, s_tag *dest);
-s_tag * tag_bnot (const s_tag *tag, s_tag *dest);
-s_tag * tag_bor (const s_tag *a, const s_tag *b, s_tag *dest);
-s_tag * tag_brackets (s_tag *tag, const s_tag *address, s_tag *dest);
-s_tag * tag_bxor (const s_tag *a, const s_tag *b, s_tag *dest);
-s_tag * tag_div (const s_tag *a, const s_tag *b, s_tag *dest);
-bool * tag_lt (const s_tag *a, const s_tag *b, bool *dest);
-bool * tag_lte (const s_tag *a, const s_tag *b, bool *dest);
-bool * tag_gt (const s_tag *a, const s_tag *b, bool *dest);
-bool * tag_gte (const s_tag *a, const s_tag *b, bool *dest);
-bool * tag_eq (const s_tag *a, const s_tag *b, bool *dest);
-s_tag * tag_equal (const s_tag *a, const s_tag *b, s_tag *dest);
-s_tag * tag_mod (const s_tag *a, const s_tag *b, s_tag *dest);
-s_tag * tag_mul (const s_tag *a, const s_tag *b, s_tag *dest);
-s_tag * tag_neg (const s_tag *tag, s_tag *dest);
-bool * tag_not (const s_tag *tag, bool *dest);
-bool * tag_not_eq (const s_tag *a, const s_tag *b, bool *dest);
-bool * tag_or (const s_tag *a, const s_tag *b, bool *dest);
-s_tag * tag_paren (const s_tag *tag, s_tag *dest);
-s_tag * tag_shift_left (const s_tag *a, const s_tag *b, s_tag *dest);
-s_tag * tag_shift_right (const s_tag *a, const s_tag *b, s_tag *dest);
-s_tag * tag_sub (const s_tag *a, const s_tag *b, s_tag *dest);
-
-#endif /* LIBC3_TAG_H */
+#endif /* LIBC3_STRUCT_H */