diff --git a/packages/bootstrap/bootstraptablewidget.pp b/packages/bootstrap/bootstraptablewidget.pp
index 9d394ff..310971f 100644
--- a/packages/bootstrap/bootstraptablewidget.pp
+++ b/packages/bootstrap/bootstraptablewidget.pp
@@ -10,17 +10,31 @@ type
 
   TCustomDBBootstrapTableWidget = Class;
 
-  TColumnRenderMode = (crmText, crmNumeric, crmDateTime, crmTransformedValue, crmCheckBox, crmButton, crmCustom);
+  TColumnRenderMode = (crmText, crmNumeric, crmDateTime, crmTransformedValue, crmCheckBox, crmButton, crmCustom, crmSelect);
   TColumnButtonType = (cbtInfo, cbtEdit, cbtDelete, cbtCustom);
 
   TDataTablesFieldMap = Class(TObject)
   Private
-    FRow: TJSArray;
     FFieldDefs: TFieldDefs;
   Public
-    Function GetValueByName(S: String): JSValue;
+    Function GetValueByName(S: String): JSValue; virtual; abstract;
   end;
 
+  TArrayDataTablesFieldMap = Class(TDataTablesFieldMap)
+  Private
+    FRow: TJSArray;
+  Public
+    Function GetValueByName(S: String): JSValue; override;
+  end;
+
+  TObjectDataTablesFieldMap = Class(TDataTablesFieldMap)
+  Private
+    FRow: TJSObject;
+  Public
+    Function GetValueByName(S: String): JSValue; override;
+  end;
+
+
   TOnCustomValueEvent = procedure(Sender: TObject; Fields: TDataTablesFieldMap; out aOutput: String) of object;
   TOnFormatEvent = procedure(Sender: TObject; Data: JSValue; row: TJSObject; RowIndex : Integer; Field : string; out aOutput: JSValue);
   TSortOrderMethod = function(Sender: TObject; Data: JSValue): Integer;
@@ -149,6 +163,7 @@ type
 
   TOnCreatedRowEvent = reference to function(row: TJSNode; Data: TJSArray; dataIndex: Integer): JSValue;
   TRowSelectEvent = Procedure(Sender : TObject; aRow : TJSObject; aField : String) of object;
+  TCheckRowEvent = Procedure(Sender : TObject; aRow : TJSObject) of object;
 
   { TTableDataLink }
 
@@ -188,6 +203,7 @@ type
   TCustomDBBootstrapTableWidget = class(TWebWidget)
   private
     FAfterBodyDraw: TNotifyEvent;
+    FOnCheckRow: TCheckRowEvent;
     FOnDoubleClickRow: TRowSelectEvent;
     FStylingClasses: TStylingClasses;
     FLink : TTableDataLink;
@@ -202,8 +218,9 @@ type
     FTableViewOptions: TBSTableViewOptions;
     FShowSearch: Boolean;
     FReadOnly: Boolean;
-    procedure DoDoubleClickRow(aRow: TJSOBject; El: TJSHTMLElement;
-      aField: String);
+    FTableCreated : Boolean;
+    procedure DoDoubleClickRow(aRow: TJSOBject; El: TJSHTMLElement; aField: String);
+    procedure DoCheckRow(aRow: TJSOBject; El: TJSHTMLElement);
     function GetData: TJSArray;
     function GetDataFromDataset: TJSArray;
     function GetDataset: TDataset;
@@ -228,6 +245,7 @@ type
     Procedure ActiveChanged; virtual;
     function HTMLTag: String; override;
     procedure DoAfterBodyDraw(aData : JSValue);
+    procedure ApplyOtherOptions(aOptions: TBootstrapTableOptions);
     procedure ApplyPaginationOptions(aOptions: TBootstrapTableOptions); virtual;
     procedure ApplySearchOptions(aOptions: TBootstrapTableOptions); virtual;
     procedure ApplyViewOptions(aOptions: TBootstrapTableOptions); virtual;
@@ -299,6 +317,8 @@ type
     Property AfterBodyDraw : TNotifyEvent Read FAfterBodyDraw Write FAfterBodyDraw;
     // Called when the user double-clicks a row
     Property OnDoubleClickRow : TRowSelectEvent Read FOnDoubleClickRow Write FOnDoubleClickRow;
+    // Called when the user selects a record
+    Property OnCheckRow : TCheckRowEvent Read FOnCheckRow Write FOnCheckRow;
    end;
 
   TDBBootstrapTableWidget = class(TCustomDBBootstrapTableWidget)
@@ -314,6 +334,7 @@ type
     property DisplayReadOnly;
     Property AfterBodyDraw;
     Property OnDoubleClickRow;
+    Property OnCheckRow;
   end;
 
 Const
@@ -502,7 +523,12 @@ Var
 
 begin
   if Datasource.Dataset is TBaseJSONDataset then
-    Result:=TRowsDataset(Datasource.Dataset).Rows
+    begin
+    Result:=TJSArray(TRowsDataset(Datasource.Dataset).Rows).filter(function (el : jsvalue; Index : NativeInt; aArr : TJSArray) : boolean
+      begin
+        Result:=isDefined(el);
+      end);
+    end
   else
     With Datasource.Dataset do
       begin
@@ -557,11 +583,17 @@ end;
 procedure TCustomDBBootstrapTableWidget.DoDoubleClickRow(aRow: TJSOBject;
   El: TJSHTMLElement; aField: String);
 begin
-  Writeln('In double click of row');
   if Assigned(FOnDoubleClickRow) then
     FOnDoubleClickRow(Self,aRow,aField);
 end;
 
+procedure TCustomDBBootstrapTableWidget.DoCheckRow(aRow: TJSOBject;
+  El: TJSHTMLElement);
+begin
+  if Assigned(FOnCheckRow) then
+    FOnCheckRow(Self,aRow);
+end;
+
 function TCustomDBBootstrapTableWidget.GetDatasource : TDataSource;
 begin
   Result:=FLink.DataSource;
@@ -628,7 +660,7 @@ end;
 function TCustomDBBootstrapTableWidget.MakeTransformValueCol(aCol: TBootstrapTableColumn; aTableCol: TBSTableColumn): TBootstrapTableColumn;
 
 var
-   F:TDataTablesFieldMap;
+   F : TObjectDataTablesFieldMap;
 
   function renderCallBack(Data: JSValue; row: TJSObject; RowIndex : Integer; Field : string): JSValue;
 
@@ -637,6 +669,7 @@ var
 
   begin
     Res:='';
+    F.FRow:=Row;
     if Assigned(aTableCol.OnTransformValue) then
       aTableCol.OnTransformValue(aTableCol, F, Res);
     Result:=Res;
@@ -644,7 +677,7 @@ var
 
 begin
   Result:=aCol;
-  F:=TDataTablesFieldMap.Create;
+  F:=TObjectDataTablesFieldMap.Create;
   F.FFieldDefs:=Datasource.DataSet.FieldDefs;
   Result.Formatter := @renderCallBack;
 end;
@@ -911,6 +944,8 @@ begin
         MakeDateTimeRenderCol(aColumn, aCol);
       crmNumeric:
         MakeNumericRenderCol(aColumn, aCol);
+      crmSelect:
+        aColumn.checkbox:=True;
     end;
     Result[I] := aColumn;
   end;
@@ -968,6 +1003,21 @@ begin
     end;
 end;
 
+procedure TCustomDBBootstrapTableWidget.ApplyOtherOptions(
+  aOptions: TBootstrapTableOptions);
+
+begin
+  aOptions.clickToSelect:=(btoClickToSelect in Options);
+  aOptions.escape:=(btoEscapeHTML in Options);
+  aOptions.singleSelect:=(btoSingleSelect in Options);
+  aOptions.resizable:=(btoResizable in Options);
+  aOptions.multipleSelectRow:=(btoMultipleSelectRow in Options);
+  aOptions.rememberOrder:=(btoRememberOrder in Options);
+  aOptions.resizable:=(btoResizable in Options);
+  aOptions.detailViewByClick:=(btoDetailViewByClick in Options);
+end;
+
+
 procedure TCustomDBBootstrapTableWidget.ConfigureOptions(
   aOptions: TBootstrapTableOptions);
 Var
@@ -978,9 +1028,11 @@ begin
   ApplySearchOptions(aOptions);
   ApplyPaginationOptions(aOptions);
   ApplyViewOptions(aOptions);
+  ApplyOtherOptions(aOptions);
   aOptions.Data := Data;
   aOptions.onPostBody:=@DoAfterBodyDraw;
   aOptions.onDblClickRow:=@DoDoubleClickRow;
+  aOptions.onCheck:=@DoCheckRow;
 end;
 
 
@@ -1101,8 +1153,9 @@ end;
 
 procedure TCustomDBBootstrapTableWidget.RefreshData;
 begin
-  Data:=Nil;
-  Refresh;
+  FData:=Nil; // Force re-fetch at next occasion
+  if IsRendered then
+    JQuery('#'+ElementID).BootstrapTable('load',GetData)
 end;
 
 
@@ -1110,6 +1163,7 @@ procedure TCustomDBBootstrapTableWidget.UnRender;
 
 begin
   JQuery('#'+ElementID).BootstrapTable('destroy');
+  FTableCreated:=False;
 end;
 
 procedure TCustomDBBootstrapTableWidget.ApplyWidgetSettings(aElement: TJSHTMLElement);
@@ -1120,8 +1174,11 @@ var
 begin
   aOptions:=TBootstrapTableOptions.New;
   ConfigureOptions(aOptions);
-  JQuery(aElement).BootstrapTable(aOptions);
-  // JQuery('#'+ElementID).BootstrapTable('refresh');
+  if FTableCreated then
+    JQuery('#'+aElement.ID).BootstrapTable('refreshOptions',aOptions)
+  else
+    JQuery(aElement).BootstrapTable(aOptions);
+  FTableCreated:=True;
 end;
 
 function TCustomDBBootstrapTableWidget.IsOptionsStored: Boolean;
@@ -1149,17 +1206,29 @@ begin
   Result:=ViewOptions<>DefaultViewOptions;
 end;
 
-{ TDataTablesFieldMap }
+{ TArrayDataTablesFieldMap }
 
-function TDataTablesFieldMap.GetValueByName(S: String): JSValue;
+function TArrayDataTablesFieldMap.GetValueByName(S: String): JSValue;
 Var
   fld: TFieldDef;
 begin
   fld:=FFieldDefs.Find(S);
-  if Assigned(fld) then
+  if Assigned(fld) and assigned(FRow) then
     Result:=FRow[fld.Index]
   else
     Result:=Null;
 end;
 
+function TObjectDataTablesFieldMap.GetValueByName(S: String): JSValue;
+Var
+  fld: TFieldDef;
+begin
+  fld:=FFieldDefs.Find(S);
+  if Assigned(fld) and assigned(FRow) then
+    Result:=FRow[fld.name]
+  else
+    Result:=Null;
+end;
+
+
 end.