docs: public RemoteTable makeRemoteTable(String strRecordClassName, String strTableSessionClassName, Map<String, Object> properties, Map<String, Object> propDatabase) throws RemoteException
      {
          Record record = (Record)ClassServiceUtility.getClassService().makeObjectFromClassName(strRecordClassName);
          if (record == null)
              return null;
          if (strTableSessionClassName == null)
              this.setMasterSlave(RecordOwner.SLAVE); // If no table is specified, TableSession is a slave
          if (properties != null)
              if (properties.get(RecordMessageConstants.TABLE_NAME) != null)
                  record.setTableNames((String)properties.get(RecordMessageConstants.TABLE_NAME));
          
          Map<String,Object> propOld = this.getProperties();
          this.setProperties(propDatabase);   // This will cause the database owner to be correct (App by default, this if AUTO_COMMIT is off)
          Map<String,Object> propDBOld = this.addDatabaseProperties(propDatabase, this.getDatabaseOwner());
          BaseDatabase database = null;
          if (this.getDatabaseOwner() != null)
          {   // Always - Make sure the database is set up correctly BEFORE I create the record.
              database = (BaseDatabase)this.getDatabaseOwner().getDatabase(record.getDatabaseName(), record.getDatabaseType(), null);
              if (database != null)
              {   // Rare - only on querytables, then the database will have already been set up.
                  database.setMasterSlave(RecordOwner.SLAVE);      // Don't create client behaviors
                  if (propDatabase != null)
                  {
                      propDatabase.remove(DBParams.MESSAGES_TO_REMOTE);   // Don't copy these down
                      propDatabase.remove(DBParams.CREATE_REMOTE_FILTER);
                      propDatabase.remove(DBParams.UPDATE_REMOTE_FILTER);
                      database.getProperties().putAll(propDatabase);    // Add these properties to the current db properties.
                  }
              }
          }
          record.init(this);
          if (database == null)
          {   // Better late then never
              database = record.getTable().getDatabase();
              if (database != null)
              {   // Rare - only on querytables, then the database will have already been set up.
                  database.setMasterSlave(RecordOwner.SLAVE);      // Don't create client behaviors
                  if (propDatabase != null)
                      database.getProperties().putAll(propDatabase);    // Add these properties to the current db properties.
              }            
          }
          this.getDatabaseOwner().setProperties(propDBOld);
          this.setProperties(propOld);
          this.setMasterSlave(-1);    //Back to default
          RemoteTable remoteTable = null;
          if (strTableSessionClassName != null)
          	remoteTable = (TableSession)ClassServiceUtility.getClassService().makeObjectFromClassName(strTableSessionClassName);
          try   {
              if (remoteTable == null)
                  remoteTable = new TableSession();
              this.removeRecord(record);  // Record should belong to the TableSessionObject. (I just added it to this, so it could access the environment)
              ((TableSession)remoteTable).init(this, record, null);
          } catch (Exception ex)  {
              remoteTable = null;
          }
          if (remoteTable != null)
              if (properties != null)
              {
                  for (String strName : properties.keySet())
                  {
                      String strValue = (String)properties.get(strName);
                      try {
                          remoteTable.setRemoteProperty(strName, strValue);
                      } catch (RemoteException ex)    {
                          // Never
                      }
                  }
              }
          return remoteTable;        
      }