Index: oup/current/Code/DataStructures.pas
===================================================================
--- oup/current/Code/DataStructures.pas	(revision 86)
+++ oup/current/Code/DataStructures.pas	(revision 87)
@@ -3,5 +3,5 @@
 interface
 
-uses SysUtils, Classes, Data, Dialogs, StrUtils;
+uses SysUtils, Classes, Data, Dialogs, StrUtils, OniDataClass;
 
 type
@@ -34,5 +34,5 @@
     Subs:   array of TStructDefSub;
   end;
-  THandler = function(fileid: LongWord): TRawList;
+  THandler = function(connection: TOniData; fileid: LongWord): TRawList;
 
   TRawListHandlers = record
@@ -47,5 +47,5 @@
 
 
-function LoadStructureDefinition(fileid: LongWord): TStructDef;
+function LoadStructureDefinition(connection: TOniData; fileid: LongWord): TStructDef;
 function GetDataType(typeid: Word): String;
 function GetTypeDataLength(datatype: Word): Word;
@@ -53,5 +53,5 @@
 implementation
 
-uses Functions, OniDataClass, Forms, Template;
+uses Functions, Forms, Template;
 
 
@@ -120,5 +120,5 @@
 
 
-function AGDB(fileid: LongWord): TRawList;
+function AGDB(connection: TOniData; fileid: LongWord): TRawList;
 var
   link:  LongWord;
@@ -126,7 +126,7 @@
   i:     LongWord;
 begin
-  if not OniDataConnection.OSisMac then
-  begin
-    OniDataConnection.LoadDatFilePart(fileid, $1C, 4, @links);
+  if not connection.OSisMac then
+  begin
+    connection.LoadDatFilePart(fileid, $1C, 4, @links);
     links := links * 2;
     SetLength(Result, links);
@@ -134,5 +134,5 @@
     begin
       Result[i].src_offset := $20 + i * 4;
-      OniDataConnection.LoadDatFilePart(fileid, $20 + i * 4, 4, @link);
+      connection.LoadDatFilePart(fileid, $20 + i * 4, 4, @link);
       Result[i].raw_addr := link;
       Result[i].raw_size := 0{????????????????????????????????};
@@ -145,5 +145,5 @@
 
 
-function AKVA(fileid: LongWord): TRawList;
+function AKVA(connection: TOniData; fileid: LongWord): TRawList;
 var
   link:  LongWord;
@@ -151,14 +151,14 @@
   i:     LongWord;
 begin
-  if not OniDataConnection.OSisMac then
-  begin
-    OniDataConnection.LoadDatFilePart(fileid, $1C, 4, @links);
+  if not connection.OSisMac then
+  begin
+    connection.LoadDatFilePart(fileid, $1C, 4, @links);
     SetLength(Result, links);
     for i := 0 to links - 1 do
     begin
       Result[i].src_offset := $20 + i * $74 + $24;
-      OniDataConnection.LoadDatFilePart(fileid, $20 + i * $74 + $24, 4, @link);
+      connection.LoadDatFilePart(fileid, $20 + i * $74 + $24, 4, @link);
       Result[i].raw_addr := link;
-      OniDataConnection.LoadDatFilePart(fileid, $20 + i * $74 + $28, 4, @link);
+      connection.LoadDatFilePart(fileid, $20 + i * $74 + $28, 4, @link);
       Result[i].raw_size := link;
       Result[i].loc_sep  := False;
@@ -170,11 +170,28 @@
 
 
-function BINA(fileid: LongWord): TRawList;
+function BINA(connection: TOniData; fileid: LongWord): TRawList;
 var
   link:     LongWord;
   datasize: LongWord;
 begin
-  OniDataConnection.LoadDatFilePart(fileid, $0C, 4, @link);
-  OniDataConnection.LoadDatFilePart(fileid, $08, 4, @datasize);
+  connection.LoadDatFilePart(fileid, $0C, 4, @link);
+  connection.LoadDatFilePart(fileid, $08, 4, @datasize);
+  SetLength(Result, 1);
+  Result[0].src_offset := $0C;
+  Result[0].raw_addr   := link;
+  Result[0].raw_size   := datasize;
+  Result[0].loc_sep    := connection.OSisMac;
+end;
+
+
+
+
+function OSBD(connection: TOniData; fileid: LongWord): TRawList;
+var
+  link:     LongWord;
+  datasize: LongWord;
+begin
+  connection.LoadDatFilePart(fileid, $08, 4, @datasize);
+  connection.LoadDatFilePart(fileid, $0C, 4, @link);
   SetLength(Result, 1);
   Result[0].src_offset := $0C;
@@ -187,37 +204,20 @@
 
 
-function OSBD(fileid: LongWord): TRawList;
+function SNDD(connection: TOniData; fileid: LongWord): TRawList;
 var
   link:     LongWord;
   datasize: LongWord;
 begin
-  OniDataConnection.LoadDatFilePart(fileid, $08, 4, @datasize);
-  OniDataConnection.LoadDatFilePart(fileid, $0C, 4, @link);
   SetLength(Result, 1);
-  Result[0].src_offset := $0C;
-  Result[0].raw_addr   := link;
-  Result[0].raw_size   := datasize;
-  Result[0].loc_sep    := OniDataConnection.OSisMac;
-end;
-
-
-
-
-function SNDD(fileid: LongWord): TRawList;
-var
-  link:     LongWord;
-  datasize: LongWord;
-begin
-  SetLength(Result, 1);
-  if not OniDataConnection.OSisMac then
-  begin
-    OniDataConnection.LoadDatFilePart(fileid, $40, 4, @datasize);
-    OniDataConnection.LoadDatFilePart(fileid, $44, 4, @link);
+  if not connection.OSisMac then
+  begin
+    connection.LoadDatFilePart(fileid, $40, 4, @datasize);
+    connection.LoadDatFilePart(fileid, $44, 4, @link);
     Result[0].src_offset := $44;
   end
   else
   begin
-    OniDataConnection.LoadDatFilePart(fileid, $10, 4, @datasize);
-    OniDataConnection.LoadDatFilePart(fileid, $14, 4, @link);
+    connection.LoadDatFilePart(fileid, $10, 4, @datasize);
+    connection.LoadDatFilePart(fileid, $14, 4, @link);
     Result[0].src_offset := $14;
   end;
@@ -230,5 +230,5 @@
 
 
-function SUBT(fileid: LongWord): TRawList;
+function SUBT(connection: TOniData; fileid: LongWord): TRawList;
 var
   baselink, lastlink: LongWord;
@@ -237,11 +237,11 @@
   Data:  Tdata;
 begin
-  OniDataConnection.LoadDatFilePart(fileid, $18, 4, @baselink);
-  OniDataConnection.LoadDatFilePart(fileid, $1C, 4, @links);
+  connection.LoadDatFilePart(fileid, $18, 4, @baselink);
+  connection.LoadDatFilePart(fileid, $1C, 4, @links);
   if links > 0 then
   begin
-    OniDataConnection.LoadDatFilePart(fileid, $20 + (links - 1) * 4, 4, @lastlink);
+    connection.LoadDatFilePart(fileid, $20 + (links - 1) * 4, 4, @lastlink);
     SetLength(Data, lastlink + 1024);
-    TOniDataDat(OniDataConnection).LoadRawOffset(False,
+    TOniDataDat(connection).LoadRawOffset(False,
       baselink, lastlink + 1024, Data);
     //      OniDataConnection.LoadRawFile(fileid,$1C,baselink,lastlink+1024,False,@data[0]);
@@ -274,5 +274,5 @@
 
 
-function TRAM(fileid: LongWord): TRawList;
+function TRAM(connection: TOniData; fileid: LongWord): TRawList;
 var
   i:      Integer;
@@ -287,41 +287,41 @@
 begin
   SetLength(Result, 13);
-  OniDataConnection.LoadDatFilePart(fileid, $16C, 2, @frames);
+  connection.LoadDatFilePart(fileid, $16C, 2, @frames);
   {y-pos}
-  OniDataConnection.LoadDatFilePart(fileid, $0C, 4, @link);
+  connection.LoadDatFilePart(fileid, $0C, 4, @link);
   Result[0].src_offset := $0C;
   Result[0].raw_addr   := link;
   Result[0].raw_size   := frames * 4;
   {x-z-pos}
-  OniDataConnection.LoadDatFilePart(fileid, $10, 4, @link);
+  connection.LoadDatFilePart(fileid, $10, 4, @link);
   Result[1].src_offset := $10;
   Result[1].raw_addr   := link;
   Result[1].raw_size   := frames * 8;
   {attacks}
-  OniDataConnection.LoadDatFilePart(fileid, $182, 1, @tempb);
-  OniDataConnection.LoadDatFilePart(fileid, $14, 4, @link);
+  connection.LoadDatFilePart(fileid, $182, 1, @tempb);
+  connection.LoadDatFilePart(fileid, $14, 4, @link);
   Result[2].src_offset := $14;
   Result[2].raw_addr   := link;
   Result[2].raw_size   := tempb * 32;
   {damage}
-  OniDataConnection.LoadDatFilePart(fileid, $183, 1, @tempb);
-  OniDataConnection.LoadDatFilePart(fileid, $18, 4, @link);
+  connection.LoadDatFilePart(fileid, $183, 1, @tempb);
+  connection.LoadDatFilePart(fileid, $18, 4, @link);
   Result[3].src_offset := $18;
   Result[3].raw_addr   := link;
   Result[3].raw_size   := tempb * 8;
   {motionblur}
-  OniDataConnection.LoadDatFilePart(fileid, $184, 1, @tempb);
-  OniDataConnection.LoadDatFilePart(fileid, $1C, 4, @link);
+  connection.LoadDatFilePart(fileid, $184, 1, @tempb);
+  connection.LoadDatFilePart(fileid, $1C, 4, @link);
   Result[4].src_offset := $1C;
   Result[4].raw_addr   := link;
   Result[4].raw_size   := tempb * 8;
   {shortcut}
-  OniDataConnection.LoadDatFilePart(fileid, $185, 1, @tempb);
-  OniDataConnection.LoadDatFilePart(fileid, $20, 4, @link);
+  connection.LoadDatFilePart(fileid, $185, 1, @tempb);
+  connection.LoadDatFilePart(fileid, $20, 4, @link);
   Result[5].src_offset := $20;
   Result[5].raw_addr   := link;
   Result[5].raw_size   := tempb * 8;
   {throw}
-  OniDataConnection.LoadDatFilePart(fileid, $24, 4, @link);
+  connection.LoadDatFilePart(fileid, $24, 4, @link);
   Result[6].src_offset := $24;
   Result[6].raw_addr   := link;
@@ -331,41 +331,41 @@
     Result[6].raw_size := 0;
   {footstep}
-  OniDataConnection.LoadDatFilePart(fileid, $186, 1, @tempb);
-  OniDataConnection.LoadDatFilePart(fileid, $28, 4, @link);
+  connection.LoadDatFilePart(fileid, $186, 1, @tempb);
+  connection.LoadDatFilePart(fileid, $28, 4, @link);
   Result[7].src_offset := $28;
   Result[7].raw_addr   := link;
   Result[7].raw_size   := tempb * 4;
   {particle}
-  OniDataConnection.LoadDatFilePart(fileid, $187, 1, @tempb);
-  OniDataConnection.LoadDatFilePart(fileid, $2C, 4, @link);
+  connection.LoadDatFilePart(fileid, $187, 1, @tempb);
+  connection.LoadDatFilePart(fileid, $2C, 4, @link);
   Result[8].src_offset := $2C;
   Result[8].raw_addr   := link;
   Result[8].raw_size   := tempb * 24;
   {position}
-  OniDataConnection.LoadDatFilePart(fileid, $30, 4, @link);
+  connection.LoadDatFilePart(fileid, $30, 4, @link);
   Result[9].src_offset := $30;
   Result[9].raw_addr   := link;
   Result[9].raw_size   := frames * 8;
   {particle}
-  OniDataConnection.LoadDatFilePart(fileid, $154, 2, @tempw);
-  OniDataConnection.LoadDatFilePart(fileid, $38, 4, @link);
+  connection.LoadDatFilePart(fileid, $154, 2, @tempw);
+  connection.LoadDatFilePart(fileid, $38, 4, @link);
   Result[11].src_offset := $38;
   Result[11].raw_addr   := link;
   Result[11].raw_size   := tempw * 34;
   {extent}
-  OniDataConnection.LoadDatFilePart(fileid, $138, 4, @templ);
-  OniDataConnection.LoadDatFilePart(fileid, $13C, 4, @link);
+  connection.LoadDatFilePart(fileid, $138, 4, @templ);
+  connection.LoadDatFilePart(fileid, $13C, 4, @link);
   Result[12].src_offset := $13C;
   Result[12].raw_addr   := link;
   Result[12].raw_size   := templ * 12;
 
-  OniDataConnection.LoadDatFilePart(fileid, $34, 4, @link);
+  connection.LoadDatFilePart(fileid, $34, 4, @link);
   if link > 0 then
   begin
-    OniDataConnection.LoadDatFilePart(fileid, $160, 2, @tempw);
+    connection.LoadDatFilePart(fileid, $160, 2, @tempw);
     frame_count := 0;
     i := 0;
     SetLength(Data, $FFFF);
-    TOniDataDat(OniDataConnection).LoadRawOffset(False, link, $FFFF, Data);
+    TOniDataDat(connection).LoadRawOffset(False, link, $FFFF, Data);
     offset := Data[$24] + Data[$25] * 256;
     while (offset + i < Length(Data)) and (frame_count < frames - 1) do
@@ -392,5 +392,5 @@
 
 
-function TXMP(fileid: LongWord): TRawList;
+function TXMP(connection: TOniData; fileid: LongWord): TRawList;
 var
   link_pc:   LongWord;
@@ -400,9 +400,9 @@
   datasize:  LongWord;
 begin
-  OniDataConnection.LoadDatFilePart(fileid, $8C, SizeOf(x), @x);
-  OniDataConnection.LoadDatFilePart(fileid, $8E, SizeOf(y), @y);
-  OniDataConnection.LoadDatFilePart(fileid, $90, SizeOf(storetype), @storetype);
-  OniDataConnection.LoadDatFilePart(fileid, $9C, 4, @link_pc);
-  OniDataConnection.LoadDatFilePart(fileid, $A0, 4, @link_mac);
+  connection.LoadDatFilePart(fileid, $8C, SizeOf(x), @x);
+  connection.LoadDatFilePart(fileid, $8E, SizeOf(y), @y);
+  connection.LoadDatFilePart(fileid, $90, SizeOf(storetype), @storetype);
+  connection.LoadDatFilePart(fileid, $9C, 4, @link_pc);
+  connection.LoadDatFilePart(fileid, $A0, 4, @link_mac);
   case storetype of
     0, 1, 2:
@@ -414,5 +414,5 @@
   end;
   SetLength(Result, 1);
-  if not OniDataConnection.OSisMac then
+  if not connection.OSisMac then
   begin
     Result[0].src_offset := $9C;
@@ -425,5 +425,5 @@
   end;
   Result[0].raw_size := datasize;
-  Result[0].loc_sep  := OniDataConnection.OSisMac;
+  Result[0].loc_sep  := connection.OSisMac;
 end;
 
@@ -444,5 +444,5 @@
 
 
-function LoadStructureDefinition(fileid: LongWord): TStructDef;
+function LoadStructureDefinition(connection: TOniData; fileid: LongWord): TStructDef;
 var
   i:      LongWord;
@@ -461,9 +461,9 @@
   SetLength(Result.Subs, 0);
   Result.Data := False;
-  ext      := OniDataConnection.GetFileInfo(fileid).Extension;
+  ext      := connection.GetFileInfo(fileid).Extension;
   filename := ExtractFilePath(Application.ExeName) + '\StructDefs\' + ext + '.txt';
   if FileExists(filename) then
   begin
-    Data := OniDataConnection.LoadDatFile(fileid);
+    Data := connection.LoadDatFile(fileid);
     AssignFile(deffile, filename);
     Reset(deffile);
Index: oup/current/Code/OniDataClass.pas
===================================================================
--- oup/current/Code/OniDataClass.pas	(revision 86)
+++ oup/current/Code/OniDataClass.pas	(revision 87)
@@ -1,5 +1,5 @@
 unit OniDataClass;
 interface
-uses Data, DataStructures, Classes, SysUtils, StrUtils,
+uses Data, Classes, SysUtils, StrUtils,
   Dialogs, ABSDecUtil, ABSMain, DB, Windows;
 
@@ -21,5 +21,5 @@
     procedure Close; virtual; abstract;
 
-    function GetFileInfo(fileid: LongWord): TFileInfo; virtual; abstract;
+    function GetFileInfo(fileid: Integer): TFileInfo; virtual;
     function GetFilesList(ext: String; pattern: String;
       NoEmptyFiles: Boolean; sort: TSortType): TStringArray; virtual; abstract;
@@ -73,5 +73,5 @@
     procedure Close; override;
 
-    function GetFileInfo(fileid: LongWord): TFileInfo; override;
+    function GetFileInfo(fileid: Integer): TFileInfo; override;
     function GetFilesList(ext: String; pattern: String;
       NoEmptyFiles: Boolean; sort: TSortType): TStringArray; override;
@@ -112,5 +112,5 @@
     procedure UpdateListCache;
     //      function GetDatLinks(srcid:LongWord):TDatLinks;
-    function GetFileInfo(fileid: LongWord): TFileInfo; override;
+    function GetFileInfo(fileid: Integer): TFileInfo; override;
     function GetFilesList(ext: String; pattern: String;
       NoEmptyFiles: Boolean; sort: TSortType): TStringArray; override;
@@ -142,29 +142,5 @@
     constructor Create(OLDBFilename: String; var Result: Boolean); override;
     procedure Close; override;
-{
-    procedure UpdateListCache;
-    //      function GetDatLinks(srcid:LongWord):TDatLinks;
-    function GetFileInfo(fileid: LongWord): TFileInfo; override;
-    function GetFilesList(ext: String; pattern: String;
-      NoEmptyFiles: Boolean; sort: TSortType): TStringArray; override;
-    function GetFilesCount: LongWord; override;
-    function GetExtensionsList: TStringArray; override;
-    function GetExtendedExtensionsList: TExtensionsMap; override;
-    function GetNamedFilesMap: TNamedFilesMap;
-
-    function LoadDatFile(fileid: LongWord): Tdata; override;
-    procedure UpdateDatFile(fileid: LongWord; Data: Tdata); override;
-    procedure LoadDatFilePart(fileid, offset, size: LongWord; target: Pointer); override;
-    procedure UpdateDatFilePart(fileid, offset, size: LongWord; target: Pointer); override;
-
-    function GetRawList(fileid: LongWord): TRawList; override;
-    procedure LoadRawFile(fileid, dat_offset: LongWord; target: Pointer); override;
-    procedure UpdateRawFile(fileid, dat_offset: LongWord; size: LongWord;
-      target: Pointer); override;
-    procedure LoadRawFilePart(fileid, dat_offset: LongWord;
-      offset, size: LongWord; target: Pointer); override;
-    procedure UpdateRawFilePart(fileid, dat_offset: LongWord;
-      offset, size: LongWord; target: Pointer); override;
-}  published
+  published
   end;
 
@@ -181,4 +157,5 @@
 function CreateDataConnection(filename: String; backend: Integer): TOniData;
 procedure CloseDataConnection(connection: TOniData);
+function GetEmptyFileInfo: TFileInfo;
 
 
@@ -187,5 +164,5 @@
 
 implementation
-uses Functions;
+uses DataStructures, Functions;
 
 
@@ -252,4 +229,16 @@
 
 
+function TOniData.GetFileInfo(fileid: Integer): TFileInfo;
+begin
+  Result.ID := -1;
+  Result.FileName := '';
+  Result.FileNameHex := '';
+  Result.Extension := '';
+  Result.Name := '';
+  Result.Size := 0;
+  Result.FileType := 0;
+  Result.DatAddr := 0;
+  Result.opened := False;
+end;
 
 
@@ -378,6 +367,11 @@
 
 
-function TOniDataDat.GetFileInfo(fileid: LongWord): TFileInfo;
-begin
+function TOniDataDat.GetFileInfo(fileid: Integer): TFileInfo;
+begin
+  if fileid = -1 then
+  begin
+    Result := inherited GetFileInfo(fileid);
+    Exit;
+  end;
   if fileid < Self.GetFilesCount then
     Result    := Fdat_files[fileid]
@@ -592,5 +586,5 @@
       if RawListHandlers[i].needed then
       begin
-        Result := RawListHandlers[i].Handler(fileid);
+        Result := RawListHandlers[i].Handler(Self, fileid);
         Break;
       end
@@ -961,8 +955,13 @@
 
 
-function TOniDataADB.GetFileInfo(fileid: LongWord): TFileInfo;
+function TOniDataADB.GetFileInfo(fileid: Integer): TFileInfo;
 var
   i: Integer;
 begin
+  if fileid = -1 then
+  begin
+    Result := inherited GetFileInfo(fileid);
+    Exit;
+  end;
   if fileid < Self.GetFilesCount then
   begin
@@ -1484,5 +1483,5 @@
         begin
           DataConnections[i].Close;
-          DataConnections[i].Free;
+//          DataConnections[i].Free;
           DataConnections[i] := nil;
           found := True;
@@ -1500,4 +1499,18 @@
 
 
+function GetEmptyFileInfo: TFileInfo;
+begin
+  Result.ID := -1;
+  Result.FileName := '';
+  Result.FileNameHex := '';
+  Result.Extension := '';
+  Result.Name := '';
+  Result.Size := 0;
+  Result.FileType := 0;
+  Result.DatAddr := 0;
+  Result.opened := False;
+end;
+
+
 
 
Index: oup/current/Main.dfm
===================================================================
--- oup/current/Main.dfm	(revision 86)
+++ oup/current/Main.dfm	(revision 87)
@@ -202,4 +202,8 @@
           end
         end
+      end
+      object menu_conns: TTBSubmenuItem
+        Caption = 'Connections'
+        Enabled = False
       end
       object menu_About: TTBItem
Index: oup/current/Main.pas
===================================================================
--- oup/current/Main.pas	(revision 86)
+++ oup/current/Main.pas	(revision 87)
@@ -75,4 +75,5 @@
     tb_opendb: TTBItem;
     Images_Close: TImageList;
+    menu_conns: TTBSubmenuItem;
     procedure UpdateConLists;
     procedure LoadFile(typedb: Boolean);
@@ -103,4 +104,5 @@
     procedure menu_view_statusbarClick(Sender: TObject);
     procedure menu_view_toolbarClick(Sender: TObject);
+    procedure menu_conns_itemClick(Sender: TObject);
     procedure MDITabDrawTab(Control: TCustomTabControl; TabIndex: Integer;
       const Rect: TRect; Active: Boolean);
@@ -166,4 +168,5 @@
   end;
   UpdateStatBar;
+  UpdateConLists;
 end;
 
@@ -226,4 +229,5 @@
   pt.Y := Y;
   tabIndex := MDITab.GetTabAtPos(pt);
+  hint := '';
 
   if tabIndex >= 0 then
@@ -231,10 +235,14 @@
     if MDITab.MDIChildren[tabIndex] is TForm_ToolTemplate then
     begin
-      hint := 'Window: ' + MDITab.MDIChildren[tabIndex].Caption + #13+#10 +
-            'Selected File: ';
+      if TForm_ToolTemplate(MDITab.MDIChildren[tabIndex]).Connection <> nil then
+        hint := 'Connection: ' +
+              ExtractFileName(TForm_ToolTemplate(MDITab.MDIChildren[tabIndex]).Connection.FileName) + #13+#10
+      else
+        hint := 'Connection: none' + #13+#10;
       if TForm_ToolTemplate(MDITab.MDIChildren[tabIndex]).SelectedFile.ID >= 0 then
-        hint := hint + TForm_ToolTemplate(MDITab.MDIChildren[tabIndex]).SelectedFile.FileName
+        hint := hint + 'Selected File: ' +
+              TForm_ToolTemplate(MDITab.MDIChildren[tabIndex]).SelectedFile.FileName
       else
-        hint := hint + 'None';
+        hint := hint + 'Selected File: none';
     end
     else
@@ -320,9 +328,10 @@
   begin
     Self.Caption      := 'Oni Un/Packer ' + version;
-    statbar.Panels.Items[0].Text := 'Nothing loaded';
-    statbar.Panels.Items[1].Text := 'Files: -';
-    statbar.Panels.Items[2].Text := 'Extensions: -';
+    statbar.Panels.Items[0].Text := '';
+    statbar.Panels.Items[1].Text := 'Connections: -';
+    statbar.Panels.Items[2].Text := '';
     ActivateTools(False);
   end;
+  menu_conns.Enabled := Length(DataConnections) > 0;
 end;
 
@@ -363,11 +372,47 @@
 
 
+procedure TForm_Main.menu_conns_itemClick(Sender: TObject);
+var
+  name: String;
+  i: Integer;
+begin
+  name := TTBItem(Sender).Caption;
+  if MessageBox(Handle, PChar('Do you really want to close data-connection to' +#13+#10+
+        name + '?'), PChar('Close?'), MB_YESNO + MB_ICONQUESTION) = ID_YES then
+  begin
+    for i := 0 to High(DataConnections) do
+      if ExtractFileName(DataConnections[i].FileName) = name then
+      begin
+        CloseDataConnection(DataConnections[i]);
+        Break;
+      end;
+  end;
+  UpdateConLists;
+end;
+
+
 procedure TForm_Main.UpdateConLists;
 var
   i: Integer;
-begin
-  for i := 0 to MDITab.MDIChildCount - 1 do
-    if MDITab.MDIChildren[i] is TForm_ToolTemplate then
-      TForm_ToolTemplate(MDITab.MDIChildren[i]).UpdateList;
+  entry: TTBItem;
+begin
+  if MDITab.MDIChildCount > 0 then
+    for i := 0 to MDITab.MDIChildCount - 1 do
+      if MDITab.MDIChildren[i] is TForm_ToolTemplate then
+        TForm_ToolTemplate(MDITab.MDIChildren[i]).UpdateList;
+
+  menu_conns.Clear;
+  if Length(DataConnections) > 0 then
+  begin
+    for i := 0 to High(DataConnections) do
+    begin
+      entry := TTBItem.Create(menu_conns);
+      entry.Caption := ExtractFileName(DataConnections[i].FileName);
+      entry.Name := 'menu_conn_' + IntToStr(i);
+      entry.OnClick := menu_conns_itemClick;
+      menu_conns.Add(entry);
+      entry := nil;
+    end;
+  end;
 end;
 
Index: oup/current/Tools/BinEdit.dfm
===================================================================
--- oup/current/Tools/BinEdit.dfm	(revision 86)
+++ oup/current/Tools/BinEdit.dfm	(revision 87)
@@ -4,8 +4,12 @@
   OnCloseQuery = FormCloseQuery
   OnKeyUp = FormKeyUp
-  ExplicitWidth = 500
-  ExplicitHeight = 450
   PixelsPerInch = 96
   TextHeight = 13
+  inherited panel_files: TPanel
+    inherited filelist: TListBox
+      ExplicitTop = 153
+      ExplicitHeight = 270
+    end
+  end
   inherited content: TPanel
     object Splitter2: TSplitter
Index: oup/current/Tools/BinEdit.pas
===================================================================
--- oup/current/Tools/BinEdit.pas	(revision 86)
+++ oup/current/Tools/BinEdit.pas	(revision 87)
@@ -57,5 +57,5 @@
     procedure value_viewer_contextPopup(Sender: TObject);
   private
-    fileid: LongWord;
+    fileid: Integer;
   public
   end;
@@ -291,5 +291,5 @@
   if VST.RootNodeCount = 0 then
   begin
-    structs := LoadStructureDefinition(fileid);
+    structs := LoadStructureDefinition(Connection, fileid);
     if structs.Data then
     begin
Index: oup/current/Tools/Preview.dfm
===================================================================
--- oup/current/Tools/Preview.dfm	(revision 86)
+++ oup/current/Tools/Preview.dfm	(revision 87)
@@ -3,4 +3,10 @@
   PixelsPerInch = 96
   TextHeight = 13
+  inherited panel_files: TPanel
+    inherited filelist: TListBox
+      ExplicitTop = 153
+      ExplicitHeight = 270
+    end
+  end
   inherited content: TPanel
     object lbl_notpossible: TLabel
Index: oup/current/Tools/Preview.pas
===================================================================
--- oup/current/Tools/Preview.pas	(revision 86)
+++ oup/current/Tools/Preview.pas	(revision 87)
@@ -32,5 +32,5 @@
     bitmaps:   array of TBitmap;
     actualimg: Byte;
-    _fileid:   LongWord;
+    _fileid:   Integer;
   public
   end;
@@ -55,17 +55,27 @@
 begin
   _fileid := fileinfo.ID;
-  lbl_notpossible.Visible := False;
-  Self.img.Visible := True;
-  Self.timer.Enabled := False;
-  Self.panel_buttons.Visible := False;
-  ext     := fileinfo.Extension;
-  if (ext = 'PSpc') or (ext = 'TXMB') or (ext = 'TXMP') then
-    PreviewImage
-  else if ext = 'TXAN' then
-    PreviewTXAN
-  else
-  begin
-    Self.lbl_notpossible.Visible := True;
+  if _fileid >= 0 then
+  begin
+    lbl_notpossible.Visible := False;
+    Self.img.Visible := True;
+    Self.timer.Enabled := False;
+    Self.panel_buttons.Visible := False;
+    ext     := fileinfo.Extension;
+    if (ext = 'PSpc') or (ext = 'TXMB') or (ext = 'TXMP') then
+      PreviewImage
+    else if ext = 'TXAN' then
+      PreviewTXAN
+    else
+    begin
+      Self.lbl_notpossible.Visible := True;
+      Self.img.Visible := False;
+    end;
+  end
+  else
+  begin
     Self.img.Visible := False;
+    lbl_notpossible.Visible := False;
+    Self.timer.Enabled := False;
+    Self.panel_buttons.Visible := False;
   end;
 end;
Index: oup/current/Tools/Template.pas
===================================================================
--- oup/current/Tools/Template.pas	(revision 86)
+++ oup/current/Tools/Template.pas	(revision 87)
@@ -102,19 +102,38 @@
 begin
   oldcon := combo_connection.Items.Strings[combo_connection.ItemIndex];
+  combo_connection.ItemIndex := -1;
   combo_connection.Items.Clear;
-  for i := 0 to High(DataConnections) do
-  begin
-    level := DataConnections[i].LevelInfo.LevelNumber;
-    fn := ExtractFileName(DataConnections[i].FileName);
-    if DataConnections[i].Backend = ODB_Dat then
-      datatype := 'ONI-.dat: '
-    else if DataConnections[i].Backend = ODB_ADB then
-      datatype := 'OUP-DB: '
-    else
-      datatype := 'Unknown: ';
-    boxstring := datatype + fn + ' (Level: ' + IntToStr(level) + ')';
-    combo_connection.Items.Add(boxstring);
-    if oldcon = boxstring then
-      combo_connection.ItemIndex := combo_connection.Items.Count - 1;
+  if Length(DataConnections) > 0 then
+  begin
+    for i := 0 to High(DataConnections) do
+    begin
+      level := DataConnections[i].LevelInfo.LevelNumber;
+      fn := ExtractFileName(DataConnections[i].FileName);
+      if DataConnections[i].Backend = ODB_Dat then
+        datatype := 'ONI-.dat: '
+      else if DataConnections[i].Backend = ODB_ADB then
+        datatype := 'OUP-DB: '
+      else
+        datatype := 'Unknown: ';
+      boxstring := datatype + fn + ' (Level: ' + IntToStr(level) + ')';
+      combo_connection.Items.Add(boxstring);
+      if oldcon = boxstring then
+        combo_connection.ItemIndex := combo_connection.Items.Count - 1;
+    end;
+    if combo_connection.ItemIndex = -1 then
+    begin
+      combo_connection.ItemIndex := 0;
+      combo_connectionChange(Self);
+    end;
+  end
+  else
+  begin
+    FConnection := nil;
+    filelist.Items.Clear;
+    combo_extension.Items.Clear;
+    combo_connectionChange(Self);
+    FSelectedFile := GetEmptyFileInfo;
+    if Assigned(FOnNewFileSelected) then
+      FOnNewFileSelected(FSelectedFile);
   end;
 end;
@@ -127,19 +146,29 @@
 begin
   combo_connection.Items.Clear;
-  for i := 0 to High(DataConnections) do
-  begin
-    level := DataConnections[i].LevelInfo.LevelNumber;
-    fn := ExtractFileName(DataConnections[i].FileName);
-    if DataConnections[i].Backend = ODB_Dat then
-      datatype := 'ONI-.dat: '
-    else if DataConnections[i].Backend = ODB_ADB then
-      datatype := 'OUP-DB: '
-    else
-      datatype := 'Unknown: ';
-    combo_connection.Items.Add(datatype + fn + ' (Level: ' + IntToStr(level) + ')');
-  end;
-  FConnection := DataConnections[0];
-  combo_connection.ItemIndex := 0;
-  combo_connectionChange(Self);
+  if Length(DataConnections) > 0 then
+  begin
+    for i := 0 to High(DataConnections) do
+    begin
+      level := DataConnections[i].LevelInfo.LevelNumber;
+      fn := ExtractFileName(DataConnections[i].FileName);
+      if DataConnections[i].Backend = ODB_Dat then
+        datatype := 'ONI-.dat: '
+      else if DataConnections[i].Backend = ODB_ADB then
+        datatype := 'OUP-DB: '
+      else
+        datatype := 'Unknown: ';
+      combo_connection.Items.Add(datatype + fn + ' (Level: ' + IntToStr(level) + ')');
+    end;
+    FConnection := DataConnections[0];
+    combo_connection.ItemIndex := 0;
+    combo_connectionChange(Self);
+  end
+  else
+  begin
+    FConnection := nil;
+    filelist.Items.Clear;
+    combo_extension.Items.Clear;
+    combo_connectionChange(Self);
+  end;
 end;
 
@@ -150,18 +179,21 @@
 begin
   combo_extension.Items.Clear;
-  combo_extension.Items.Add('_All files_ (' +
-    IntToStr(FConnection.GetFilesCount) + ')');
-  exts := FConnection.GetExtensionsList;
-  for i := 0 to High(exts) do
-    if Length(FAllowedExts) > 0 then
-    begin
-      if Pos(MidStr(exts[i],1,4), FAllowedExts) > 0 then
+  if FConnection <> nil then
+  begin
+    combo_extension.Items.Add('_All files_ (' +
+      IntToStr(FConnection.GetFilesCount) + ')');
+    exts := FConnection.GetExtensionsList;
+    for i := 0 to High(exts) do
+      if Length(FAllowedExts) > 0 then
       begin
+        if Pos(MidStr(exts[i],1,4), FAllowedExts) > 0 then
+        begin
+          combo_extension.Items.Add(exts[i]);
+        end;
+      end else
         combo_extension.Items.Add(exts[i]);
-      end;
-    end else
-      combo_extension.Items.Add(exts[i]);
-  combo_extension.ItemIndex := 0;
-  combo_extensionClick(Self);
+    combo_extension.ItemIndex := 0;
+    combo_extensionClick(Self);
+  end;
 end;
 
@@ -177,23 +209,26 @@
   i: LongWord;
 begin
-  Extension := MidStr(combo_extension.Items.Strings[combo_extension.ItemIndex], 1, 4);
-  no_zero_bytes := not check_zerobyte.Checked;
-  pattern := '';
-  if check_filtername.Checked then
-    pattern := edit_filtername.Text;
-  if Extension = '_All' then
-    if Length(FAllowedExts) > 0 then
-      Extension := FAllowedExts
-    else
-      Extension := '';
-
-  files := FConnection.GetFilesList(extension, pattern, no_zero_bytes, FSortBy);
-
-  filelist.Visible := False;
-  filelist.Items.Clear;
-  if Length(files) > 0 then
-    for i := 0 to High(files) do
-      filelist.Items.Add(files[i]);
-  filelist.Visible := True;
+  if FConnection <> nil then
+  begin
+    Extension := MidStr(combo_extension.Items.Strings[combo_extension.ItemIndex], 1, 4);
+    no_zero_bytes := not check_zerobyte.Checked;
+    pattern := '';
+    if check_filtername.Checked then
+      pattern := edit_filtername.Text;
+    if Extension = '_All' then
+      if Length(FAllowedExts) > 0 then
+        Extension := FAllowedExts
+      else
+        Extension := '';
+
+    files := FConnection.GetFilesList(extension, pattern, no_zero_bytes, FSortBy);
+
+    filelist.Visible := False;
+    filelist.Items.Clear;
+    if Length(files) > 0 then
+      for i := 0 to High(files) do
+        filelist.Items.Add(files[i]);
+    filelist.Visible := True;
+  end;
 end;
 
@@ -296,8 +331,5 @@
   inherited;
   RecreateList;
-  FConnection := nil;
-  FSelectedFile.ID := -1;
-  FSelectedFile.FileName := '';
-  FSelectedFile.FileNameHex := '';
+  FSelectedFile := GetEmptyFileInfo;
   if Length(ToolList) > 0 then
   begin
