diff --git a/PKG-INFO b/PKG-INFO
index 5d3ebdf..a9ca850 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: celery-progress
-Version: 0.1.1
+Version: 0.1.2
 Summary: Drop in, configurable, dependency-free progress bars for your Django/Celery applications.
 Home-page: https://github.com/czue/celery-progress
 Author: Cory Zue
@@ -198,15 +198,23 @@ The `initProgressBar` function takes an optional object of options. The followin
 | onDataError | function to call on a response that's not JSON or has invalid schema due to a programming error | onError |
 | onResult | function to call when returned non empty result | CeleryProgressBar.onResultDefault |
 | barColors | dictionary containing color values for various progress bar states. Colors that are not specified will defer to defaults | barColorsDefault |
+| defaultMessages | dictionary containing default messages that can be overridden | see below |
 
 The `barColors` option allows you to customize the color of each progress bar state by passing a dictionary of key-value pairs of `state: #hexcode`. The defaults are shown below.
 
 | State | Hex Code | Image Color | 
 |-------|----------|:-------------:|
-| success | #76ce60 | ![#76ce60](https://placehold.it/15/76ce60/000000?text=+) |
-| error | #dc4f63 | ![#dc4f63](https://placehold.it/15/dc4f63/000000?text=+) |
-| progress | #68a9ef | ![#68a9ef](https://placehold.it/15/68a9ef/000000?text=+) |
-| ignored | #7a7a7a | ![#7a7a7a](https://placehold.it/15/7a7a7a/000000?text=+) |
+| success | #76ce60 | ![#76ce60](https://via.placeholder.com/15/76ce60/000000?text=+) |
+| error | #dc4f63 | ![#dc4f63](https://via.placeholder.com/15/dc4f63/000000?text=+) |
+| progress | #68a9ef | ![#68a9ef](https://via.placeholder.com/15/68a9ef/000000?text=+) |
+| ignored | #7a7a7a | ![#7a7a7a](https://via.placeholder.com/15/7a7a7a/000000?text=+) |
+
+The `defaultMessages` option allows you to override some default messages in the UI. At the moment these are:
+
+| Message Id | When Shown | Default Value |
+|-------|----------|:-------------:|
+| waiting | Task is waiting to start | 'Waiting for task to start...'
+| started | Task has started but reports no progress | 'Task started...'
 
 # WebSocket Support
 
@@ -220,4 +228,66 @@ To use WebSockets, install with `pip install celery-progress[websockets,redis]`
 
 See `WebSocketProgressRecorder` and `websockets.js` for details.
 
+# Securing the get_progress endpoint
+By default, anyone can see the status and result of any task by accessing `/celery-progress/<task_id>`
+
+To limit access, you need to wrap `get_progress()` in a view of your own which implements the permissions check, and create a new url routing to point to your view.  Make sure to remove any existing (unprotected) celery progress urls from your root urlconf at the same time.
+
+
+For example, requiring login with a class-based view:
+```python
+
+# views.py
+from celery_progress.views import get_progress
+from django.contrib.auth.mixins import LoginRequiredMixin
+from django.views.generic import View
+
+class TaskStatus(LoginRequiredMixin, View):
+    def get(self, request, task_id, *args, **kwargs):
+        # Other checks could go here
+        return get_progress(request, task_id=task_id)
+```
+
+```python
+# urls.py
+from django.urls import path
+from . import views
+
+urlpatterns = [
+    ...
+    path('task-status/<uuid:task_id>', views.TaskStatus.as_view(), name='task_status'),
+    ...
+]
+```
+
+Requiring login with a function-based view:
+```python
+
+# views.py
+from celery_progress.views import get_progress
+from django.contrib.auth.decorators import login_required
+
+@login_required
+def task_status(request, task_id):
+    # Other checks could go here
+    return get_progress(request, task_id)
+```
+
+```python
+# urls.py
+from django.urls import path
+
+from . import views
+
+urlpatterns = [
+    ...
+    path('task-status/<uuid:task_id>', views.task_status, name='task_status'),
+    ...
+]
+```
+
+
+Any links to `'celery_progress:task_status'` will need to be changed to point to your new endpoint.
+
+
 
diff --git a/README.md b/README.md
index c98d00e..48f73d8 100644
--- a/README.md
+++ b/README.md
@@ -168,15 +168,23 @@ The `initProgressBar` function takes an optional object of options. The followin
 | onDataError | function to call on a response that's not JSON or has invalid schema due to a programming error | onError |
 | onResult | function to call when returned non empty result | CeleryProgressBar.onResultDefault |
 | barColors | dictionary containing color values for various progress bar states. Colors that are not specified will defer to defaults | barColorsDefault |
+| defaultMessages | dictionary containing default messages that can be overridden | see below |
 
 The `barColors` option allows you to customize the color of each progress bar state by passing a dictionary of key-value pairs of `state: #hexcode`. The defaults are shown below.
 
 | State | Hex Code | Image Color | 
 |-------|----------|:-------------:|
-| success | #76ce60 | ![#76ce60](https://placehold.it/15/76ce60/000000?text=+) |
-| error | #dc4f63 | ![#dc4f63](https://placehold.it/15/dc4f63/000000?text=+) |
-| progress | #68a9ef | ![#68a9ef](https://placehold.it/15/68a9ef/000000?text=+) |
-| ignored | #7a7a7a | ![#7a7a7a](https://placehold.it/15/7a7a7a/000000?text=+) |
+| success | #76ce60 | ![#76ce60](https://via.placeholder.com/15/76ce60/000000?text=+) |
+| error | #dc4f63 | ![#dc4f63](https://via.placeholder.com/15/dc4f63/000000?text=+) |
+| progress | #68a9ef | ![#68a9ef](https://via.placeholder.com/15/68a9ef/000000?text=+) |
+| ignored | #7a7a7a | ![#7a7a7a](https://via.placeholder.com/15/7a7a7a/000000?text=+) |
+
+The `defaultMessages` option allows you to override some default messages in the UI. At the moment these are:
+
+| Message Id | When Shown | Default Value |
+|-------|----------|:-------------:|
+| waiting | Task is waiting to start | 'Waiting for task to start...'
+| started | Task has started but reports no progress | 'Task started...'
 
 # WebSocket Support
 
@@ -189,3 +197,65 @@ To use WebSockets, install with `pip install celery-progress[websockets,redis]`
 `pip install celery-progress[websockets,rabbitmq]` (depending on broker dependencies).
 
 See `WebSocketProgressRecorder` and `websockets.js` for details.
+
+# Securing the get_progress endpoint
+By default, anyone can see the status and result of any task by accessing `/celery-progress/<task_id>`
+
+To limit access, you need to wrap `get_progress()` in a view of your own which implements the permissions check, and create a new url routing to point to your view.  Make sure to remove any existing (unprotected) celery progress urls from your root urlconf at the same time.
+
+
+For example, requiring login with a class-based view:
+```python
+
+# views.py
+from celery_progress.views import get_progress
+from django.contrib.auth.mixins import LoginRequiredMixin
+from django.views.generic import View
+
+class TaskStatus(LoginRequiredMixin, View):
+    def get(self, request, task_id, *args, **kwargs):
+        # Other checks could go here
+        return get_progress(request, task_id=task_id)
+```
+
+```python
+# urls.py
+from django.urls import path
+from . import views
+
+urlpatterns = [
+    ...
+    path('task-status/<uuid:task_id>', views.TaskStatus.as_view(), name='task_status'),
+    ...
+]
+```
+
+Requiring login with a function-based view:
+```python
+
+# views.py
+from celery_progress.views import get_progress
+from django.contrib.auth.decorators import login_required
+
+@login_required
+def task_status(request, task_id):
+    # Other checks could go here
+    return get_progress(request, task_id)
+```
+
+```python
+# urls.py
+from django.urls import path
+
+from . import views
+
+urlpatterns = [
+    ...
+    path('task-status/<uuid:task_id>', views.task_status, name='task_status'),
+    ...
+]
+```
+
+
+Any links to `'celery_progress:task_status'` will need to be changed to point to your new endpoint.
+
diff --git a/celery_progress.egg-info/PKG-INFO b/celery_progress.egg-info/PKG-INFO
index 5d3ebdf..a9ca850 100644
--- a/celery_progress.egg-info/PKG-INFO
+++ b/celery_progress.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: celery-progress
-Version: 0.1.1
+Version: 0.1.2
 Summary: Drop in, configurable, dependency-free progress bars for your Django/Celery applications.
 Home-page: https://github.com/czue/celery-progress
 Author: Cory Zue
@@ -198,15 +198,23 @@ The `initProgressBar` function takes an optional object of options. The followin
 | onDataError | function to call on a response that's not JSON or has invalid schema due to a programming error | onError |
 | onResult | function to call when returned non empty result | CeleryProgressBar.onResultDefault |
 | barColors | dictionary containing color values for various progress bar states. Colors that are not specified will defer to defaults | barColorsDefault |
+| defaultMessages | dictionary containing default messages that can be overridden | see below |
 
 The `barColors` option allows you to customize the color of each progress bar state by passing a dictionary of key-value pairs of `state: #hexcode`. The defaults are shown below.
 
 | State | Hex Code | Image Color | 
 |-------|----------|:-------------:|
-| success | #76ce60 | ![#76ce60](https://placehold.it/15/76ce60/000000?text=+) |
-| error | #dc4f63 | ![#dc4f63](https://placehold.it/15/dc4f63/000000?text=+) |
-| progress | #68a9ef | ![#68a9ef](https://placehold.it/15/68a9ef/000000?text=+) |
-| ignored | #7a7a7a | ![#7a7a7a](https://placehold.it/15/7a7a7a/000000?text=+) |
+| success | #76ce60 | ![#76ce60](https://via.placeholder.com/15/76ce60/000000?text=+) |
+| error | #dc4f63 | ![#dc4f63](https://via.placeholder.com/15/dc4f63/000000?text=+) |
+| progress | #68a9ef | ![#68a9ef](https://via.placeholder.com/15/68a9ef/000000?text=+) |
+| ignored | #7a7a7a | ![#7a7a7a](https://via.placeholder.com/15/7a7a7a/000000?text=+) |
+
+The `defaultMessages` option allows you to override some default messages in the UI. At the moment these are:
+
+| Message Id | When Shown | Default Value |
+|-------|----------|:-------------:|
+| waiting | Task is waiting to start | 'Waiting for task to start...'
+| started | Task has started but reports no progress | 'Task started...'
 
 # WebSocket Support
 
@@ -220,4 +228,66 @@ To use WebSockets, install with `pip install celery-progress[websockets,redis]`
 
 See `WebSocketProgressRecorder` and `websockets.js` for details.
 
+# Securing the get_progress endpoint
+By default, anyone can see the status and result of any task by accessing `/celery-progress/<task_id>`
+
+To limit access, you need to wrap `get_progress()` in a view of your own which implements the permissions check, and create a new url routing to point to your view.  Make sure to remove any existing (unprotected) celery progress urls from your root urlconf at the same time.
+
+
+For example, requiring login with a class-based view:
+```python
+
+# views.py
+from celery_progress.views import get_progress
+from django.contrib.auth.mixins import LoginRequiredMixin
+from django.views.generic import View
+
+class TaskStatus(LoginRequiredMixin, View):
+    def get(self, request, task_id, *args, **kwargs):
+        # Other checks could go here
+        return get_progress(request, task_id=task_id)
+```
+
+```python
+# urls.py
+from django.urls import path
+from . import views
+
+urlpatterns = [
+    ...
+    path('task-status/<uuid:task_id>', views.TaskStatus.as_view(), name='task_status'),
+    ...
+]
+```
+
+Requiring login with a function-based view:
+```python
+
+# views.py
+from celery_progress.views import get_progress
+from django.contrib.auth.decorators import login_required
+
+@login_required
+def task_status(request, task_id):
+    # Other checks could go here
+    return get_progress(request, task_id)
+```
+
+```python
+# urls.py
+from django.urls import path
+
+from . import views
+
+urlpatterns = [
+    ...
+    path('task-status/<uuid:task_id>', views.task_status, name='task_status'),
+    ...
+]
+```
+
+
+Any links to `'celery_progress:task_status'` will need to be changed to point to your new endpoint.
+
+
 
diff --git a/celery_progress/backend.py b/celery_progress/backend.py
index bf3cbd1..9cc1fbe 100644
--- a/celery_progress/backend.py
+++ b/celery_progress/backend.py
@@ -60,56 +60,59 @@ class Progress(object):
         self.result = result
 
     def get_info(self):
-        response = {'state': self.result.state}
-        if self.result.state in ['SUCCESS', 'FAILURE']:
+        task_meta = self.result._get_task_meta()
+        state = task_meta["status"]
+        info = task_meta["result"]
+        response = {'state': state}
+        if state in ['SUCCESS', 'FAILURE']:
             success = self.result.successful()
             with allow_join_result():
                 response.update({
                     'complete': True,
                     'success': success,
                     'progress': _get_completed_progress(),
-                    'result': self.result.get(self.result.id) if success else str(self.result.info),
+                    'result': self.result.get(self.result.id) if success else str(info),
                 })
-        elif self.result.state in ['RETRY', 'REVOKED']:
-            if self.result.state == 'RETRY':
-                retry = self.result.info
+        elif state in ['RETRY', 'REVOKED']:
+            if state == 'RETRY':
+                retry = info
                 when = str(retry.when) if isinstance(retry.when, datetime.datetime) else str(
                         datetime.datetime.now() + datetime.timedelta(seconds=retry.when))
                 result = {'when': when, 'message': retry.message or str(retry.exc)}
             else:
-                result = 'Task ' + str(self.result.info)
+                result = 'Task ' + str(info)
             response.update({
                 'complete': True,
                 'success': False,
                 'progress': _get_completed_progress(),
                 'result': result,
             })
-        elif self.result.state == 'IGNORED':
+        elif state == 'IGNORED':
             response.update({
                 'complete': True,
                 'success': None,
                 'progress': _get_completed_progress(),
-                'result': str(self.result.info)
+                'result': str(info)
             })
-        elif self.result.state == PROGRESS_STATE:
+        elif state == PROGRESS_STATE:
             response.update({
                 'complete': False,
                 'success': None,
-                'progress': self.result.info,
+                'progress': info,
             })
-        elif self.result.state in ['PENDING', 'STARTED']:
+        elif state in ['PENDING', 'STARTED']:
             response.update({
                 'complete': False,
                 'success': None,
-                'progress': _get_unknown_progress(self.result.state),
+                'progress': _get_unknown_progress(state),
             })
         else:
-            logger.error('Task %s has unknown state %s with metadata %s', self.result.id, self.result.state, self.result.info)
+            logger.error('Task %s has unknown state %s with metadata %s', self.result.id, state, info)
             response.update({
                 'complete': True,
                 'success': False,
-                'progress': _get_unknown_progress(self.result.state),
-                'result': 'Unknown state {}'.format(self.result.state),
+                'progress': _get_unknown_progress(state),
+                'result': 'Unknown state {}'.format(state),
             })
         return response
 
diff --git a/celery_progress/static/celery_progress/celery_progress.js b/celery_progress/static/celery_progress/celery_progress.js
index 4fa178c..0a93845 100644
--- a/celery_progress/static/celery_progress/celery_progress.js
+++ b/celery_progress/static/celery_progress/celery_progress.js
@@ -29,12 +29,22 @@ class CeleryProgressBar {
             ignored: '#7a7a7a'
         }
         this.barColors = Object.assign({}, barColorsDefault, options.barColors);
+
+        let defaultMessages = {
+            waiting: 'Waiting for task to start...',
+            started: 'Task started...',
+        }
+        this.messages = Object.assign({}, defaultMessages, options.defaultMessages);
     }
 
     onSuccessDefault(progressBarElement, progressBarMessageElement, result) {
         result = this.getMessageDetails(result);
-        progressBarElement.style.backgroundColor = this.barColors.success;
-        progressBarMessageElement.textContent = "Success! " + result;
+        if (progressBarElement) {
+            progressBarElement.style.backgroundColor = this.barColors.success;
+        }
+        if (progressBarMessageElement) {
+            progressBarMessageElement.textContent = "Success! " + result;
+        }
     }
 
     onResultDefault(resultElement, result) {
@@ -75,9 +85,9 @@ class CeleryProgressBar {
         var description = progress.description || "";
         if (progress.current == 0) {
             if (progress.pending === true) {
-                progressBarMessageElement.textContent = 'Waiting for task to start...';
+                progressBarMessageElement.textContent = this.messages.waiting;
             } else {
-                progressBarMessageElement.textContent = 'Task started...';
+                progressBarMessageElement.textContent = this.messages.started;
             }
         } else {
             progressBarMessageElement.textContent = progress.current + ' of ' + progress.total + ' processed. ' + description;
diff --git a/setup.py b/setup.py
index eb0f101..6bb2d3e 100644
--- a/setup.py
+++ b/setup.py
@@ -13,7 +13,7 @@ os.chdir(os.path.normpath(os.path.join(os.path.abspath(__file__), os.pardir)))
 
 setup(
     name='celery-progress',
-    version='0.1.1',
+    version='0.1.2',
     packages=find_packages(),
     include_package_data=True,
     license='MIT License',