diff --git a/CHANGELOG.md b/CHANGELOG.md
index 764591e..62f0a64 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,11 @@
# Restreamer-UI
+#### v1.1.0 > v1.3.1
+
+- Add Owncast to publication services
+- Add Telegram to publication services
+- Fix VAAPI encoder
+
#### v1.0.0 > v1.1.0
- Add compatibility list for encoders
diff --git a/src/views/Publication/Services/Owncast.js b/src/views/Publication/Services/Owncast.js
new file mode 100644
index 0000000..52cad9a
--- /dev/null
+++ b/src/views/Publication/Services/Owncast.js
@@ -0,0 +1,113 @@
+import React from 'react';
+
+import { Trans } from '@lingui/macro';
+import Grid from '@mui/material/Grid';
+import Link from '@mui/material/Link';
+import TextField from '@mui/material/TextField';
+
+import Logo from './logos/owncast.svg';
+
+const id = 'owncast';
+const name = 'Owncast';
+const version = '1.0';
+const stream_key_link = '';
+const description = (
+
+ Transmit your Livestream to an Owncast server.{' '}
+
+ Here {' '}
+
+ you can find more details about the settings.
+
+);
+const image_copyright = Please get in touch with the operator of the service and check what happens.;
+const author = {
+ creator: {
+ name: 'datarhei',
+ link: 'https://github.com/datarhei',
+ },
+ maintainer: {
+ name: 'datarhei',
+ link: 'https://github.com/datarhei',
+ },
+};
+const category = 'software';
+const requires = {
+ protocols: ['rtmps'],
+ formats: ['flv'],
+ codecs: {
+ audio: ['aac', 'mp3'],
+ video: ['h264'],
+ },
+};
+
+function ServiceIcon(props) {
+ return
;
+}
+
+function init(settings) {
+ const initSettings = {
+ protocol: 'rtmp://',
+ server_url: '',
+ stream_key: '',
+ ...settings,
+ };
+
+ return initSettings;
+}
+
+function Service(props) {
+ const settings = init(props.settings);
+
+ const handleChange = (what) => (event) => {
+ const value = event.target.value;
+
+ settings[what] = value;
+
+ const output = createOutput(settings);
+
+ props.onChange([output], settings);
+ };
+
+ const createOutput = (settings) => {
+ const output = {
+ address: settings.protocol + settings.server_url + '/' + settings.stream_key,
+ options: ['-f', 'flv'],
+ };
+
+ return output;
+ };
+
+ return (
+
+
+ Protocol}
+ value={settings.protocol}
+ onChange={handleChange('protocol')}
+ readOnly
+ disabled
+ />
+
+
+ Server URL} value={settings.server_url} onChange={handleChange('server_url')} />
+
+
+ Stream Key} value={settings.stream_key} onChange={handleChange('stream_key')} />
+
+
+ );
+}
+
+Service.defaultProps = {
+ settings: {},
+ skills: {},
+ metadata: {},
+ streams: [],
+ onChange: function (output, settings) {},
+};
+
+export { id, name, version, stream_key_link, description, image_copyright, author, category, requires, ServiceIcon as icon, Service as component };
diff --git a/src/views/Publication/Services/Telegram.js b/src/views/Publication/Services/Telegram.js
new file mode 100644
index 0000000..6b7e721
--- /dev/null
+++ b/src/views/Publication/Services/Telegram.js
@@ -0,0 +1,108 @@
+import React from 'react';
+
+import { Trans } from '@lingui/macro';
+import Grid from '@mui/material/Grid';
+import TextField from '@mui/material/TextField';
+
+import Logo from './logos/telegram.svg';
+
+const id = 'telegram';
+const name = 'Telegram';
+const version = '1.0';
+const stream_key_link = '';
+const description = (
+
+ Transmit a Livestream to a Telegram Channel.
+
+);
+const image_copyright = Please get in touch with the operator of the service and check what happens.;
+const author = {
+ creator: {
+ name: 'datarhei',
+ link: 'https://github.com/datarhei',
+ },
+ maintainer: {
+ name: 'datarhei',
+ link: 'https://github.com/datarhei',
+ },
+};
+const category = 'platform';
+const requires = {
+ protocols: ['rtmps'],
+ formats: ['flv'],
+ codecs: {
+ audio: ['aac', 'mp3'],
+ video: ['h264'],
+ },
+};
+
+function ServiceIcon(props) {
+ return
;
+}
+
+function init(settings) {
+ const initSettings = {
+ protocol: 'rtmps://',
+ stream_url: '',
+ stream_key: '',
+ ...settings,
+ };
+
+ return initSettings;
+}
+
+function Service(props) {
+ const settings = init(props.settings);
+
+ const handleChange = (what) => (event) => {
+ const value = event.target.value;
+
+ settings[what] = value;
+
+ const output = createOutput(settings);
+
+ props.onChange([output], settings);
+ };
+
+ const createOutput = (settings) => {
+ const output = {
+ address: settings.protocol + settings.stream_url + settings.stream_key,
+ options: ['-f', 'flv'],
+ };
+
+ return output;
+ };
+
+ return (
+
+
+ Protocol}
+ value={settings.protocol}
+ onChange={handleChange('protocol')}
+ readOnly
+ disabled
+ />
+
+
+ Server URL} value={settings.stream_url} onChange={handleChange('stream_url')} />
+
+
+ Stream Key} value={settings.stream_key} onChange={handleChange('stream_key')} />
+
+
+ );
+}
+
+Service.defaultProps = {
+ settings: {},
+ skills: {},
+ metadata: {},
+ streams: [],
+ onChange: function (output, settings) {},
+};
+
+export { id, name, version, stream_key_link, description, image_copyright, author, category, requires, ServiceIcon as icon, Service as component };
diff --git a/src/views/Publication/Services/index.js b/src/views/Publication/Services/index.js
index 3b3901b..f451e95 100644
--- a/src/views/Publication/Services/index.js
+++ b/src/views/Publication/Services/index.js
@@ -12,11 +12,13 @@ import * as Image2 from './Image2';
import * as Instagram from './Instagram';
import * as Livespotting from './Livespotting';
import * as MPEGTS from './MPEGTS';
+import * as Owncast from './Owncast';
import * as Red5 from './Red5';
import * as Restream from './Restream';
import * as RTMP from './RTMP';
import * as RTSP from './RTSP';
import * as SRT from './SRT';
+import * as Telegram from './Telegram';
import * as Twitch from './Twitch';
import * as Twitter from './Twitter';
import * as UDP from './UDP';
@@ -62,12 +64,14 @@ registry.Register(Twitch);
registry.Register(Instagram);
registry.Register(Vimeo);
registry.Register(Restream);
+registry.Register(Telegram);
registry.Register(Livespotting);
registry.Register(Brightcove);
registry.Register(Akamai);
registry.Register(DaCast);
registry.Register(CDN77);
registry.Register(Core);
+registry.Register(Owncast);
registry.Register(WOWZA);
registry.Register(Red5);
registry.Register(Icecast);
diff --git a/src/views/Publication/Services/logos/owncast.svg b/src/views/Publication/Services/logos/owncast.svg
new file mode 100644
index 0000000..ead8505
--- /dev/null
+++ b/src/views/Publication/Services/logos/owncast.svg
@@ -0,0 +1 @@
+
diff --git a/src/views/Publication/Services/logos/telegram.svg b/src/views/Publication/Services/logos/telegram.svg
new file mode 100644
index 0000000..fa06cfe
--- /dev/null
+++ b/src/views/Publication/Services/logos/telegram.svg
@@ -0,0 +1 @@
+