diff --git a/auth/auth-cass/docker/backup/backup.sh b/auth/auth-cass/docker/backup/backup.sh
new file mode 100644
index 0000000..db59d16
--- /dev/null
+++ b/auth/auth-cass/docker/backup/backup.sh
@@ -0,0 +1,28 @@
+# BEGIN Store prev
+if [ -e "6day" ]; then
+   rm -Rf 6day
+fi
+
+PREV=6day
+for D in 5day 4day 3day 2day yesterday; do
+   if [ -e "$D" ]; then
+      mv "$D" "$PREV"
+   fi
+   PREV="$D"
+done
+
+if [ -e "today" ]; then
+    mv today yesterday
+    gzip yesterday/*
+fi
+
+# END Store prev
+date
+docker exec -t aaf_cass bash -c "mkdir -p /opt/app/cass_backup"
+docker container cp cbackup.sh aaf_cass:/opt/app/cass_backup/backup.sh
+# echo "login as Root, then run \nbash /opt/app/cass_backup/backup.sh"
+docker exec -t aaf_cass bash /opt/app/cass_backup/backup.sh
+mkdir today
+docker container cp aaf_cass:/opt/app/cass_backup/. today
+
+date
diff --git a/auth/auth-cass/docker/backup/cbackup.sh b/auth/auth-cass/docker/backup/cbackup.sh
new file mode 100644
index 0000000..9c91d0c
--- /dev/null
+++ b/auth/auth-cass/docker/backup/cbackup.sh
@@ -0,0 +1,8 @@
+cd /opt/app/cass_backup
+DATA="ns role perm ns_attrib user_role cred cert x509 delegate approval approved future notify artifact health history"
+PWD=cassandra
+CQLSH="cqlsh -u cassandra -k authz -p $PWD"
+for T in $DATA ; do
+    echo "Creating $T.dat"
+    $CQLSH -e  "COPY authz.$T TO '$T.dat' WITH DELIMITER='|'"
+done
diff --git a/auth/auth-core/src/main/java/org/onap/aaf/auth/local/TextIndex.java b/auth/auth-core/src/main/java/org/onap/aaf/auth/local/TextIndex.java
index 4cf2dd5..6ef6a76 100644
--- a/auth/auth-core/src/main/java/org/onap/aaf/auth/local/TextIndex.java
+++ b/auth/auth-core/src/main/java/org/onap/aaf/auth/local/TextIndex.java
@@ -125,65 +125,70 @@
 	}
 	
 	public void create(final Trans trans,final DataFile data, int maxLine, char delim, int fieldOffset, int skipLines) throws IOException {
-		RandomAccessFile raf;
 		FileChannel fos;
 		
 		List<Idx> list = new LinkedList<Idx>(); // Some hashcodes will double... DO NOT make a set
 		TimeTaken tt2 = trans.start("Open Files", Env.SUB);
+		RandomAccessFile raf=null;
 		try {
-			raf = new RandomAccessFile(file,"rw");
-			raf.setLength(0L);
-			fos = raf.getChannel();
-		} finally {
-			tt2.done();
-		}
-		
-		try {
-			
-			Token t = data.new Token(maxLine);  
-			Field f = t.new Field(delim);
-			
-			int count = 0;
-			if(skipLines>0) {
-				trans.info().log("Skipping",skipLines,"line"+(skipLines==1?" in":"s in"),data.file().getName());
-			}
-			for(int i=0;i<skipLines;++i) {
-				t.nextLine();
-			}
-			tt2 = trans.start("Read", Env.SUB);
 			try {
-				while(t.nextLine()) {
-					list.add(new Idx(f.at(fieldOffset),t.pos()));
-					++count;
-				}
+				raf = new RandomAccessFile(file,"rw");
+				raf.setLength(0L);
+				fos = raf.getChannel();
 			} finally {
 				tt2.done();
 			}
-			trans.checkpoint("    Read " + count + " records");
-			tt2 = trans.start("Sort List", Env.SUB);
-			Collections.sort(list);
-			tt2.done();
-			tt2 = trans.start("Write Idx", Env.SUB);
+			
 			try {
-				ByteBuffer bb = ByteBuffer.allocate(8*1024);
-				IntBuffer ib = bb.asIntBuffer();
-				for(Idx idx : list) {
-					if(!ib.hasRemaining()) {
-						fos.write(bb);
-						ib.clear();
-						bb.rewind();
+				
+				Token t = data.new Token(maxLine);  
+				Field f = t.new Field(delim);
+				
+				int count = 0;
+				if(skipLines>0) {
+					trans.info().log("Skipping",skipLines,"line"+(skipLines==1?" in":"s in"),data.file().getName());
+				}
+				for(int i=0;i<skipLines;++i) {
+					t.nextLine();
+				}
+				tt2 = trans.start("Read", Env.SUB);
+				try {
+					while(t.nextLine()) {
+						list.add(new Idx(f.at(fieldOffset),t.pos()));
+						++count;
 					}
-					ib.put(idx.hash);
-					ib.put(idx.pos);
+				} finally {
+					tt2.done();
 				}
-				bb.limit(4*ib.position());
-				fos.write(bb);
-			} finally {
+				trans.checkpoint("    Read " + count + " records");
+				tt2 = trans.start("Sort List", Env.SUB);
+				Collections.sort(list);
 				tt2.done();
-			}
+				tt2 = trans.start("Write Idx", Env.SUB);
+				try {
+					ByteBuffer bb = ByteBuffer.allocate(8*1024);
+					IntBuffer ib = bb.asIntBuffer();
+					for(Idx idx : list) {
+						if(!ib.hasRemaining()) {
+							fos.write(bb);
+							ib.clear();
+							bb.rewind();
+						}
+						ib.put(idx.hash);
+						ib.put(idx.pos);
+					}
+					bb.limit(4*ib.position());
+					fos.write(bb);
+				} finally {
+					tt2.done();
+				}
+			} finally {
+				fos.close();
+			} 
 		} finally {
-			fos.close();
-			raf.close(); // closed by fos
+			if(raf!=null) {
+				raf.close(); // closed by fos
+			}
 		}
 	}
 	
