diff --git a/.gitignore b/.gitignore
index cc7fb82..d008566 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,7 +22,6 @@ ic3/ic3.debug
.libs/
*.lo
*.o
-test/*.facts
test/ic3/*.diff
test/ic3/*.err
test/ic3/*.out
diff --git a/test/facts_test_open_file.1.expected.facts b/test/facts_test_open_file.1.expected.facts
new file mode 100644
index 0000000..849c5b3
--- /dev/null
+++ b/test/facts_test_open_file.1.expected.facts
@@ -0,0 +1,75 @@
+%{module: C3.Facts.Save,
+ version: 0x0000000000000001}
+%{module: C3.Facts.Dump,
+ version: 0x0000000000000001,
+ count: 0x0000000000000017}
+{a, a, a}
+{-18446744073709551616, -18446744073709551616, -18446744073709551616}
+{18446744073709551616, 18446744073709551616, 18446744073709551616}
+{-4294967296, -4294967296, -4294967296}
+{-65536, -65536, -65536}
+{-256, -256, -256}
+{-10, -10, -10}
+{-1, -1, -1}
+{0, 0, 0}
+{1, 1, 1}
+{10, 10, 10}
+{256, 256, 256}
+{65536, 65536, 65536}
+{4294967296, 4294967296, 4294967296}
+{[], [], []}
+{[[], []], [[], []], [[], []]}
+{"a", "a", "a"}
+{A, A, A}
+{:a, :a, :a}
+{{a, b}, {a, b}, {a, b}}
+{{:a, :b}, {:a, :b}, {:a, :b}}
+{{{a, b}, {c, d}}, {{a, b}, {c, d}}, {{a, b}, {c, d}}}
+{{{:a, :b}, {:c, :d}}, {{:a, :b}, {:c, :d}}, {{:a, :b}, {:c, :d}}}
+%{hash: 0x12B617E8ED748848}
+remove {"a", "a", "a"}
+remove {:a, :a, :a}
+remove {A, A, A}
+remove {a, a, a}
+remove {[], [], []}
+remove {[[], []], [[], []], [[], []]}
+remove {{:a, :b}, {:a, :b}, {:a, :b}}
+remove {{{:a, :b}, {:c, :d}}, {{:a, :b}, {:c, :d}}, {{:a, :b}, {:c, :d}}}
+remove {{a, b}, {a, b}, {a, b}}
+remove {{{a, b}, {c, d}}, {{a, b}, {c, d}}, {{a, b}, {c, d}}}
+remove {0, 0, 0}
+remove {1, 1, 1}
+remove {10, 10, 10}
+remove {256, 256, 256}
+remove {65536, 65536, 65536}
+remove {4294967296, 4294967296, 4294967296}
+remove {18446744073709551616, 18446744073709551616, 18446744073709551616}
+remove {-1, -1, -1}
+remove {-10, -10, -10}
+remove {-256, -256, -256}
+remove {-65536, -65536, -65536}
+remove {-4294967296, -4294967296, -4294967296}
+remove {-18446744073709551616, -18446744073709551616, -18446744073709551616}
+add {"b", "b", "b"}
+add {:b, :b, :b}
+add {B, B, B}
+add {b, b, b}
+add {[[]], [[]], [[]]}
+add {[[[]], []], [[[]], []], [[[]], []]}
+add {{:b, :b}, {:b, :b}, {:b, :b}}
+add {{{:b, :b}, {:c, :d}}, {{:b, :b}, {:c, :d}}, {{:b, :b}, {:c, :d}}}
+add {{b, b}, {b, b}, {b, b}}
+add {{{b, b}, {c, d}}, {{b, b}, {c, d}}, {{b, b}, {c, d}}}
+add {2, 2, 2}
+add {3, 3, 3}
+add {11, 11, 11}
+add {257, 257, 257}
+add {65537, 65537, 65537}
+add {4294967297, 4294967297, 4294967297}
+add {18446744073709551617, 18446744073709551617, 18446744073709551617}
+add {-2, -2, -2}
+add {-11, -11, -11}
+add {-257, -257, -257}
+add {-65537, -65537, -65537}
+add {-4294967297, -4294967297, -4294967297}
+add {-18446744073709551617, -18446744073709551617, -18446744073709551617}
diff --git a/test/facts_test_open_file.1.in.facts b/test/facts_test_open_file.1.in.facts
new file mode 100644
index 0000000..442f3c6
--- /dev/null
+++ b/test/facts_test_open_file.1.in.facts
@@ -0,0 +1,29 @@
+%{module: C3.Facts.Save,
+ version: 0x0000000000000001}
+%{module: C3.Facts.Dump,
+ version: 0x0000000000000001,
+ count: 0x0000000000000017}
+{a, a, a}
+{-18446744073709551616, -18446744073709551616, -18446744073709551616}
+{18446744073709551616, 18446744073709551616, 18446744073709551616}
+{-4294967296, -4294967296, -4294967296}
+{-65536, -65536, -65536}
+{-256, -256, -256}
+{-10, -10, -10}
+{-1, -1, -1}
+{0, 0, 0}
+{1, 1, 1}
+{10, 10, 10}
+{256, 256, 256}
+{65536, 65536, 65536}
+{4294967296, 4294967296, 4294967296}
+{[], [], []}
+{[[], []], [[], []], [[], []]}
+{"a", "a", "a"}
+{A, A, A}
+{:a, :a, :a}
+{{a, b}, {a, b}, {a, b}}
+{{:a, :b}, {:a, :b}, {:a, :b}}
+{{{a, b}, {c, d}}, {{a, b}, {c, d}}, {{a, b}, {c, d}}}
+{{{:a, :b}, {:c, :d}}, {{:a, :b}, {:c, :d}}, {{:a, :b}, {:c, :d}}}
+%{hash: 0x12B617E8ED748848}
diff --git a/test/facts_test_open_file.2.expected.facts b/test/facts_test_open_file.2.expected.facts
new file mode 100644
index 0000000..e88f68e
--- /dev/null
+++ b/test/facts_test_open_file.2.expected.facts
@@ -0,0 +1,52 @@
+%{module: C3.Facts.Save,
+ version: 0x0000000000000001}
+%{module: C3.Facts.Dump,
+ version: 0x0000000000000001,
+ count: 0x0000000000000017}
+{a, a, a}
+{-18446744073709551616, -18446744073709551616, -18446744073709551616}
+{18446744073709551616, 18446744073709551616, 18446744073709551616}
+{-4294967296, -4294967296, -4294967296}
+{-65536, -65536, -65536}
+{-256, -256, -256}
+{-10, -10, -10}
+{-1, -1, -1}
+{0, 0, 0}
+{1, 1, 1}
+{10, 10, 10}
+{256, 256, 256}
+{65536, 65536, 65536}
+{4294967296, 4294967296, 4294967296}
+{[], [], []}
+{[[], []], [[], []], [[], []]}
+{"a", "a", "a"}
+{A, A, A}
+{:a, :a, :a}
+{{a, b}, {a, b}, {a, b}}
+{{:a, :b}, {:a, :b}, {:a, :b}}
+{{{a, b}, {c, d}}, {{a, b}, {c, d}}, {{a, b}, {c, d}}}
+{{{:a, :b}, {:c, :d}}, {{:a, :b}, {:c, :d}}, {{:a, :b}, {:c, :d}}}
+%{hash: 0x12B617E8ED748848}
+add {b, b, b}
+add {-18446744073709551617, -18446744073709551617, -18446744073709551617}
+add {18446744073709551617, 18446744073709551617, 18446744073709551617}
+add {-4294967297, -4294967297, -4294967297}
+add {-65537, -65537, -65537}
+add {-257, -257, -257}
+add {-11, -11, -11}
+add {-2, -2, -2}
+add {2, 2, 2}
+add {3, 3, 3}
+add {11, 11, 11}
+add {257, 257, 257}
+add {65537, 65537, 65537}
+add {4294967297, 4294967297, 4294967297}
+add {[[]], [[]], [[]]}
+add {[[[]], []], [[[]], []], [[[]], []]}
+add {"b", "b", "b"}
+add {B, B, B}
+add {:b, :b, :b}
+add {{b, b}, {b, b}, {b, b}}
+add {{:b, :b}, {:b, :b}, {:b, :b}}
+add {{{b, b}, {c, d}}, {{b, b}, {c, d}}, {{b, b}, {c, d}}}
+add {{{:b, :b}, {:c, :d}}, {{:b, :b}, {:c, :d}}, {{:b, :b}, {:c, :d}}}
diff --git a/test/facts_test_open_file.2.in.facts b/test/facts_test_open_file.2.in.facts
new file mode 100644
index 0000000..e88f68e
--- /dev/null
+++ b/test/facts_test_open_file.2.in.facts
@@ -0,0 +1,52 @@
+%{module: C3.Facts.Save,
+ version: 0x0000000000000001}
+%{module: C3.Facts.Dump,
+ version: 0x0000000000000001,
+ count: 0x0000000000000017}
+{a, a, a}
+{-18446744073709551616, -18446744073709551616, -18446744073709551616}
+{18446744073709551616, 18446744073709551616, 18446744073709551616}
+{-4294967296, -4294967296, -4294967296}
+{-65536, -65536, -65536}
+{-256, -256, -256}
+{-10, -10, -10}
+{-1, -1, -1}
+{0, 0, 0}
+{1, 1, 1}
+{10, 10, 10}
+{256, 256, 256}
+{65536, 65536, 65536}
+{4294967296, 4294967296, 4294967296}
+{[], [], []}
+{[[], []], [[], []], [[], []]}
+{"a", "a", "a"}
+{A, A, A}
+{:a, :a, :a}
+{{a, b}, {a, b}, {a, b}}
+{{:a, :b}, {:a, :b}, {:a, :b}}
+{{{a, b}, {c, d}}, {{a, b}, {c, d}}, {{a, b}, {c, d}}}
+{{{:a, :b}, {:c, :d}}, {{:a, :b}, {:c, :d}}, {{:a, :b}, {:c, :d}}}
+%{hash: 0x12B617E8ED748848}
+add {b, b, b}
+add {-18446744073709551617, -18446744073709551617, -18446744073709551617}
+add {18446744073709551617, 18446744073709551617, 18446744073709551617}
+add {-4294967297, -4294967297, -4294967297}
+add {-65537, -65537, -65537}
+add {-257, -257, -257}
+add {-11, -11, -11}
+add {-2, -2, -2}
+add {2, 2, 2}
+add {3, 3, 3}
+add {11, 11, 11}
+add {257, 257, 257}
+add {65537, 65537, 65537}
+add {4294967297, 4294967297, 4294967297}
+add {[[]], [[]], [[]]}
+add {[[[]], []], [[[]], []], [[[]], []]}
+add {"b", "b", "b"}
+add {B, B, B}
+add {:b, :b, :b}
+add {{b, b}, {b, b}, {b, b}}
+add {{:b, :b}, {:b, :b}, {:b, :b}}
+add {{{b, b}, {c, d}}, {{b, b}, {c, d}}, {{b, b}, {c, d}}}
+add {{{:b, :b}, {:c, :d}}, {{:b, :b}, {:c, :d}}, {{:b, :b}, {:c, :d}}}
diff --git a/test/facts_test_open_file.3.expected.facts b/test/facts_test_open_file.3.expected.facts
new file mode 100644
index 0000000..fc578b8
--- /dev/null
+++ b/test/facts_test_open_file.3.expected.facts
@@ -0,0 +1,98 @@
+%{module: C3.Facts.Save,
+ version: 0x0000000000000001}
+%{module: C3.Facts.Dump,
+ version: 0x0000000000000001,
+ count: 0x0000000000000017}
+{a, a, a}
+{-18446744073709551616, -18446744073709551616, -18446744073709551616}
+{18446744073709551616, 18446744073709551616, 18446744073709551616}
+{-4294967296, -4294967296, -4294967296}
+{-65536, -65536, -65536}
+{-256, -256, -256}
+{-10, -10, -10}
+{-1, -1, -1}
+{0, 0, 0}
+{1, 1, 1}
+{10, 10, 10}
+{256, 256, 256}
+{65536, 65536, 65536}
+{4294967296, 4294967296, 4294967296}
+{[], [], []}
+{[[], []], [[], []], [[], []]}
+{"a", "a", "a"}
+{A, A, A}
+{:a, :a, :a}
+{{a, b}, {a, b}, {a, b}}
+{{:a, :b}, {:a, :b}, {:a, :b}}
+{{{a, b}, {c, d}}, {{a, b}, {c, d}}, {{a, b}, {c, d}}}
+{{{:a, :b}, {:c, :d}}, {{:a, :b}, {:c, :d}}, {{:a, :b}, {:c, :d}}}
+%{hash: 0x12B617E8ED748848}
+remove {a, a, a}
+remove {-18446744073709551616, -18446744073709551616, -18446744073709551616}
+remove {18446744073709551616, 18446744073709551616, 18446744073709551616}
+remove {-4294967296, -4294967296, -4294967296}
+remove {-65536, -65536, -65536}
+remove {-256, -256, -256}
+remove {-10, -10, -10}
+remove {-1, -1, -1}
+remove {0, 0, 0}
+remove {1, 1, 1}
+remove {10, 10, 10}
+remove {256, 256, 256}
+remove {65536, 65536, 65536}
+remove {4294967296, 4294967296, 4294967296}
+remove {[], [], []}
+remove {[[], []], [[], []], [[], []]}
+remove {"a", "a", "a"}
+remove {A, A, A}
+remove {:a, :a, :a}
+remove {{a, b}, {a, b}, {a, b}}
+remove {{:a, :b}, {:a, :b}, {:a, :b}}
+remove {{{a, b}, {c, d}}, {{a, b}, {c, d}}, {{a, b}, {c, d}}}
+remove {{{:a, :b}, {:c, :d}}, {{:a, :b}, {:c, :d}}, {{:a, :b}, {:c, :d}}}
+add {"a", "a", "a"}
+add {:a, :a, :a}
+add {A, A, A}
+add {a, a, a}
+add {[], [], []}
+add {[[], []], [[], []], [[], []]}
+add {{:a, :b}, {:a, :b}, {:a, :b}}
+add {{{:a, :b}, {:c, :d}}, {{:a, :b}, {:c, :d}}, {{:a, :b}, {:c, :d}}}
+add {{a, b}, {a, b}, {a, b}}
+add {{{a, b}, {c, d}}, {{a, b}, {c, d}}, {{a, b}, {c, d}}}
+add {0, 0, 0}
+add {1, 1, 1}
+add {10, 10, 10}
+add {256, 256, 256}
+add {65536, 65536, 65536}
+add {4294967296, 4294967296, 4294967296}
+add {18446744073709551616, 18446744073709551616, 18446744073709551616}
+add {-1, -1, -1}
+add {-10, -10, -10}
+add {-256, -256, -256}
+add {-65536, -65536, -65536}
+add {-4294967296, -4294967296, -4294967296}
+add {-18446744073709551616, -18446744073709551616, -18446744073709551616}
+add {"b", "b", "b"}
+add {:b, :b, :b}
+add {B, B, B}
+add {b, b, b}
+add {[[]], [[]], [[]]}
+add {[[[]], []], [[[]], []], [[[]], []]}
+add {{:b, :b}, {:b, :b}, {:b, :b}}
+add {{{:b, :b}, {:c, :d}}, {{:b, :b}, {:c, :d}}, {{:b, :b}, {:c, :d}}}
+add {{b, b}, {b, b}, {b, b}}
+add {{{b, b}, {c, d}}, {{b, b}, {c, d}}, {{b, b}, {c, d}}}
+add {2, 2, 2}
+add {3, 3, 3}
+add {11, 11, 11}
+add {257, 257, 257}
+add {65537, 65537, 65537}
+add {4294967297, 4294967297, 4294967297}
+add {18446744073709551617, 18446744073709551617, 18446744073709551617}
+add {-2, -2, -2}
+add {-11, -11, -11}
+add {-257, -257, -257}
+add {-65537, -65537, -65537}
+add {-4294967297, -4294967297, -4294967297}
+add {-18446744073709551617, -18446744073709551617, -18446744073709551617}
diff --git a/test/facts_test_open_file.3.in.facts b/test/facts_test_open_file.3.in.facts
new file mode 100644
index 0000000..ebbeb2a
--- /dev/null
+++ b/test/facts_test_open_file.3.in.facts
@@ -0,0 +1,52 @@
+%{module: C3.Facts.Save,
+ version: 0x0000000000000001}
+%{module: C3.Facts.Dump,
+ version: 0x0000000000000001,
+ count: 0x0000000000000017}
+{a, a, a}
+{-18446744073709551616, -18446744073709551616, -18446744073709551616}
+{18446744073709551616, 18446744073709551616, 18446744073709551616}
+{-4294967296, -4294967296, -4294967296}
+{-65536, -65536, -65536}
+{-256, -256, -256}
+{-10, -10, -10}
+{-1, -1, -1}
+{0, 0, 0}
+{1, 1, 1}
+{10, 10, 10}
+{256, 256, 256}
+{65536, 65536, 65536}
+{4294967296, 4294967296, 4294967296}
+{[], [], []}
+{[[], []], [[], []], [[], []]}
+{"a", "a", "a"}
+{A, A, A}
+{:a, :a, :a}
+{{a, b}, {a, b}, {a, b}}
+{{:a, :b}, {:a, :b}, {:a, :b}}
+{{{a, b}, {c, d}}, {{a, b}, {c, d}}, {{a, b}, {c, d}}}
+{{{:a, :b}, {:c, :d}}, {{:a, :b}, {:c, :d}}, {{:a, :b}, {:c, :d}}}
+%{hash: 0x12B617E8ED748848}
+remove {a, a, a}
+remove {-18446744073709551616, -18446744073709551616, -18446744073709551616}
+remove {18446744073709551616, 18446744073709551616, 18446744073709551616}
+remove {-4294967296, -4294967296, -4294967296}
+remove {-65536, -65536, -65536}
+remove {-256, -256, -256}
+remove {-10, -10, -10}
+remove {-1, -1, -1}
+remove {0, 0, 0}
+remove {1, 1, 1}
+remove {10, 10, 10}
+remove {256, 256, 256}
+remove {65536, 65536, 65536}
+remove {4294967296, 4294967296, 4294967296}
+remove {[], [], []}
+remove {[[], []], [[], []], [[], []]}
+remove {"a", "a", "a"}
+remove {A, A, A}
+remove {:a, :a, :a}
+remove {{a, b}, {a, b}, {a, b}}
+remove {{:a, :b}, {:a, :b}, {:a, :b}}
+remove {{{a, b}, {c, d}}, {{a, b}, {c, d}}, {{a, b}, {c, d}}}
+remove {{{:a, :b}, {:c, :d}}, {{:a, :b}, {:c, :d}}, {{:a, :b}, {:c, :d}}}