Sub JTB_onMessageReceived(api As Object, id As Int, msg As Object)
    bld.Initialize(api)
    Log($"JTB_onMessageReceived( ${id}, ${msg}"$)
    Dim message As Message = msg
    Log($"MessageFrom: ${message.From}"$)
    Log($"MessageAudio: ${message.Audio}"$)
    If message.Audio <> Null Then
        Dim faudio As Audio = message.Audio
        Log($"Audio.FileId = ${faudio.FileId}"$)
        Log($"Audio.Duration = ${faudio.Duration}"$)
        Log($"Audio.Performer = ${faudio.Performer}"$)
        Log($"Audio.Title = ${faudio.Title}"$)
        Log($"Audio.FileSize = ${faudio.FileSize}"$)
        Log($"Audio.MimeType = ${faudio.MimeType}"$)
        Dim tfile As TelegramFile = jtb.getFile(faudio.FileId)
        Log($"File.Size = ${tfile.FileSize}"$)
        Log($"File.Path = ${tfile.FilePath}"$)
        Dim furl As String = $"https://api.telegram.org/file/bot${bottoken}/${tfile.FilePath}"$
        Log(furl)
        File.MakeDir(File.DirApp, "music")
        Dim j As HttpJob
        j.Initialize("",Me)
        j.Download(furl)
        Wait For (j) JobDone(j As HttpJob)
        If j.Success Then
            Dim out As OutputStream = File.OpenOutput(File.DirApp, tfile.FilePath, False)
            File.Copy2(j.GetInputStream, out)
            out.Close '<------ very important
        End If
        j.Release
    End If
    Log($"MessageDocument: ${message.Document}"$)
    If message.Document <> Null Then
        Dim fdoc As Document = message.Document
        Log($"Document.FileId = ${fdoc.FileId}"$)
        Log($"Document.FileName = ${fdoc.FileName}"$)
        Log($"Document.FileSize = ${fdoc.FileSize}"$)
        Log($"Document.MimeType = ${fdoc.MimeType}"$)
        Dim tfile As TelegramFile = jtb.getFile(fdoc.FileId)
        Log($"File.Size = ${tfile.FileSize}"$)
        Log($"File.Path = ${tfile.FilePath}"$)
        Dim furl As String = $"https://api.telegram.org/file/bot${bottoken}/${tfile.FilePath}"$
        Log(furl)
        File.MakeDir(File.DirApp, "documents")
        Dim j As HttpJob
        j.Initialize("",Me)
        j.Download(furl)
        Wait For (j) JobDone(j As HttpJob)
        If j.Success Then
            Dim out As OutputStream = File.OpenOutput(File.DirApp, tfile.FilePath, False)
            File.Copy2(j.GetInputStream, out)
            out.Close '<------ very important
        End If
        j.Release
    End If
    Log($"MessageDocument: ${message.Document}"$)
    If message.Video <> Null Then
        Dim fvid As Video = message.Video
        Log($"Video.FileId = ${fvid.FileId}"$)
        Log($"Video.Duration = ${fvid.Duration}"$)
        Log($"Video.Width = ${fvid.Width}"$)
        Log($"Video.Height = ${fvid.Height}"$)
        Log($"Video.MimeType = ${fvid.MimeType}"$)
        Log($"Video.FileSize = ${fvid.FileSize}"$)
        Dim tfile As TelegramFile = jtb.getFile(fvid.FileId)
        Log($"File.Size = ${tfile.FileSize}"$)
        Log($"File.Path = ${tfile.FilePath}"$)
        Dim furl As String = $"https://api.telegram.org/file/bot${bottoken}/${tfile.FilePath}"$
        Log(furl)
        File.MakeDir(File.DirApp, "videos")
        Dim j As HttpJob
        j.Initialize("",Me)
        j.Download(furl)
        Wait For (j) JobDone(j As HttpJob)
        If j.Success Then
            Dim out As OutputStream = File.OpenOutput(File.DirApp, tfile.FilePath, False)
            File.Copy2(j.GetInputStream, out)
            out.Close '<------ very important
        End If
        j.Release
    End If
    Dim from As User = message.From
    Log($"FromFirstName: ${from.FirstName}"$)
    Log($"FromLastName: ${from.LastName}"$)
    Log($"FromUserName: ${from.Username}"$)
    Log($"FromID: ${from.Id}"$)
    If message.Photo <> Null Then
        Log($"Photosizes: ${message.Photo}"$)
        Dim phsi As List = message.Photo
        If phsi.IsInitialized And phsi.Size > 0 Then
            For i= 0 To phsi.Size-1
                Dim photo As PhotoSize = phsi.Get(i)
                Log(photo)
                Log(photo.FileId)
                Dim tfile As TelegramFile = jtb.getFile(photo.FileId)
                Log($"File.Size = ${tfile.FileSize}"$)
                Log($"File.Path = ${tfile.FilePath}"$)
                Dim furl As String = $"https://api.telegram.org/file/bot${bottoken}/${tfile.FilePath}"$
                Log(furl)
                File.MakeDir(File.DirApp, "photos")
                Dim j As HttpJob
                j.Initialize("",Me)
                j.Download(furl)
                Wait For (j) JobDone(j As HttpJob)
                If j.Success Then
                    Dim out As OutputStream = File.OpenOutput(File.DirApp, tfile.FilePath, False)
                    File.Copy2(j.GetInputStream, out)
                    out.Close '<------ very important
                End If
                j.Release
    
            Next
        End If
    End If
    
    Log($"MessageChat: ${message.Chat}"$)
    Dim chat As Chat = message.Chat
    Log($"ChatFirstName: ${chat.FirstName}"$)
    Log($"ChatFirstName: ${chat.LastName}"$)
    Log($"ChatUserName: ${chat.Username}"$)
    
    If chat.Title <> Null Then
        Log($"ChatTitle: ${chat.Title}"$)
    End If
    Log($"ChatID: ${chat.Id}"$)
    If message.Caption <> Null Then
        Log($"MessageCaption: ${message.Caption}"$)
    End If
    If message.Contact <> Null Then
        Log($"MessageContact: ${message.Contact}"$)
        Dim cont As Contact = message.Contact
        Log($"ContactFirstname: ${cont.FirstName}"$)
        Log($"ContactLastName: ${cont.LastName}"$)
        Log($"ContactPhoneNumber: ${cont.PhoneNumber}"$)
        Log($"ContactUserId: ${cont.UserId}"$)
    End If
    Log($"MessageDate: ${message.Date}"$)
    Dim entitiesList As List = message.Entities
    If entitiesList.IsInitialized And entitiesList.Size > 0 Then
        For i=0 To entitiesList.Size-1
            Dim ent As MessageEntity = entitiesList.Get(i)
            'Log($"Entity.Length = ${ent.Length}"$)
            'Log($"Entity.Offset = ${ent.Offset}"$)
            If ent.Url <> Null Then
                Log($"Entity.URL = ${ent.Url}"$)
            End If
            If ent.User <> Null Then
                Log($"Entity.User = ${ent.User}"$)
            End If
            Log($"Entity.Type = ${ent.Type}"$)
        Next
    End If
    If message.Voice <> Null Then
        Dim voic As Voice = message.Voice
        Log($"Voice.Duration ${voic.Duration}"$)
        Log($"Voice.FileId ${voic.FileId}"$)
        Log($"Voice.Filesize ${voic.FileSize}"$)
        Log($"Voice.MimeType ${voic.MimeType}"$)
    End If
    If message.Video <> Null Then
        Dim vid As Video = message.Video
        Log($"Video.FileId ${vid.FileId}"$)
        Log($"Video.Duration ${vid.Duration}"$)
        Log($"Video Size ${vid.Width}x${vid.Height}"$)
        Log($"Video.MimeType ${vid.MimeType}"$)
        Log($"Video.Filesize ${vid.FileSize}"$)
    End If
    Log($"MessageText: ${message.Text}"$)
    If message.Text <> Null And message.Text <> "null" Then
        If message.Text = "/buttons" Then
            Dim ibld As InlineKeyboardButtonBuilder
            Dim mark As InlineKeyboardMarkup
            
            mark.initialize(ibld.Initialize.newRow.newButton("1").withCallbackData("BTN1").newButton("2").withCallbackData("BTN2").newButton("3").withCallbackData("BTN3").newRow.newButton("Google").withUrl("https://www.google.com").newRow.build)
            Dim buttons As Message = jtb.sendMessage(jtb.byId(from.Id),"Click the Button!","MARKDOWN",False,False,message.MessageId,mark)
            glmap.Put(buttons.MessageId,buttons)
        else If message.Text = "/location" Then
            jtb.sendChatAction(jtb.byId(from.Id),jtb.ChatActionFIND_LOCATION)
            jtb.sendLocation(jtb.byId(from.Id),50.8337006,6.441118,False,message.MessageId,Null)
        else If message.Text = "/url" Then
            jtb.sendMessage(jtb.byId(from.Id),"[jTelegramBot Thread](https://www.b4x.com/android/forum/threads/beta-jtelegrambot-create-your-own-telegram-bot.103821/)","MARKDOWN",False,False,message.MessageId,Null)
        else If message.Text = "/plainurl" Then
            bld.sendMessage(chat.Id,"Link without Preview [jTelegramBot Thread](https://www.b4x.com/android/forum/threads/beta-jtelegrambot-create-your-own-telegram-bot.103821/)",message.MessageId,False,True,Null,jtb.parsemodeMARKDOWN)
        else If message.Text = "/text" Then
            jtb.sendMessage(jtb.byId(from.Id),$"Testtext <b>Bold</b>, <i>Italic</i>
        new row..."$,"HTML",True,False,message.MessageId,Null)
        else If message.Text = "/document" Then
            jtb.sendChatAction(jtb.byId(from.Id),jtb.ChatActionUPLOAD_DOCUMENT)
            jtb.sendDocument(jtb.byId(from.Id),jtb.MediaByFile(File.DirApp,"jtbex.zip"),"DocumentCaption",False,message.MessageId,Null)
        else If message.Text = "/photo" Then
            jtb.sendChatAction(jtb.byId(from.Id),jtb.ChatActionUPLOAD_PHOTO)
            jtb.sendPhoto(jtb.byId(from.Id),jtb.MediaByFile(File.DirApp,"donmanfred.png"),"DocumentCaption",False,message.MessageId,replbld.forceReply)
        else If message.Text = "/audio" Then
            jtb.sendChatAction(jtb.byId(from.Id),jtb.ChatActionUPLOAD_VIDEO)
            'jtb.sendAudio(jtb.byId(from.Id),jtb.MediaByFile(File.DirApp,"EyesOfTheWorld.mp3"),223,"Fleedwood Mac","Eyes of the World",False,message.MessageId,replbld.forceReply)
        else If message.Text = "/sticker" Then
            jtb.sendSticker(jtb.byId(from.Id),jtb.MediaByFile(File.DirApp,"cuppy.webp"),False,message.MessageId,Null)
        else if message.Text = "CloseKB" Then
            Dim hidekb As ReplyKeyboardHide
            hidekb.initialize
            Dim buttons As Message = jtb.sendMessage(jtb.byId(from.Id),"Thank you for using the Keyboard","MARKDOWN",False,False,message.MessageId,hidekb.hideKeyboard)
            '
        else If message.Text = "/replykeyboard" Then
            Log("ReplyKeyboard requested")
            Dim kmark As ReplyKeyboardMarkup
            kmark.initkeyboard(2,3) ' 2 Rows, 3 Columns each
            kmark.SetButton(0,0,"BTN0-0") ' Set Button text for Button at Row 0 and Column 0
            kmark.SetButton(0,1,"BTN0-1")
            kmark.SetButton(0,2,"BTN0-2")
            kmark.SetButton(1,0,"BTN1-0")
            kmark.SetButton(1,1,"BTN1-1")
            kmark.SetButton(1,2,"CloseKB")
            kmark.initialize(kmark.GetKeyboard,True,False,True)
            Dim buttons As Message = jtb.sendMessage(jtb.byId(from.Id),"Yo man","MARKDOWN",False,False,message.MessageId,kmark)
            'glmap.Put(buttons.MessageId,buttons)
        else If message.Text = "/anim" Then
            jtb.sendAnimation(jtb.byId(from.Id),jtb.MediaByFile(File.DirApp,"anim.gif"),5,400,179,jtb.MediaByFile(File.DirApp,"giphy90.jpg"),False,message.MessageId,Null,"Caption...",jtb.parsemodeMARKDOWN)
        else If message.Text = "/start" Then
            jtb.sendMessage(jtb.byId(from.Id),$" Hello ${chat.Username}
    `Command   | Result
    ----------|-------------------------
    /location | Returns a Locationobject
    /document | Returns a Document
    /photo    | Returns a Photo
    /url      | Returns a URL with Preview
    /plainurl | Returns a URL without Preview
    /buttons  | Shows some buttons To Click on
    `
    Thank you For choosing Me :-)"$,"MARKDOWN",False,False,message.MessageId,Null)
        Else
        End If   
    End If
End Sub