diff --git a/junction.py b/junction.py
new file mode 100644
index 0000000000000000000000000000000000000000..2fd908335aee80ec69cb86c524a221f5fc279b1f
--- /dev/null
+++ b/junction.py
@@ -0,0 +1,54 @@
+# Ryan McShane
+
+from qiskit import *
+
+
+def conjunction(circuit, q, L, R, T):
+    # Implements X1 /\ X3 /\ X5 /\ X6 = X7
+
+    circuit.ccx(q[0], q[1], q[T[0]])
+    tIndex = 0
+    lIndex = 2
+    circuit.barrier(q)
+    while lIndex < (len(L)-1):
+        circuit.ccx(q[L[lIndex]], q[T[tIndex]], q[T[tIndex+1]])
+        lIndex += 1
+        tIndex += 1
+        circuit.barrier(q)
+    circuit.ccx(q[L[lIndex]], q[T[tIndex]], q[R])
+    # Undo
+    while lIndex > 2:
+        lIndex -= 1
+        tIndex -= 1
+        circuit.ccx(q[L[lIndex]], q[T[tIndex]], q[T[tIndex+1]])
+        circuit.barrier(q)
+    circuit.ccx(q[0], q[1], q[T[0]])
+
+def disjunction(circuit, q, L, R, T):
+    circuit.x(q[0])
+    circuit.x(q[1])
+    circuit.ccx(q[0], q[1], q[T[0]])
+    circuit.barrier(q)
+    tIndex = 0
+    lIndex = 2
+    while lIndex < (len(L) - 1):
+        circuit.x(q[L[lIndex]])
+        circuit.ccx(q[L[lIndex]], q[T[tIndex]], q[T[tIndex + 1]])
+        lIndex += 1
+        tIndex += 1
+        circuit.barrier(q)
+    circuit.x(q[L[lIndex]])
+    circuit.ccx(q[L[lIndex]], q[T[tIndex]], q[R])
+    circuit.x(q[R])
+
+    circuit.barrier(q)
+    # Undo
+    while lIndex > 2:
+        lIndex -= 1
+        tIndex -= 1
+        circuit.ccx(q[L[lIndex]], q[T[tIndex]], q[T[tIndex + 1]])
+        circuit.x(q[L[lIndex]])
+        circuit.barrier(q)
+    circuit.ccx(q[0], q[1], q[T[0]])
+    circuit.x(q[1])
+    circuit.x(q[0])
diff --git a/logic_gates.py b/logic_gates.py
index 740c5327a4b3822798f82bb19a85a9de2fdb715a..7e367a0660cb1c0763a8fff90d3f2d9e10da3ea6 100644
--- a/logic_gates.py
+++ b/logic_gates.py
@@ -1,11 +1,11 @@
 # Ryan McShane
 # Logic Gates Modules
 
-    # AND, OR, XOR, NAND, NOR, XNOR
-def and(circuit, A, B, result):
+# AND, OR, XOR, NAND, NOR, XNOR
+def AND(circuit, q, A, B, result):
     circuit.ccx(q[A], q[B], q[result])
 
-def or(circuit, A, B, result):
+def OR(circuit, q, A, B, result):
     circuit.x(q[A])
     circuit.x(q[B])
     circuit.ccx(q[result])
@@ -14,36 +14,40 @@ def or(circuit, A, B, result):
     circuit.x(q[B])
     circuit.x(q[A])
 
-def nand(circuit, A, B, result):
+
+def NAND(circuit, q, A, B, result):
     circuit.ccx(q[A], q[B], q[result])
     circuit.x(q[result])
 
-def nor(circuit, A, B, result):
+
+def NOR(circuit, q, A, B, result):
     circuit.x(q[A])
     circuit.x(q[B])
     circuit.ccx(q[result])
-
+    # Undo
     circuit.x(q[B])
     circuit.x(q[A])
 
-def xor(circuit, A, B, result, t1, t2, t3):
-    nand(circuit, q[A], q[B], q[t1])
+
+def XOR(circuit, q, A, B, result, t1, t2, t3):
+    NAND(circuit, q[A], q[B], q[t1])
     circuit.x(q[t1])
-    nand(circuit, q[A], q[t1], q[t2])
+    NAND(circuit, q[A], q[t1], q[t2])
     circuit.x(q[t2])
-    nand(circuit, q[B], q[t1], q[t3])
+    NAND(circuit, q[B], q[t1], q[t3])
     circuit.x(q[t3])
-    nand(circuit, q[t2], q[t3], q[result])
+    NAND(circuit, q[t2], q[t3], q[result])
     circuit.x(q[result])
-
+    # Undo
     circuit.x(q[t3])
-    nand(circuit, q[B], q[t1], q[t3])
+    NAND(circuit, q[B], q[t1], q[t3])
     circuit.x(q[t2])
-    nand(circuit, q[A], q[t1], q[t2])
+    NAND(circuit, q[A], q[t1], q[t2])
     circuit.x(q[t1])
-    nand(circuit, q[A], q[B], q[t1])
+    NAND(circuit, q[A], q[B], q[t1])
 
-def xnor(circuit, a, b, result, R, At, Bt):
-    xor(circuit, a, b, result, R, At, Bt)
-    circuit.x(q[result])
 
+def XNOR(circuit, q, a, b, result, R, At, Bt):
+    # circuit, q = quantum register, a, b, result, R = first NAND, At=second NAND, Bt = third NAND
+    XOR(circuit, a, b, result, R, At, Bt)
+    circuit.x(q[result]) # Just XOR negated