diff --git a/src/main/java/uk/ac/ed/pguaglia/real/db/Database.java b/src/main/java/uk/ac/ed/pguaglia/real/db/Database.java
index 17f3655deef87acbe0200574c5ce12b7ebd14ee5..a46c6cee57e51cbbe5cd51ef9cc9dabc6633759d 100644
--- a/src/main/java/uk/ac/ed/pguaglia/real/db/Database.java
+++ b/src/main/java/uk/ac/ed/pguaglia/real/db/Database.java
@@ -27,6 +27,9 @@ public class Database {
 
 	private final static String PREFIX = "_";
 	private final static String SCHEMA_TABLE = "realschema";
+	private final static String SCHEMA_TABLE_REL = "rel";
+	private final static String SCHEMA_TABLE_ATT = "attr";
+	private final static String SCHEMA_TABLE_DEF = "def";
 
 	private File dataFile;
 	private Schema schema;
@@ -37,7 +40,8 @@ public class Database {
 		dataFile.deleteOnExit();
 		conn = DriverManager.getConnection("jdbc:sqlite:" + dataFile.getAbsolutePath());
 		var stmt = conn.createStatement();
-		stmt.execute("CREATE TABLE " + SCHEMA_TABLE + " (rel primary key, attr, def)");
+		stmt.execute(String.format("CREATE TABLE %s (%s PRIMARY KEY, %s, %s)",
+				SCHEMA_TABLE, SCHEMA_TABLE_REL, SCHEMA_TABLE_ATT, SCHEMA_TABLE_DEF));
 		conn.setAutoCommit(false);
 		schema = new Schema();
 	}
@@ -48,7 +52,7 @@ public class Database {
 		conn.setAutoCommit(false);
 		schema = new Schema();
 		var stmt = conn.createStatement();
-		var rs = stmt.executeQuery("SELECT rel, attr, def FROM " + SCHEMA_TABLE);
+		var rs = stmt.executeQuery("SELECT * FROM " + SCHEMA_TABLE);
 		while (rs.next()) {
 			String name = rs.getString(1);
 			String json = rs.getString(2);
@@ -133,7 +137,24 @@ public class Database {
 		try {
 			var stmt = conn.createStatement();
 			stmt.execute(String.format(schemaEntry,
-					stmt.enquoteIdentifier(name, true), "null", stmt.enquoteLiteral(def)));
+					stmt.enquoteIdentifier(name, false), "null", stmt.enquoteLiteral(def)));
+		} catch (SQLException e) {
+			conn.rollback();
+			throw e;
+		}
+		conn.commit();
+	}
+
+	public void drop(String name) throws Exception {
+		boolean isBaseTable = schema.hasTable(name);
+		schema.drop(name);
+		try {
+			var stmt = conn.createStatement();
+			stmt.execute(String.format("DELETE FROM %s WHERE %s = %s",
+					SCHEMA_TABLE, SCHEMA_TABLE_REL, stmt.enquoteLiteral(name)));
+			if (isBaseTable) {
+				stmt.execute("DROP TABLE " + stmt.enquoteIdentifier(Database.encode(name), false));
+			}
 		} catch (SQLException e) {
 			conn.rollback();
 			throw e;
diff --git a/src/main/java/uk/ac/ed/pguaglia/real/runtime/CommandLineApp.java b/src/main/java/uk/ac/ed/pguaglia/real/runtime/CommandLineApp.java
index 90e37e3425ae767fc03ef2cd5716eacb4d730d0e..a55b399a09b60b41bf952b7296a8d76027be2359 100644
--- a/src/main/java/uk/ac/ed/pguaglia/real/runtime/CommandLineApp.java
+++ b/src/main/java/uk/ac/ed/pguaglia/real/runtime/CommandLineApp.java
@@ -358,7 +358,7 @@ public final class CommandLineApp {
 					case DROP:
 						String name = line.strip();
 						try {
-							db.schema().drop(name);
+							db.drop(name);
 							System.out.println(String.format("INFO: deleted %s", name));
 						} catch (Exception e) {
 							System.err.println(String.format("ERROR: %s", e.getMessage()));